找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2781|回复: 1
收起左侧

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

[复制链接]
ID:103277 发表于 2017-1-11 21:32 | 显示全部楼层 |阅读模式
小弟刚刚学习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回答。
               
                小弟对于上述问题非常的不解,希望得到各位大神的指点感激不尽。

回复

使用道具 举报

ID:153041 发表于 2017-2-15 17:17 | 显示全部楼层
思路是这样的: 每个任务都有各自独立的堆栈区,系统中断后,任务切换过程是这样,首先将当前cpu主要寄存器内容全部入栈(当前任务栈),然后将堆栈指针重新赋值,指向新的任务的堆栈区,再执行出栈操作。入栈和出栈操作一般cpu有现成的指令支持的,ucos2将这些封装成函数。每一个任务自己的堆栈指针存放在任务的控制块数据结构中(或理解为任务名片)。

评分

参与人数 1黑币 +70 收起 理由
admin + 70 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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