注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
plabgh的个人空间 https://home.eeworld.com.cn/space-uid-359283.html [收藏] [复制] [分享] [RSS]
日志

请教:ucos执行中断程序时的任务现场保护问题!

已有 2281 次阅读2012-6-5 13:54

我用的是uc/os-v2.52...
中断机制如下:

Void ISP_Function( void )

{

保存全部的CPU寄存器;

调用OSIntEnter()OSIntNesting++

If(OSIntNesting == 1 )

{

OSTCBCur->OSTCBStkPtr= SP ;

}

清中断源;

重新打开中断;

执行用户代码做中断服务;

调用OSIntExit()

恢复所有CPU寄存器;

执行中断返回指令;

}

 

我注意到,在节拍中断函数OSTickISR( )里面用汇编写下了这段代码:OSTCBCur->OSTCBStkPtr= SP (将堆栈指针放入任务控制块内)

我现在不太明白:

1.对于咱们写的中断函数里面,这段代码OSTCBCur->OSTCBStkPtr= SP是在哪里实现的?要是不执行这段代码,恢复现场的时候上哪找原来任务的堆栈指针去?

2.同时进入中断函数以后,保存全部的CPU寄存器、清中断源和重新打开中断,这两个步骤的代码是编译器替你完成的,还是需要你自己写的?

 

比如我写的中断函数如下:

void  uart0Isr (void)         //串行口0中断处理函数

{

INT8U  i ;

OSIntEnter( ) ;

for(i=0; i<8; i++)

{

 U0THR=a[i++] ;

}

OSSemPost(sem) ;

OSIntExit( ) ;

}

针对上面的中断函数,我想请教一下:

1.何时由哪段代码进行了保存全部的CPU寄存器的操作?

2.何时进行了OSTCBCur->OSTCBStkPtr= SP的操作?或者任务运行时,SP在中断发生时是如何被保存到任务控制块(OS_TCB)内的?如果不保存,如何进行现场恢复?

3.清中断源和重新打开中断的操作,是人为执行的,还是硬件完成的?如果是人为执行的,是不是在我的中断函数里面需要手动清中断源和开中断?
4.
进入中断的时候是不是硬件自动关中断?如果不是,为什么需要在后面开中断?谢谢...

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章