天嵌 ARM开发社区

 找回密码
 注册
查看: 6020|回复: 7

ucos中断保护问题

[复制链接]
dfdfghgh 发表于 2012-4-16 19:23:48 | 显示全部楼层 |阅读模式
Timer.c中设置OSTickISR为定时中断函数,但是并没使用__irq 关键字
void ISRInit(void)
{
// 设置中断控制器
rPRIORITY = 0x00000000;  // 使用默认的固定的优先级
rINTMOD = 0x00000000;  // 所有中断均为IRQ中断
pISR_TIMER0= (uint32) OSTickISR;
rINTMSK &= ~(1<<10);   // 打开TIMER0中断允许
IntCnt=0;
}

CPU产生定时器中断后直接跳转到位于Os_cpu_a.s中的OSTickISR处
但是OSTickISR并没有保护寄存器 只保存了程序指针  不知道是为什么???  
是我分析的程序流程不对???
其实中断处理先转到其他的地方了????


OSTickISR
MOV     R5,LR    ;将返回地址保存(LR->R5)
MOV  R1, #1
MOV  R1, R1, LSL #10  ; Timer0 Source Pending Reg.将R1左移10位送入R1
LDR  R0, =SRCPND   
LDR     R2, [R0]   ;读SRCPND内容送入R2
ORR     R1, R1,R2   ;(R1|R2)->R1
STR  R1, [R0]   ;将R1送入SRCPND
LDR  R0, =INTPND   ;将INTPND地址送入R0
LDR  R1, [R0]   ;读INTPND内容     //此处读出再送回???
STR  R1, [R0]   ;读出的内容送回到INTPND?

;----------------------------------------------------------------------------------  
; OSTimeTick();
;----------------------------------------------------------------------------------
BL  OSTimeTick  
MOV    PC, R5          ; Return
 楼主| dfdfghgh 发表于 2012-4-17 06:39:36 | 显示全部楼层
肿么回事啊?木有淫啊
 楼主| dfdfghgh 发表于 2012-4-17 09:48:59 | 显示全部楼层
有木有人指导一下啊?
connortao 发表于 2012-4-17 10:08:27 | 显示全部楼层
dfdfghgh 发表于 2012-4-17 09:48
有木有人指导一下啊?

你到2440init.s去看看,有如下代码:
          ; Setup IRQ handler
        ldr        r0,=HandleIRQ       ;This routine is needed
        ;ldr        r1,=IsrIRQ          ;if there is not 'subs pc,lr,#4' at 0x18, 0x1c
        ldr        r1, =OS_CPU_IRQ_ISR ;for ucos
        str        r1,[r0]
这里是把OS_CPU_IRQ_ISR 这个函数的入口地址放在中断向量表的IRQ中断的入口处。中断时,先跳到HandlerIRQ,然后跳到 OS_CPU_IRQ_ISR 这个函数,然后在这个函数里,会调用你写的中断历程(包括OSTickISR)。在OS_CPU_IRQ_ISR 这个函数里,已经做好了堆栈处理和一些中断嵌套处理等等,所以OSTickISR只需要保存程序指针。其实它只是一个普通函数被调用。
connortao 发表于 2012-4-17 10:10:25 | 显示全部楼层
忘了说,上面的代码中,IsrIRQ这个函数是裸机时的OS_CPU_IRQ_ISR 版本。其实,这两个函数都得在其内部都要调用你写的中断服务例程。
 楼主| dfdfghgh 发表于 2012-4-17 11:57:33 | 显示全部楼层
3Q了  大概懂了...  中断时不是进入timer的isr而是irq的isr... 我再继续研究研究...
亚瑟王 发表于 2012-4-18 17:12:04 | 显示全部楼层
dfdfghgh 发表于 2012-4-17 11:57
3Q了  大概懂了...  中断时不是进入timer的isr而是irq的isr... 我再继续研究研究...

亲,研究明白了写个文档放到论坛上吧,到时候给我发个信息,我给你加精。
 楼主| dfdfghgh 发表于 2012-4-26 19:38:39 | 显示全部楼层
亚瑟王 发表于 2012-4-18 17:12
亲,研究明白了写个文档放到论坛上吧,到时候给我发个信息,我给你加精。

貌似不用写长篇大论的   一句话的事   是我没分析对程序走向

其实这是个常识问题  ARM产生IRQ中断后并不是马上跳转到类似int0或者timer0之类的中断程序
而是跳转到IRQ的服务程序 然后应该是在IRQ的服务程序中进行中断源查询
就我的这个问题而言 保护现场是在IRQ的服务程序中完成的 所以timer的中断程序并没有将寄存器压栈等操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-4-26 21:24 , Processed in 1.062500 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表