keil5自带uc/os-ii的一个问题

来源:互联网 发布:淘宝摄影师接单平台 编辑:程序博客网 时间:2024/05/19 11:48

keil5推出了software packs, 其中uc/os-ii有个小BUG。
在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                                 */                                             /* Align the stack to 8-bytes.                        */    p_stk      = (OS_STK *)((OS_STK)(p_stk) & 0xFFFFFFF8u);                                                 /* Registers stacked as if auto-saved on exception    */    *(stk)    = (INT32U)0x01000000uL;            /* xPSR                                               */    *(--stk)  = (INT32U)task;                    /* Entry Point                                        */    *(--stk)  = (INT32U)OS_TaskReturn;           /* R14 (LR)                                           */    *(--stk)  = (INT32U)0x12121212uL;            /* R12                                                */    *(--stk)  = (INT32U)0x03030303uL;            /* R3                                                 */    *(--stk)  = (INT32U)0x02020202uL;            /* R2                                                 */    *(--stk)  = (INT32U)0x01010101uL;            /* R1                                                 */    *(--stk)  = (INT32U)p_arg;                   /* R0 : argument                                      */                                                 /* Remaining registers saved on process stack         */    *(--stk)  = (INT32U)0x11111111uL;            /* R11                                                */    *(--stk)  = (INT32U)0x10101010uL;            /* R10                                                */    *(--stk)  = (INT32U)0x09090909uL;            /* R9                                                 */    *(--stk)  = (INT32U)0x08080808uL;            /* R8                                                 */    *(--stk)  = (INT32U)0x07070707uL;            /* R7                                                 */    *(--stk)  = (INT32U)0x06060606uL;            /* R6                                                 */    *(--stk)  = (INT32U)0x05050505uL;            /* R5                                                 */    *(--stk)  = (INT32U)0x04040404uL;            /* R4                                                 */    return (stk);}

这个函数是编译不过去的,提示p_stk没有定义,其实这个函数里不需要这行代码,把这行注释掉就可以。我猜测,着行代码是开发人员不小心留下的,因为在uc/os-iii里该函数的实现是这样的

CPU_STK  *OSTaskStkInit (OS_TASK_PTR    p_task,                         void          *p_arg,                         CPU_STK       *p_stk_base,                         CPU_STK       *p_stk_limit,                         CPU_STK_SIZE   stk_size,                         OS_OPT         opt){    CPU_STK  *p_stk;    (void)opt;                                              /* Prevent compiler warning                               */    p_stk = &p_stk_base[stk_size];                          /* Load stack pointer                                     */                                                            /* Registers stacked as if auto-saved on exception        */    *--p_stk = (CPU_STK)0x01000000u;                        /* xPSR                                                   */    *--p_stk = (CPU_STK)p_task;                             /* Entry Point                                            */    *--p_stk = (CPU_STK)OS_TaskReturn;                      /* R14 (LR)                                               */    *--p_stk = (CPU_STK)0x12121212u;                        /* R12                                                    */    *--p_stk = (CPU_STK)0x03030303u;                        /* R3                                                     */    *--p_stk = (CPU_STK)0x02020202u;                        /* R2                                                     */    *--p_stk = (CPU_STK)p_stk_limit;                        /* R1                                                     */    *--p_stk = (CPU_STK)p_arg;                              /* R0 : argument                                          */                                                            /* Remaining registers saved on process stack             */    *--p_stk = (CPU_STK)0x11111111u;                        /* R11                                                    */    *--p_stk = (CPU_STK)0x10101010u;                        /* R10                                                    */    *--p_stk = (CPU_STK)0x09090909u;                        /* R9                                                     */    *--p_stk = (CPU_STK)0x08080808u;                        /* R8                                                     */    *--p_stk = (CPU_STK)0x07070707u;                        /* R7                                                     */    *--p_stk = (CPU_STK)0x06060606u;                        /* R6                                                     */    *--p_stk = (CPU_STK)0x05050505u;                        /* R5                                                     */    *--p_stk = (CPU_STK)0x04040404u;                        /* R4                                                     */    return (p_stk);}

刚好可以发现,uc/os-iii缺少的代码就是在uc/os-ii里多出来的代码。

p_stk      = (OS_STK *)((OS_STK)(p_stk) & 0xFFFFFFF8u);

这行代码(作用是对齐)应该是属于uc/os-iii的。

小提示:由于下载的源码是只读的,可以看到源文件上都有一个黄色小钥匙,所以要找到源码路径更改文件属性。
目录为:keil5安装目录->ARM->pack->RTOS。

1 0
原创粉丝点击