LiteOS移植过程中的常见错误

在编译过程中有很多错误产生,有的是不注意写错代码,有的是忘记添加相应的变量,这里列举一些常见的错误。

一、命名错误

文件夹名跟Makefile文件中的变量名对应不上,错误如下

make[1]: Entering directory 'xxx/LiteOS/arch/arm/cortex_m'
<command-line>: fatal error: xxx/LiteOS/targets/STM32F401_CCU6/include/menuconfig.h: No such file or directory
compilation terminated.

更改文件夹名字即可。

二、警告错误

由于LiteOS开启了-Werror选项,因此会把警告当作错误处理,如下错误

../../lib/libc/src/prng/seed48.c:5:40: error: argument 1 of type 'short unsigned int *' declared as a pointer [-Werror=array-parameter=]
    5 | unsigned short *seed48(unsigned short *s)
LiteOS/lib/libc/src/include/../../include/stdlib.h:695:25: note: previously declared as an array 'short unsigned int[3]'
  695 | unsigned short *seed48 (unsigned short [3]);

这时候只需要到lib/libc/src/prng/seed48中把unsigned short *s改成unsigned short s[3]即可。

usart.c警告,如下错误

Src/usart.c: In function 'UsartHwi':
Src/usart.c:139:11: error: implicit declaration of function 'LOS_HwiCreate' [-Werror=implicit-function-declaration]
  139 |     (VOID)LOS_HwiCreate(NUM_HAL_INTERRUPT_UART, 0, 0, UartHandler, NULL);
      |           ^~~~~~~~~~~~~

在Src/usart.c中引入头文件

#include "los_hwi.h"

三、未定义错误

如果在写代码的时候忘记写一些变量名或者忘记定义或者写错变量名,都会引起该问题,如下错误

Src/tim.c: In function 'GetTimerCycles':
Src/tim.c:143:38: error: 'TIMER3_RELOAD' undeclared (first use in this function)
  143 |     cycles = swCycles + cycleTimes * TIMER3_RELOAD;

这个错误只需要在Src/tim.c中定义一个变量即可

#define TIMER3_RELOAD 50000

即定时器溢出的数值。

四、链接错误

gcc-arm/bin/../lib/gcc/arm-none-eabi/11.2.1/../../../../arm-none-eabi/bin/ld: /home/chen/Desktop/LiteOS/out/STM32F401_CCU6/lib/libbase.a(mempt_shellcmd.o): in function `OsShellCmdFree':
mempt_shellcmd.c:(.text.OsShellCmdFree+0x174): undefined reference to `__bss_start'
collect2: error: ld returned 1 exit status
Makefile:73: recipe for target 'Huawei_LiteOS' failed

这个__bss_start之类的错误是在targets/STM32F401_CCU6下面的liteos.ld链接文件中未定义这个变量,LiteOS这个变量和STM32CubeMX生成的变量少了两根下划线即__bss_start__ -> __bss_start

类似的错误还有__text_start,__text_end相似的报错,如果不了解的话,可以照着别的项目的.ld文件进行添加相应的字段即可。

五、编译成功后无法使用shell

编译时选择shell,结果在调试中没法使用shell进行交互,提示System Memory Failed,经过排查,发现LiteOS对cmd表的取值是通过LOS_HAL_TABLE_BEGIN这个宏定义实现的,在源代码中查找相应的实现如下

#define LOS_HAL_TABLE_BEGIN(label, name)                                     \
    __asm__(".section \".liteos.table." X_STRING(name) ".begin\",\"aw\"\n"   \
            ".globl " X_STRING(LOS_LABEL_DEFN(label)) "\n"                   \
            ".type    " X_STRING(LOS_LABEL_DEFN(label)) ",object\n"          \
            ".p2align " X_STRING(LOSARC_P2ALIGNMENT) "\n"                    \
            X_STRING(LOS_LABEL_DEFN(label)) ":\n"                            \
            ".previous\n"                                                    \
            )

发现是通过取.setion段里面.liteos.table,在链接文件中实现,对照其他文件发现缺了一个字段,如下代码

  .data ALIGN(0x1000): 
  {
	...
    //缺了这个字段
    KEEP(*( SORT (.liteos.table.*)));
	...
  } >RAM AT> FLASH

重新编译后,成功进入LiteOS自带shell交互中。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ESP32是一款低功耗、高性能的无线模块,而LiteOS华为推出的一种轻量级的操作系统。将LiteOS移植到ESP32上可以增强其操作系统支持,提高其可靠性和稳定性。 首先,ESP32和LiteOS都是开源的,可通过获取源代码进行移植移植过程需要下载ESP32专用的工具链和LiteOS源代码,然后根据硬件平台进行适配。 其次,为了将LiteOS移植到ESP32上,需要进行一些硬件适配工作。ESP32拥有双核心处理器、Wi-Fi和蓝牙模块等功能,需要在移植过程考虑这些硬件的驱动程序和功能的支持。可以根据ESP32的硬件规格,修改LiteOS的驱动程序,以兼容ESP32的硬件平台。 另外,移植LiteOS还需要对内存管理、任务调度和外设驱动等进行配置。由于ESP32资源受限,需要根据实际硬件情况进行内存配置,确保操作系统的正常运行。同时,需要制定任务调度算法,合理安排任务的执行顺序,提高系统的运行效率。另外,还需要针对ESP32的外设进行驱动程序的编写,以实现对外设的控制和管理。 最后,进行移植后,需要进行测试和调试。通过一系列的测试,确保操作系统在ESP32上的正常运行。如果发现问题或异常情况,需要进行调试和修改,直至系统稳定可靠。 综上所述,将LiteOS移植到ESP32上需要进行硬件适配、配置和调试等工作。通过这一系列的步骤,可以实现ESP32上LiteOS的正常运行,提高其功能和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值