LiteOS调研

LiteOS调研。

概述

个人心得

2020.12.30发布了5.0版本,但网上资料较多是旧的版本,旧版本分有-m和-a系列,新版本统一了,接口也更改了。新版本改动很大,也添加很多组件,可能还是基于该版本开发。

CMSIS ARM制定的接口,在LiteOS中有实现,在GD32中也看到有(但似乎没实现)。

在模块的 makefile 中,最好用通配符匹配源文件。

DemoEntry会初始化众多 demo 和 shell,在内核配置中添加。如不用,则可自定义 app_init 函数。

目标板的 main 函数基本不用做大改动。

开发环境

Windows平台的开发环境及工具

studio安装

安装包 HUAWEI-LiteOS-Studio-Setup-x64-xx。实际:HUAWEI-LiteOS-Studio V1.45.9 Beta

中文包下载脚本 https://liteos.gitee.io/liteos_studio/scripts/extension_download.bat
先安装studio,在里面选插件,再选中下载的插件,安装,官方有步骤。

安装 stm32 插件。(用 qemu 模拟也要安装之)

安装 base 插件。

gcc编译器

安装arm-none-eabi软件。下载https://liteos.gitee.io/liteos_studio/scripts/GNU_Arm_Embedded_Toolchain_download.bat。
注:默认下载目录为C:\Users\<用户名>\.huawei-liteos-studio,因后续工程亦需要此目录,故直接使用,如没有,创建之。

make工具

下载 https://liteos.gitee.io/liteos_studio/scripts/x_pack_windows_build_tools_download.bat

注:不能使用其它的make工具,否则编译不成功。

QEMU工具

https://qemu.weilnetz.de/w64/2021/
文件名:qemu-w64-setup-20210810.exe
需核查 sha512 值。
双击exe安装。

使用小结

烧录后,有时编译无反响,关闭烧录界面。

默认只有ST和QEMU系列可配置,其它的系列暂不知如何搞。直接复制默认的配置文件(在LiteOS\tools\build\config目录),无效。

Linux平台的开发环境及工具

QEMU入门实例

参考:https://liteos.gitee.io/liteos_studio/#/project_stm32 里面有注意事项。
注意要联网。

新建工程

image-20210930154123068

之后自动下载。提示:
image-20210930154147598

下载完后自动打开工程。如无,手动打开。

自注: 似乎是把 liteos 整个源码下载了。与默认的仓库文件相比,一些配置修改了。

配置

点击齿轮图标image-20210930155319439,快捷键F4配置工程。

image-20210930155813140

image-20210930162507159

image-20210930162516870

image-20210930162526416

注:如果默认没有的目标板,也可以手动添加,一般基于某些芯片修改。
注:工程源码映射那个地方,暂未搞明白。

编译

按编译图标,快捷键为F7,成功提示:

编译成功提示:

1
2
3
4
5
6
7
arm-none-eabi-objdump -d d:/project/LiteOS/demo/out/realview-pbx-a9/Huawei_LiteOS.elf >d:/project/LiteOS/demo/out/realview-pbx-a9/Huawei_LiteOS.asm
arm-none-eabi-size d:/project/LiteOS/demo/out/realview-pbx-a9/Huawei_LiteOS.elf
text data bss dec hex filename
158366 508 53184 212058 33c5a d:/project/LiteOS/demo/out/realview-pbx-a9/Huawei_LiteOS.elf
########################################################################################################
######## LiteOS build successfully! ########
########################################################################################################

make 不对应,出错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
> Executing task: LiteOSTool: Build <

'tr' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
此时不应有 -lt。
'tr' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
此时不应有 -gt。
命令语法不正确。
命令语法不正确。
make: *** [Makefile:38: d:/project/LiteOS/demo/out/realview-pbx-a9] Error 1
make: *** Waiting for unfinished jobs....
make: *** [Makefile:41: d:/project/LiteOS/demo/out/realview-pbx-a9/obj] Error 1
d:/project/LiteOS/demo/kernel/init/los_init.c
此时不应有 dir。
make: *** [Makefile:60: LITEOS_BUILD] Error 255

注:make使用 mingw 提供的,不符合。

烧录

在工程配置烧录器页面选择烧录文件

image-20210930165840818

启动信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Executing task: qemu-system-arm.exe -machine "realview-pbx-a9" -smp 4 -m 512M -kernel "d:\project\LiteOS\demo\out\realview-pbx-a9\Huawei_LiteOS.bin" -serial mon:stdio -nographic <


********Hello Huawei LiteOS********

LiteOS Kernel Version : 5.1.0
Processor : Cortex-A9 * 4
Run Mode : SMP
GIC Rev : GICv1
build time : Sep 30 2021 17:05:17

**********************************

main core booting up...
OsAppInit
releasing 3 secondary cores
cpu 0 entering scheduler
cpu 1 entering scheduler
cpu 3 entering scheduler
cpu 2 entering scheduler
app init!

Huawei LiteOS # help ## 注:这是内建的命令
*******************shell commands:*************************

date free help hwi memcheck stack swtmr systeminfo
task uname watch

调试

在配置界面,在调试器界面指定可执行文件。按 F5 启动调试。

bpx-a9研究

入口文件

reset_vector.S,各种初始化(reset_vector、异常处理、OsIrqHandler),跳转到 main 函数。

1
2
3
4
5
6
7

b reset_vector
true--> excstatck_loop_done
truetrue--> cpu_start
truetrue--> enable_scu
truetrue--> board_config // 目标板实现
truetrue--> main // 目标板主函数

board_config:一般赋值系统内存结束地址为某个值,如果注释掉,内存初始化失败。

串口打印

定义宏 LOSCFG_DRIVERS_UART_ARM_PL011,实现文件在 drivers\uart\src\arm_pl011。

自定义shell

DemoEntry 中初始化了 shell,动态注册 shell 必须在此函数之后。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
注册:
#include "shcmd.h"
#include "shell.h"

__attribute__((weak)) VOID app_init(VOID)
{
printf("app init!\n");
DemoEntry();

osCmdReg(CMD_TYPE_EX, "foobar", 0,(CMD_CBK_FUNC)OsShellCmdFooBar);
}

实现:
INT32 OsShellCmdFooBar(INT32 argc, const CHAR **argv)
{
printf("my cmd...\n");
return 0;
}

参考

安装:https://liteos.gitee.io/liteos_studio/#/install  
qemu示例:https://juejin.cn/post/6906386181001314317