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

2024-06-06 04:38
文章标签 问题 自带 ii os keil5 uc

本文主要是介绍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的一个问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035110

相关文章

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题

《解决mybatis-plus-boot-starter与mybatis-spring-boot-starter的错误问题》本文主要讲述了在使用MyBatis和MyBatis-Plus时遇到的绑定异常... 目录myBATis-plus-boot-starpythonter与mybatis-spring-b

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

如何安装HWE内核? Ubuntu安装hwe内核解决硬件太新的问题

《如何安装HWE内核?Ubuntu安装hwe内核解决硬件太新的问题》今天的主角就是hwe内核(hardwareenablementkernel),一般安装的Ubuntu都是初始内核,不能很好地支... 对于追求系统稳定性,又想充分利用最新硬件特性的 Ubuntu 用户来说,HWEXBQgUbdlna(Har

MAVEN3.9.x中301问题及解决方法

《MAVEN3.9.x中301问题及解决方法》本文主要介绍了使用MAVEN3.9.x中301问题及解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录01、背景02、现象03、分析原因04、解决方案及验证05、结语本文主要是针对“构建加速”需求交

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

CentOS系统使用yum命令报错问题及解决

《CentOS系统使用yum命令报错问题及解决》文章主要讲述了在CentOS系统中使用yum命令时遇到的错误,并提供了个人解决方法,希望对大家有所帮助,并鼓励大家支持脚本之家... 目录Centos系统使用yum命令报错找到文件替换源文件为总结CentOS系统使用yum命令报错http://www.cppc

使用@Slf4j注解,log.info()无法使用问题

《使用@Slf4j注解,log.info()无法使用问题》在使用Lombok的@Slf4j注解打印日志时遇到问题,通过降低Lombok版本(从1.18.x降至1.16.10)解决了问题... 目录@Slf4androidj注解,log.info()无法使用问题最后解决总结@Slf4j注解,log.info(

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下