wince6.0串口中断问题

nyp860624 2011-09-09 11:43:59
在wince6.0中物理中断号(IRQ)是由硬件决定的由注册表写入,初始化过程中系统会为每个物理中断号分配一个系统中断号(Sysintr),与串口事件进行绑定的是系统中断号。事件发生以后,根据与其绑定的系统中断号来调用相应的中断处理函数。
这个是我个人理解的,不知道对否?
现在我用一个pci卡扩展出来了两个串口假设串口号分别为com3和com4,两个串口共用的同一个物理中断号,这样的话系统不就只会分配一个系统中断号了,
在事件发生以后,事件只会根据与其绑定的系统中断号来进行中断处理,那系统如何判断是com3还是com4发生的事件呢?
...全文
239 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
demoxie1 2011-09-15
  • 打赏
  • 举报
回复
楼主你用的是IOBASE还是MEMBASE?用MEMBASE的话在init的时候是通不过的。你的是不是这样?用IOBASE就可以
demoxie1 2011-09-15
  • 打赏
  • 举报
回复
恩,只能用IOBASE,
nyp860624 2011-09-15
  • 打赏
  • 举报
回复
我用的是iobase,x86架构应该哟个iobase的嘛。我现在初始化是没有问题的,但是每次一产生硬件中断,就会卡死
[Quote=引用 11 楼 demoxie1 的回复:]

楼主你用的是IOBASE还是MEMBASE?用MEMBASE的话在init的时候是通不过的。你的是不是这样?用IOBASE就可以
[/Quote]
小小白桦树 2011-09-14
  • 打赏
  • 举报
回复
我的是isa扩展的cpld 6 串口,有机会交流下 QQ 317869171[Quote=引用 9 楼 nyp860624 的回复:]
现在我也还没搞明白是怎么一回事呢,我的是一产生硬件中断就卡死,串口输出信息显示中断就没有传到驱动层里来,我感觉是我的irq和sysintr没有映射好,我在init函数里面添加了kernelioonctrol函数还是不行。你现在也在做pci转串口的驱动吗?我们可以讨论下相互学习学习

引用 7 楼 chenkui456 的回复:

楼主我最近也在调这个问题,和你的情况一样,我个串口共享一个中……
[/Quote]
nyp860624 2011-09-14
  • 打赏
  • 举报
回复
现在我也还没搞明白是怎么一回事呢,我的是一产生硬件中断就卡死,串口输出信息显示中断就没有传到驱动层里来,我感觉是我的irq和sysintr没有映射好,我在init函数里面添加了kernelioonctrol函数还是不行。你现在也在做pci转串口的驱动吗?我们可以讨论下相互学习学习
[Quote=引用 7 楼 chenkui456 的回复:]

楼主我最近也在调这个问题,和你的情况一样,我个串口共享一个中断,可以open,但是发送就卡死
[/Quote]
小小白桦树 2011-09-13
  • 打赏
  • 举报
回复
楼主我最近也在调这个问题,和你的情况一样,我个串口共享一个中断,可以open,但是发送就卡死
demoxie1 2011-09-13
  • 打赏
  • 举报
回复
每个设备的驱动是不一样的。
在16550中,你需要定义sysintr&irq在你的注册表中。(这来sysintr的值没有意义)
但实际的sysintr需要在你的pdd16550.cpp的init中用kernelioonctrol函数来对sysintr动态赋值,
woshi_ziyu 2011-09-10
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nyp860624 的回复:]

iobase和irq我可以在从硬件上查询到,目前我使用的驱动是移植的系统自带的com16550,我看它com口的sysintr和irq都在注册表中写入了,这样的话他在驱动中就没有再使用kernelIocontrol函数来进行irq和sysintr的映射了。而我pci转串口的驱动的注册表中我只写入了irq项没有sysintr,驱动应该是给我自动分配的sysintr的,这样的话我是不是在init的时……
[/Quote]
应该要进行映射吧
AndyZhang 2011-09-09
  • 打赏
  • 举报
回复
那只是逻辑编号,具体的分别还是在硬件上,肯定能分别出来。看看中断那一块8259A里面有这样的例子
nyp860624 2011-09-09
  • 打赏
  • 举报
回复
iobase和irq我可以在从硬件上查询到,目前我使用的驱动是移植的系统自带的com16550,我看它com口的sysintr和irq都在注册表中写入了,这样的话他在驱动中就没有再使用kernelIocontrol函数来进行irq和sysintr的映射了。而我pci转串口的驱动的注册表中我只写入了irq项没有sysintr,驱动应该是给我自动分配的sysintr的,这样的话我是不是在init的时候必须要调用一次kernelIocontrol函数来对其两个进行映射呢?(分配的sysintr我已经可以查询到了,不知道系统会不会在给我irq分配sysintr的时候自动对其两个建立映射关系呢)
现在我的驱动对串口的初始化已经ok,串口也可以open,但是一发送数据或者接受到数据就出现死机状态,用串口调试输出调试信息发现串口发送的时候,其实发送的内容已经发出去了,就是在发送结束的时候进行一次IER寄存器第二位的使能,会引起一次硬件中断,中断过程中底层的中断服务例程(ISR)没有返回。所以我现在怀疑是不是我的irq与sysintr的映射关系没有建立,导致底层的中断服务例程不知道返回给谁呢?
[Quote=引用 4 楼 demoxie1 的回复:]

你的想法是可以实现的,是在注册表中把iobase和irq定义在一起的。不过你的中断和地址是由你的硬件来决定的。sysintr则可以由你来设定,或自动获取。
[/Quote]
demoxie1 2011-09-09
  • 打赏
  • 举报
回复
你的想法是可以实现的,是在注册表中把iobase和irq定义在一起的。不过你的中断和地址是由你的硬件来决定的。sysintr则可以由你来设定,或自动获取。
nyp860624 2011-09-09
  • 打赏
  • 举报
回复
能否告诉一下具体的例程的文件夹啊,小弟一新手,好多东西都还不懂呢
我个人的理解是这样的:
在为pci的物理中断号(irq)分配系统中断号(sysintr)的时候能否再对端口的iobase进行一次检测,为不同的端口iobase分配不同的系统中断号,这样的话两个com口就可以获得不同的sysintr了。不知道我的这种想法可行?
还有问一下系统中断号和逻辑中断号应该都是指sysintr的吧?

[Quote=引用 1 楼 zhang20072844 的回复:]

那只是逻辑编号,具体的分别还是在硬件上,肯定能分别出来。看看中断那一块8259A里面有这样的例子
[/Quote]
叶落寒山 2011-09-09
  • 打赏
  • 举报
回复
COM3和COM4不会共有一个物理中断的,所以lz所假设的情况不存在

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧