共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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 | |
【分享评测,赢取加热台】使用8051单片机驱动WS2812被打赏40分 |