共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 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| OK1126B-S开发板下以导航按键控制云台/机械臂姿态调整被打赏¥29元 | |
| 【树莓派5】便携热成像仪被打赏¥36元 | |
| 【树莓派5】环境监测仪被打赏¥35元 | |
| OK1126B-S开发板下多时段语音提示型电子时钟被打赏¥27元 | |
| OK1126B-S开发板下函数构建及步进电机驱动控制被打赏¥25元 | |
| 【S32K3XX】LPI2C 参数配置说明被打赏¥20元 | |
| OK1126B-S开发板的脚本编程及应用设计被打赏¥27元 | |
| 5v升压8.4v两节锂电池充电芯片,针对同步和异步的IC测试被打赏¥35元 | |
| 【S32K3XX】S32DS LPI2C 配置失败问题解决被打赏¥22元 | |
| 【S32K3XX】FLASH 的 DID 保护机制被打赏¥19元 | |
我要赚赏金
