共4条
1/1 1 跳转至页
ucos2,OSTaskStkInit 关于ucos2的移植函数的一些不解 - OSTaskStkInit

问
OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)
{
OS_STK *stk;
opt = opt; /* 'opt' 没有使用。作用是避免编译器警告 */
stk = ptos; /* 获取堆栈指针 */
/* 建立任务环境,ADS1.2使用满递减堆栈 */
*stk = (OS_STK) task; /* pc */
*--stk = (OS_STK) task; /* lr */
*--stk = 0; /* r12 */
*--stk = 0; /* r11 */
*--stk = 0; /* r10 */
*--stk = 0; /* r9 */
*--stk = 0; /* r8 */
*--stk = 0; /* r7 */
*--stk = 0; /* r6 */
*--stk = 0; /* r5 */
*--stk = 0; /* r4 */
*--stk = 0; /* r3 */
*--stk = 0; /* r2 */
*--stk = 0; /* r1 */
*--stk = (unsigned int) pdata; /* r0,第一个参数使用R0传递 */
*--stk = (USER_USING_MODE|0x00); /* spsr,允许 IRQ, FIQ 中断 */
*--stk = 0; /* 关中断计数器OsEnterSum; */
return (stk);
}
==================================
*stk = (OS_STK) task; /* pc */
*--stk = (OS_STK) task; /* lr */
干什么用的?不是很明白
==================================
*--stk = 0; /* r8 */
*--stk = 0; /* r7 */
*--stk = 0; /* r6 */
*--stk = 0; /* r5 */
*--stk = 0; /* r4 */
*--stk = 0; /* r3 */
*--stk = 0; /* r2 */
*--stk = 0; /* r1 */
好像跟绍贝贝翻译的那本书上说法的不太一样,不是要保存寄存器吗?怎么都置0了? 答 1: 初始化的时候当然要清零了 答 2: 置0并且压入堆栈了。等下弹出来就象复位后一样~~~~ 答 3: 嗯,也是这样也对
书上说的,要保存寄存器的值
就像刚发生过中断一样
仔细想想初始化一个任务没必要那样做 答 4: 还有 *--stk = 0; /* r12 */
*--stk = 0; /* r11 */
*--stk = 0; /* r10 */
*--stk = 0; /* r9 */
*--stk = 0; /* r8 */
*--stk = 0; /* r7 */
*--stk = 0; /* r6 */
*--stk = 0; /* r5 */
*--stk = 0; /* r4 */
*--stk = 0; /* r3 */
*--stk = 0; /* r2 */
*--stk = 0; /* r1 */
+++++++++++++++++++++++++++++
可是,那些语句和后面的注释怎么就一一对应了? 答 5: 这些数据现在是保存在的堆栈中的,等下任务开始执行时,就从堆栈中弹出,弹出来刚好放在后面注释中的寄存器中。因为这些是工作寄存器,全部要压栈或者从堆栈中恢复的。 答 6: 还有==================================
*stk = (OS_STK) task; /* pc */
*--stk = (OS_STK) task; /* lr */
干什么用的?不是很明白 答 7: 后面不是有注释么?分别对应着pc寄存器和lr寄存器而lr寄存器在函数返回时,就会返回到任务入口处了。至于pc,为何要设置,这个我就不清楚了,也许是随意弄上去的一句,并没什么实际意义,只是为了把R15(即PC)也弄一下吧。
{
OS_STK *stk;
opt = opt; /* 'opt' 没有使用。作用是避免编译器警告 */
stk = ptos; /* 获取堆栈指针 */
/* 建立任务环境,ADS1.2使用满递减堆栈 */
*stk = (OS_STK) task; /* pc */
*--stk = (OS_STK) task; /* lr */
*--stk = 0; /* r12 */
*--stk = 0; /* r11 */
*--stk = 0; /* r10 */
*--stk = 0; /* r9 */
*--stk = 0; /* r8 */
*--stk = 0; /* r7 */
*--stk = 0; /* r6 */
*--stk = 0; /* r5 */
*--stk = 0; /* r4 */
*--stk = 0; /* r3 */
*--stk = 0; /* r2 */
*--stk = 0; /* r1 */
*--stk = (unsigned int) pdata; /* r0,第一个参数使用R0传递 */
*--stk = (USER_USING_MODE|0x00); /* spsr,允许 IRQ, FIQ 中断 */
*--stk = 0; /* 关中断计数器OsEnterSum; */
return (stk);
}
==================================
*stk = (OS_STK) task; /* pc */
*--stk = (OS_STK) task; /* lr */
干什么用的?不是很明白
==================================
*--stk = 0; /* r8 */
*--stk = 0; /* r7 */
*--stk = 0; /* r6 */
*--stk = 0; /* r5 */
*--stk = 0; /* r4 */
*--stk = 0; /* r3 */
*--stk = 0; /* r2 */
*--stk = 0; /* r1 */
好像跟绍贝贝翻译的那本书上说法的不太一样,不是要保存寄存器吗?怎么都置0了? 答 1: 初始化的时候当然要清零了 答 2: 置0并且压入堆栈了。等下弹出来就象复位后一样~~~~ 答 3: 嗯,也是这样也对
书上说的,要保存寄存器的值
就像刚发生过中断一样
仔细想想初始化一个任务没必要那样做 答 4: 还有 *--stk = 0; /* r12 */
*--stk = 0; /* r11 */
*--stk = 0; /* r10 */
*--stk = 0; /* r9 */
*--stk = 0; /* r8 */
*--stk = 0; /* r7 */
*--stk = 0; /* r6 */
*--stk = 0; /* r5 */
*--stk = 0; /* r4 */
*--stk = 0; /* r3 */
*--stk = 0; /* r2 */
*--stk = 0; /* r1 */
+++++++++++++++++++++++++++++
可是,那些语句和后面的注释怎么就一一对应了? 答 5: 这些数据现在是保存在的堆栈中的,等下任务开始执行时,就从堆栈中弹出,弹出来刚好放在后面注释中的寄存器中。因为这些是工作寄存器,全部要压栈或者从堆栈中恢复的。 答 6: 还有==================================
*stk = (OS_STK) task; /* pc */
*--stk = (OS_STK) task; /* lr */
干什么用的?不是很明白 答 7: 后面不是有注释么?分别对应着pc寄存器和lr寄存器而lr寄存器在函数返回时,就会返回到任务入口处了。至于pc,为何要设置,这个我就不清楚了,也许是随意弄上去的一句,并没什么实际意义,只是为了把R15(即PC)也弄一下吧。
共4条
1/1 1 跳转至页
回复
打赏帖 | |
---|---|
【OZONE】使用方法总结被打赏20分 | |
【S32K314】芯片启动流程分析被打赏20分 | |
【LP-MSPM0L1306】适配 RT-Thread Nano被打赏20分 | |
今天的咸鱼也是曾经鱼跃龙门的天纵之才,中流击水,浪遏飞舟,粪土当年万户侯,数风流人物,还看今朝,被打赏5分 | |
分享一种检测按键状态的方法被打赏20分 | |
周末总结一下,STM32C0系列的开发经验被打赏50分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下定时器配置被打赏20分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下PWM配置被打赏20分 | |
【Cortex-M】Systick Timer使用被打赏10分 | |
分享汽车防盗系统的组成与分类(一)被打赏5分 |