阅读:2096回复:28
关于修改OAL--给分的 (wxl_50685330请进)
我想把我的ISR放在OAL层, 我是这么做的:
(1)修改%_WINCEROOT%\Public\common\oak\csp\i486\oal下面的fwpc.c,在其中增加我自定义的ISR,并在InitPIC函数中与指定的中断号相关联。 (2)在上面目录下,利用命令行编译生成i486oal.lib(确实生成了) 请问大侠: 是不是这样做就可以了?以后创建的工程都会使用更新后的i486oal.lib? [编辑 - 12/9/04 by wwei_wang] |
|
|
沙发#
发布于:2004-12-09 10:35
(续)
wxl_50685330大哥,我有几个问题不太明白,请耐心你听我罗嗦几句 :P: (1)关于函数PeRPISR().从代码可以看出它负责在ISR列表中定位对应的ISR来执行。可不可以这么理解:在所 有的中断被真正处理之前,内核都要先调用PeRPISR()函数?我说的是对所有的中断。 (2)在函数InitPIC()中,有 /* Setup the PeRP interrupt handler and enable the PeRP interrupt in the BasePSR */ for (i = 64; i < 80; i++) HookInterrupt(i, (void *)PeRPISR); 这里,应该是初始化16个中断服务例程吧?但是变量i为什么是从64开始,一直到80? (3)我是通过下列代码把中断9和我的ISR相连的 /* Setup the PeRP interrupt handler and enable the PeRP interrupt in the BasePSR */ for (i = 64; i < 80; i++) HookInterrupt(i, (void *)PeRPISR); HookInterrupt(9, myisr); // 我的isr. 这么做有问题吗?这里应该是9还是73?(64+9=73) 请wxl_50685330以及其他各位大虾指点迷津,谢谢! |
|
|
板凳#
发布于:2004-12-09 16:28
谢谢wxl_50685330大哥的鼎力相助,小弟真是感激涕零啊。
你的解答我还没来得及仔细研究,奉上10分先,请大哥笑纳! :P :P :D |
|
|
地板#
发布于:2004-12-09 16:44
谢谢wxl_50685330大哥的解答,有一点小弟还是不太明白,你就帮人帮到底吧:
:P (1)前面你说“你的中断号...如果是你自己假定的也可以随便安排,只要不和bios冲突就行”,这是什么意思?自己假定?随便安排?还请大哥明示。 (2)怎么用int n来产生一个硬件中断?在哪里调用啊? 是在应用中利用汇编调用它吗?:D (3)你是如何使用HookInterrupt()函数的?假设要将硬件中断号9与自定义的ISR相关联,你是在哪里定义ISR的?又是在哪里调用HookInterrupt()的?如何调用的?请大哥给出代码示例,小弟不胜感激。 好像我的问题是挺多,不过还是希望大哥不嫌小弟罗嗦啊,耐心解答哈哈:) [编辑 - 12/10/04 by wwei_wang] |
|
|
地下室#
发布于:2004-12-10 16:42
经wxl_50685330大哥一番讲解,小弟真是豁然开朗啊,哈哈
对了大哥,你前面说: “1.如果你想模拟一个中断,你可以自己指定一个值(比如就是9吧),并在中断向量表中相应位置(偏移9*4)指定你的isr的入口地址,在需要模拟中断时用int 9(x86汇编指令)来调用isr,当然如果是硬件中断也这么做” 问题: (1)你说的方法在DOS下我知道如何实现。 (2)在CE下,执行Initpic中hookinterrupt(73,UrISR);之后,是不是就等价于将UrISR的入口地址放到中断向量表中9号中断对应的位置了?这样的话我就可以用汇编指令int 9 来触发硬件中断,对吗?如果我的理解不对,还请你不吝赐教 :P |
|
|
5楼#
发布于:2004-12-10 18:20
谢谢wxl_50685330大哥指点!我去试试,我会把结果告诉你的。
对了大哥,我哪能跟你比啊,我说话只是一小片一小片的,你说话才是一大片一大片di :P :P :P 另外,刚才那个兄弟照过我了,他的板子是ARM架构的,我给了他一些建议,不知对他是否有帮助 :cool: |
|
|
6楼#
发布于:2004-12-13 15:27
岂敢岂敢 :P :P :P :P
|
|
|
7楼#
发布于:2004-12-14 10:08
wxl_50685330大哥,问题还是没有解决啊,你再帮我看看吧:)))
我想利用汇编指令int 9来触发硬件中断9,我是这么做的: 运行平台是:PB的Emulator 我修改了OemIocontrol,并添加了相应代码,与触发中断相关的主要代码如下: 。。。 BOOL ret = TRUE; __try { _asm { int 9 } } __except (EXCEPTION_EXECUTE_HANDLER) { ret = FALSE; } 。。。 我重新编译了(先clean,然后rebuild platform)。然后在应用中调用KernelIocontrol,当代码执行到int 9时,产生例外,每次都是这样。不知为何?究竟如何模拟硬件中断还请大哥多多指点! :P :P |
|
|
8楼#
发布于:2004-12-14 13:39
真是英雄难过美人关啊,唉,看样子有人要小心了 :P :P :P :P
多谢大哥指点,我再试试先!! :cool: [编辑 - 12/14/04 by wwei_wang] |
|
|
9楼#
发布于:2004-12-14 14:02
你是得小心点,不过还有一个人得要小心你了,哈哈哈哈
|
|
|
10楼#
发布于:2004-12-14 15:15
wxl_50685330大哥啊,革命还没有成功,兄弟正在努力:))
相关代码如下: _asm { int 73 } 大哥再帮我分析一下,这到底是咋回事儿呢?它为啥就不听话呢? 如果你有时间能帮兄弟试一下,那就更好了 :P :P :P 真是劳我“民”伤你的“才”啊,哈哈哈 [编辑 - 12/14/04 by wwei_wang] |
|
|
11楼#
发布于:2004-12-15 09:39
wxl_50685330大哥你怎么还不来啊?小弟简直是望眼欲穿哪 :P :P
[编辑 - 12/15/04 by wwei_wang] |
|
|
12楼#
发布于:2004-12-16 18:47
大哥你终于来了,兄弟我眼睛都蓝了:)))
(1)ISR我是用LoadIntChainHandler函数挂的,肯定挂上了,而且isr能进去。:)因为我曾经用一个共享irq测过。但现在我要驱动的硬件还没有做好。 (2)我在OEMIoControl里面单步执行到int 9 或 int 73 时都产生异常。 (3)“在用户模式不能直接进中断服务,保护模式的有些麻烦喔,有兴趣可以查查,用中断门”。大哥,在保护模式下模拟硬件中断是否可行? (4)悄悄地问一个很菜的问题,“中断门”是什么东东?怎么操作啊?还请大哥明示。 (5)另外前面你说“要不你就直接用硬件中断来触发试试”,何意? 我的妈呀,问了这么多问题啊,真是太罗嗦了,我都无法原谅我自己:))) 大哥,请你原谅我的死缠烂打P :P :P :P :P。 |
|
|
13楼#
发布于:2004-12-27 09:39
谢谢大哥的指点,看样子,小弟已经把大哥成功地引上了歧途! :P
|
|
|