本文主要是介绍keil5自带uc/os-ii的一个问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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。
这篇关于keil5自带uc/os-ii的一个问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!