共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 跳转至页
回复
| 有奖活动 | |
|---|---|
| 2026年“我要开发板活动”第三季,开始了! | |
| 硬核工程师专属补给计划——填盲盒 | |
| “我踩过的那些坑”主题活动——第002期 | |
| 【EEPW电子工程师创研计划】技术变现通道已开启~ | |
| 发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
| 【EEPW在线】E起听工程师的声音! | |
| 高校联络员开始招募啦!有惊喜!! | |
| 【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
我要赚赏金打赏帖 |
|
|---|---|
| 以启明云端ESP32P4开发板实现TF卡读写功能被打赏¥28元 | |
| 【分享开发笔记,赚取电动螺丝刀】树莓派5串口UART0配置被打赏¥25元 | |
| 【STM32F103ZET6】17:分享在Rtos项目中断管理的使用经验被打赏¥23元 | |
| 【STM32F103ZET6】16:分享在中断中恢复串口任务,遇到的问题被打赏¥31元 | |
| 在FireBeetle2ESP32-C5上实现温度大气压检测及显示被打赏¥21元 | |
| 【分享开发笔记,赚取电动螺丝刀】SAME51双串口收发配置被打赏¥27元 | |
| Chaos-nano操作系统在手持式VOC检测设备上的应用被打赏¥37元 | |
| 【分享开发笔记,赚取电动螺丝刀】关于在导入第三方库lib时,wchart类型冲突的原因及解决方案被打赏¥30元 | |
| 在FireBeetle2ESP32-C5上实现温湿度检测和显示被打赏¥20元 | |
| 在FireBeetle2ESP32-C5上实现光照强度检测及显示被打赏¥21元 | |
我要赚赏金
