jinleize 发表于 2007-10-17 16:22:31

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个都正确?

phoehu 发表于 2008-4-25 12:00:35

请问楼主,第一段代码中有位指令
      .org   16*4
其中的16*4是怎么确定的?我移植的ucos中有相同的vectors.s文件,而os_cpu_a.s中使用的是Timer1,我实验过了,可以运行;如果把16*4改写成$0040也是可以的,最小可以是$0038,但是这些都和ATmega128的datasheet中提供的Timer1溢出中断向量地址不一样。
    请高手指点!

phoehu 发表于 2008-4-28 15:12:11

实验了楼主的第2种方法,采用Timer1产生时间节拍,溢出中断号为15,vectors.s的相关代码如下:
   .area   OSTickISR_Vector(abs)
   .org28
   JMP   _OSTickISR
实验结果是不能工作。必须将org后面的地址改为56,即(15-1)*4才能工作。为什么是*4而不是*2?

phoehu 发表于 2008-4-29 15:32:37

原来是字和字节的关系,datasheet的中断向量地址是字(16位)地址。

xingdajing 发表于 2008-5-3 20:01:52

小弟看到一个示例中的处理方式为
在test.c中
#pragma interrupt_handler OSTickISR:5
在os_cpu_c.s文件中编写
   _OSTickISR::

方式实现的

xyq4513 发表于 2009-7-31 11:16:58

Mark,很有用。谢谢 LZ和LS

xyq4513 发表于 2009-7-31 11:17:25

Mark,很有用。谢谢 LZ和LS
页: [1]
查看完整版本: Atmega128上移植ucos后的中断向量处理