打印

请教移植ucos的几条语句,看不懂啊

[复制链接]
1985|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jinghui1978|  楼主 | 2011-9-6 09:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我这有一个完整的STM32F103程序,演示了UCOS II,看样子应该是官方版的。其中有个文件叫做OS_CPU_C.C,又有个函数用来初始化堆栈的:
OS_STK *OSTaskStkInit (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT16U opt)
{
    OS_STK *stk;
    (void)opt;                // 'opt' is not used, prevent warning
    stk       = ptos;        // Load stack pointer
    // Registers stacked as if auto-saved on exception
    *(stk)    = (INT32U)0x01000000L;  // xPSR                                                   
    *(--stk)  = (INT32U)task;         // Entry Point                    
    *(--stk)  = (INT32U)0xFFFFFFFEL;  // R14 (LR) (init value will cause fault if ever used)
    *(--stk)  = (INT32U)0x12121212L;   // R12   
    *(--stk)  = (INT32U)0x03030303L;   // R3               
    *(--stk)  = (INT32U)0x02020202L;   // R2
    *(--stk)  = (INT32U)0x01010101L;  // R1   
    *(--stk)  = (INT32U)p_arg;         // R0 : argument
    // Remaining registers saved on process stack
    *(--stk)  = (INT32U)0x11111111L;      // R11
    *(--stk)  = (INT32U)0x10101010L;      // R10
    *(--stk)  = (INT32U)0x09090909L;      // R9
    *(--stk)  = (INT32U)0x08080808L;      // R8
    *(--stk)  = (INT32U)0x07070707L;      // R7
    *(--stk)  = (INT32U)0x06060606L;     // R6
    *(--stk)  = (INT32U)0x05050505L;     // R5
    *(--stk)  = (INT32U)0x04040404L;     // R4  
    return (stk);
}

我的问题是:等号右边的数值是怎么回事?比如最后一条:
*(--stk)  = (INT32U)0x04040404L;     // R4  
看样子应该保存R4吧?但R4的值为什么是0x04040404?求指教!
沙发
john_lee| | 2011-9-6 09:49 | 只看该作者
没有实际意义,浪费代码空间。
---------------------
*(--stk)  = (INT32U)0x11111111L;      // R11 
*(--stk)  = (INT32U)0x10101010L;      // R10
*(--stk)  = (INT32U)0x09090909L;      // R9
*(--stk)  = (INT32U)0x08080808L;      // R8
*(--stk)  = (INT32U)0x07070707L;      // R7
*(--stk)  = (INT32U)0x06060606L;     // R6
*(--stk)  = (INT32U)0x05050505L;     // R5
*(--stk)  = (INT32U)0x04040404L;     // R4
直接改为:
stk -= 8;   // space for R4-R11
就清净了。

使用特权

评论回复
板凳
jinghui1978|  楼主 | 2011-9-6 09:53 | 只看该作者
这么简单? 惊奇! 高人啊!

使用特权

评论回复
地板
IJK| | 2011-9-6 10:29 | 只看该作者
我觉得,1L代码给以特殊的赋值,主要是为了调试方便,特别是出现问题时

使用特权

评论回复
5
pkat| | 2011-9-6 16:14 | 只看该作者
同意楼上的观点

使用特权

评论回复
6
john_lee| | 2011-9-6 20:46 | 只看该作者
这些任务栈初始化的过程,都是很成熟而稳定的,不存在什么调试的必要;而且这些所谓的特殊数据在用户任务运行时,基本上都被改写掉了,因此,即使用户任务代码有了bug,这些特殊数据也完全起不到任何帮助作用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

123

帖子

1

粉丝