打印
[uCOS/RTOS]

UCOSII中任务堆栈如何具体的实现保存CPU寄存器的值?

[复制链接]
1969|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sayato|  楼主 | 2017-1-13 21:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟刚刚学习UCOS-II,问题可能比较low,请各位大神不吝赐教,感激不尽。


如题所说,UCOS中穿件任务时都会调用到一个函数OSTaskStkInit(),该函数位于os_cpu_c.c
该函数将任务创建时 开辟的任务堆栈的栈顶指针传递进来,以后任务堆栈就会保存在这块内存对吧,
问1,我想,说的是任务切换时 都是使用一个“陷阱“或者软件中断触发的,这样CPU就会进行一次入栈,保存当前任务堆栈,然后将上次被中断的任务堆栈拷贝到CPU寄存器,然后执行上次被中断的任务,这个理解对吗?
问2,每次产生软件中断或者陷阱的时候,CPU执行入栈操作,保存当前寄存器的状态,它是如何将这些值保存到任务堆栈中的?当cpu切换任务时是怎么将任务堆栈保存的寄存器值拷贝到cpu寄存器中的?总之,就是任务堆栈是怎么和CPU寄存器之间建立数据交互的,麻烦详细一点。
问3,
#define  CPU_CRITICAL_ENTER()  do { CPU_INT_DIS(); } while (0)     
#define  CPU_CRITICAL_EXIT()   do { CPU_INT_EN();  } while (0)


#define  CPU_INT_DIS()         do { cpu_sr = CPU_SR_Save(); } while (0)
#define  CPU_INT_EN()          do { CPU_SR_Restore(cpu_sr); } while (0)
//以下内容来源ucosII-F28335的OS_CPU_A.ASM
    .asmfunc
_OS_CPU_SR_Save:
    PUSH    ST1 //什么意思?
    DINT           //关中断?
    POP    @AL//什么意思?
    AND     AL, #1//什么意思?
    LRETR            //什么意思?
    .endasmfunc


    .asmfunc
_OS_CPU_SR_Restore:
    PUSH    ST1     //什么意思?
    POP     AR0    //什么意思?
    AND     AR0, #0xFFFE  //什么意思?
    OR      AL, AR0   //什么意思?
    PUSH    AL   //什么意思?
    POP     ST1   //什么意思?
    LRETR      //什么意思?
    .endasmfunc
               
                能否帮忙纤细解释一下上述汇编语言,最好结合上面问题1,2回答。
               
                小弟对于上述问题非常的不解,希望得到各位大神的指点感激不尽。

相关帖子

沙发
feelhyq| | 2017-1-16 12:34 | 只看该作者
问一,二:
       当CPU响应中断的时候,会将当前一些寄存器的数据保存起来,怎么保存呢?CPU会根据SP(栈指针)的位置进行压栈,即将寄存器的数据保存起来,其中最重要的就是PC寄存器(program counter)。然后去执行中断服务程序,等中断服务程序完成后,CPU根据SP的位置,将之前保存在栈(其实就是一块内存空间)里面的数据恢复到相应寄存器中。
       同理。当一个任务触发软中断后,也会进行压栈操作,保存当前场景,在终端服务程序里面,将另一个高优先级任务保存数据的位置赋给硬件SP(注意,这个时候可以理解为偷梁换柱,硬件SP中的数据由之前低优先级的被改变成高优先级任务的SP),等到中断服务程序执行完后,CPU根据SP的位置进行出栈(恢复高优先级任务的现场)操作,是得PC的值变成之前高优先级因某种原因中断执行的位置,从而让高优先级继续执行。

使用特权

评论回复
板凳
feelhyq| | 2017-1-16 12:36 | 只看该作者
针对汇编,建议使用cortex-M系列的芯片(比如STM32)去看,因为ARM或者Thumb,Thumb-2指令集比较常见和常用。

使用特权

评论回复
地板
sayato|  楼主 | 2017-1-17 22:50 | 只看该作者
feelhyq 发表于 2017-1-16 12:36
针对汇编,建议使用cortex-M系列的芯片(比如STM32)去看,因为ARM或者Thumb,Thumb-2指令集比较常见和常用。 ...

谢谢您的回答,您的意思我明白了,这两天我也思考了一下 ,是不是在系统启动前或者启动的时候已经将SP指向开始任务的堆栈了?也就是说系统启动之后 以前裸机程序的那个堆栈其实已经没用了

使用特权

评论回复
5
feelhyq| | 2017-1-18 09:02 | 只看该作者
sayato 发表于 2017-1-17 22:50
谢谢您的回答,您的意思我明白了,这两天我也思考了一下 ,是不是在系统启动前或者启动的时候已经将SP指 ...

针对cortex-M3,4的CPU架构来说,它有2个栈指针,MSP(main stack point),和PSP(process stack point),但是不能同时使用。针对UCOS这个RTOS来说,它只用到了MSP,也就是说在系统启后SP指向任务的堆栈,至于“”系统启动后以前裸机程序的那个对战已经没有用了” 这句话也可以这么说,毕竟你说的这个裸机程序就像BIOS或者bootloader一样,当操作系统启动后BIOS或者bootloader几乎没有很大用处。  但是针对RT_thread这种RTOS来讲,在系统启动前使用的是MSP,系统启动后给线程(或者task)用的是PSP,一旦产生异常或者中断,又使用MSP,当退出中断或者异常后有运行线程的时候再次使用PSP。
      建议楼主可以看看   《cortex-M3权威指南》

使用特权

评论回复
6
bin28| | 2017-1-22 17:30 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

39

帖子

0

粉丝