前言
用CubeMX按照实际MCU(STM32F103C8T6)定义生成IAR(8.40.2.22891)工程框架。 按照资料,将git上的旧版lite-os代码加入工程。 初次弄,将所有文件都手工加进去了。IAR中的group和文件名都与实际目录相对应。这样想在编程过程中浏览文件就方便了。 加完之后,尝试编译一下,出现如下报错。
Error[Li006]: duplicate definitions for "g_stLosVersion"; in "D:\test_dir\EWARM\test_F103C8\Obj\cmsis_liteos.o", ...
后面还有好多 “duplicate definitions”的报错
出现这种报错,一般就2个原因:
- 变量不是定义在.c中,而是定义在.h中,编译时报错。
- 变量虽然定义在.c中,但是改.c文件被当作头文件使用,引起了重复包含。
实验
将工程加入Source Insight 4.0. 看了g_stLosVersion的使用情况
---- g_stLosVersion Matches (3 in 1 files) ----
cmsis_liteos2.c (lite_os\components\cmsis\2.0) line 72 : const osVersion_t g_stLosVersion = {001, 001};
osKernelGetInfo in cmsis_liteos2.c (lite_os\components\cmsis\2.0) : version->api = g_stLosVersion.api;
osKernelGetInfo in cmsis_liteos2.c (lite_os\components\cmsis\2.0) : version->kernel = g_stLosVersion.kernel;
g_stLosVersion的定义和使用都在一个.c文件(cmsis_liteos2.c )中。 不是变量定义位置错误引起的报错。
莫非cmsis_liteos2.c被当作头文件重复包含了? 在SI中查 cmsis_liteos2.c 的包含关系。
---- cmsis_liteos2.c Matches (4 in 4 files) ----
cmsis_liteos.c (lite_os\components\cmsis) line 40 :
果真啊,cmsis_liteos2.c 被当作头文件包含了。 \lite_os\components\cmsis\cmsis_liteos.c 的实现:
#include "los_config.h"
#if (CMSIS_OS_VER == 1)
#include "1.0/cmsis_liteos1.c"
#elif (CMSIS_OS_VER == 2)
#include "2.0/cmsis_liteos2.c"
#endif
lite-os的配置文件中,会指定使用哪种CMSIS, 在cmsis_liteos.c 中,就会选择包含cmsis_liteosx.c 那知道了,这种报错的原因是.c重复包含。 解决问题的方法:
- 从IAR的group中去掉手工添加的cmsis_liteos2.c,由cmsis_liteos.c在编译时,自动包含cmsis_liteos2.c就好了。
手工去掉cmsis_liteos2.c后,再编译,此错误消失。 其他编译错误另外处理。
总结
现在能加入第三方IDE(MDK, IAR)的MCU工程只能使用git上的旧版lite-os. gitee上的lite-os官方主库,已经全面倒向HUAWEI-LiteOS-Studio. 但是HUAWEI-LiteOS-Studio生成的MCU工程只支持部分MCU(6,7种的样子), 调试接口也只能使用JTAG, 不直接支持SWD, SWIM. 想用新版lite-os也只能眼馋啊。
你出了一种IDE(HUAWEI-LiteOS-Studio), 让大家用也挺好,不过要能支持市面上的大部分MCU才好。 在没有全面支持所有MCU之前,还是跟随新版lite-os出个移植文档的好。 要不想换新版lite-os也无从下嘴啊。
很多公司现在产品使用的是第三方IDE, 如果不用换IDE, lite-os官方每次出最新版,都更新一下移植说明,我觉得这比出IDE(HUAWEI-LiteOS-Studio)还实用。
现在市面上出的lite-os的书,也是针对git上的旧版lite-os写的。 lite-os官方关于使用第三方IDE的工程例子,也只在lite-os早期版本中才有。
希望lite-os官方以后能支持最新版lit-os不使用HUAWEI-LiteOS-Studio的场景(使用第三方IDE),那样大家肯定都喜欢转到lite-os上来。
|