前言

用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 : #include "2.0/cmsis_liteos2.c"

果真啊,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上来。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐