Atmega128上移植ucos后的中断向量处理
Atmega128上移植ucos后,关于中断向量的处理,拿作为系统时钟的定时器0(CTC模式)中断为例:Timer0的CTC中断向量号是16。
1.在Micrium网站上提供的实例代码中,在一个汇编文件中(app_vect.s)作如下处理
.area OSTickISR_Vector(abs)
.org 16*4
JMP _OSTickISR
END
2. 而在本网站上一个网友是这么说的:
其实真的比较简单,就是编中断向量表
.area vector(abs)
.org 2 ;中断向量地址=(中断向量号-1)×2
jmp _int0_isr
3. ICCAVR自动生成的:
#pragma interrupt_handler OSTickISR:16
这3种方法试了之后,都可以正确运行。不知道哪个才是正确的,或者3个都正确? 请问楼主,第一段代码中有位指令
.org 16*4
其中的16*4是怎么确定的?我移植的ucos中有相同的vectors.s文件,而os_cpu_a.s中使用的是Timer1,我实验过了,可以运行;如果把16*4改写成$0040也是可以的,最小可以是$0038,但是这些都和ATmega128的datasheet中提供的Timer1溢出中断向量地址不一样。
请高手指点! 实验了楼主的第2种方法,采用Timer1产生时间节拍,溢出中断号为15,vectors.s的相关代码如下:
.area OSTickISR_Vector(abs)
.org28
JMP _OSTickISR
实验结果是不能工作。必须将org后面的地址改为56,即(15-1)*4才能工作。为什么是*4而不是*2? 原来是字和字节的关系,datasheet的中断向量地址是字(16位)地址。 小弟看到一个示例中的处理方式为
在test.c中
#pragma interrupt_handler OSTickISR:5
在os_cpu_c.s文件中编写
_OSTickISR::
方式实现的 Mark,很有用。谢谢 LZ和LS Mark,很有用。谢谢 LZ和LS
页:
[1]