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
- keil5自带uc/os-ii的一个问题
- uC/OS II学习时的一个重要函数 OSInit( );
- uC/OS II学习时的一个重要函数 OSInit( );
- uC\OS-II OSintExit函数的一个bug
- uC/OS II学习时的一个重要函数 OSInit( )
- uC/OS-II的任务
- UC/OS-II的学习
- UC/OS-II 的中断
- uC/OS-II Windows下虚拟的问题
- 移植uC/OS-II到51单片机的菜鸟问题
- 來了解 uC/OS-II 的觀察器 uC/OS-View
- STM32F105 UC/OS-II (B OSStartHang)问题
- uC/OS-II 学习笔记之:怎样在uC/OS-II里创建一个任务?
- 基于uC/OS-II的文件系统设计
- 基于uC/OS-II的文件系统设计
- uC/OS-II的故事(转)
- uC/OS-II就绪任务的管理
- uC/OS-II的内存管理
- RSA算法
- Android DatagramSocket error message: EADDRINUSE (Address already in use)
- python 单元测试(assert 或者 unittest.TestCase)
- css两行文字超出显示省略号
- asm基础—— vs下使用汇编
- keil5自带uc/os-ii的一个问题
- linux内核follow_link分析
- Onvif开发server和client
- 计算多项式
- zookeeper 和 dubbo的使用
- Spark kyro Serialization
- android listview 在添加header时候 OnItemClickListener position 索引不正确
- java io/nio的使用介绍
- 阿里面试准备<android部分>