6762|3

5

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

请教:ucos执行中断程序时的任务现场保护问题! [复制链接]

 

我用的是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.
进入中断的时候是不是硬件自动关中断?如果不是,为什么需要在后面开中断?谢谢...

最新回复

帖子的格式写的很工整啊~~~ 1、OSTCBCur->OSTCBStkPtr= SP是在OSIntExit()中实现的。在OSIntExit()中会判断有没有比当前任务优先级更高的任务处于就绪态,如果有的话,就会进行任务调度,就会执行OSTCBCur->OSTCBStkPtr= SP这句话来保存当前任务的堆栈指针;如果没有的话,那么就会返回原来的任务,也就不会执行OSTCBCur->OSTCBStkPtr= SP这句话。 2、C语言写的ISR函数,保存PC值和CPU状态寄存器(PSW)是由编译器自动完成的。至于保存CPU相关的通用寄存器可能需要自己编写汇编代码,这就是为什么上下文切换函数OSCtxSw()和OSIntCtxSw()要用汇编代码写的原因。  清中断源和重新打开中断这个操作应该是由用户自己写。 这是我的理解哈。  详情 回复 发表于 2012-6-6 20:19
点赞 关注
 

回复
举报

104

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

回复 楼主 plabgh 的帖子

1 函数调用的时候,自动入堆栈
2 这个操作,在切换任务的最后面的汇编语言里面完成的。保存当前任务的sp,提取目标任务的sp,然后运行
3 人为执行。但是不一定要关闭中断,因为要允许中断嵌套。所以什么低吼关闭中断要看具体情况。
4 如果你没有关闭中断,自然不需要打开
 
 
 

回复

40

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 楼主 plabgh 的帖子

帖子的格式写的很工整啊~~~

1、OSTCBCur->OSTCBStkPtr= SP是在OSIntExit()中实现的。在OSIntExit()中会判断有没有比当前任务优先级更高的任务处于就绪态,如果有的话,就会进行任务调度,就会执行OSTCBCur->OSTCBStkPtr= SP这句话来保存当前任务的堆栈指针;如果没有的话,那么就会返回原来的任务,也就不会执行OSTCBCur->OSTCBStkPtr= SP这句话。

2、C语言写的ISR函数,保存PC值和CPU状态寄存器(PSW)是由编译器自动完成的。至于保存CPU相关的通用寄存器可能需要自己编写汇编代码,这就是为什么上下文切换函数OSCtxSw()和OSIntCtxSw()要用汇编代码写的原因。  清中断源和重新打开中断这个操作应该是由用户自己写。

这是我的理解哈。
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

4
 

感谢上面两位的回答,我自己是这样理解的:

    对于x86来说,响应中断的时候系统会自动关中断,同时将PSW和IP寄存器入栈,然后自动再开中断.至于其他的寄存器则需要你手动入栈,至于说进入中断函数以后开/关中断和清中断源则是你人为来操作的. 如果是这样的话我可不可以这样理解:

    x86平台上的中断函数的第一句话必须是我自己写的中断接口宏(各种寄存器的入栈),其次就是调用宏OSIntEnter( ),最后才是你用C写的相应的操作程序.而在退出的时候再调用宏OSIntExit()???如果真是这样的话,移植的时候我是不是还得自己写一个宏,来执行进入中断时的各种寄存器的入栈???

 

    另外,还有一个问题: 对于ucos来说,系统有没有一块中断栈???还是说执行中断的时候是直接使用的被中断任务的任务栈??如果是这样的话,那么中断嵌套的时候呢,还是使用的这块任务栈吗?? 我记得曾经看书的时候,看到了中断栈,最近有没找到这个说法了... 如果是在任务堆栈里面,那怎么保证SP的正确性呢(此时我需要的SP是指向全部CPU寄存器入栈以后的任务栈栈顶的指针)?同理,如果是在中断栈执行的操作,SP一样得不到保证(因为此时SP指向的是中断栈栈顶的指针),另外在OSIntExit( )和OSIntCtxSw( )内未找到相关OSTCBCur->OSTCBStkPtr= SP的语句.反倒是找到了SP=OSTCBCur->OSTCBStkPtr

因此求解,谢谢!!!

[ 本帖最后由 plabgh 于 2012-6-7 11:32 编辑 ]
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表