当前M核编译时上层组件与内核统一使用musl-C,位于//third_party/musl/porting/liteos_m/kernel/
,内核当前的内部实现也是主要适配musl的结构体定义,但社区及三方厂商开发多使用公版工具链arm-none-eabi-gcc
加上私有定制优化进行编译,考虑我们内核的易用性提升,故支持公版arm-none-eabi-gcc
C库编译内核运行。
newlib是小型C库,针对posix接口涉及系统调用的部分,newlib提供一些需要系统适配的钩子函数,例如_exit()
,_open()
,_close()
,_gettimeofday()
等,操作系统适配这些钩子,就可以使用公版newlib工具链编译运行程序。
公版arm-none-eabi-
工具链中带有通用newlib的C库头文件,在一份通用的C库头文件中,使用不同的宏开关来控制一些 宏、类型、结构体、函数的声明或者定义。这些宏有以下几种:
1> 根据posix标准划分,例如:_POSIX_TIMERS
,_POSIX_CPUTIME
,_POSIX_THREADS
等。
2> 根据已支持的系统,例如:__CYGWIN__
,__rtems__
,__unix__
等。
3> 根据C库不同版本,例如:_GNU_SOURCE
,_BSD_SOURCE
等。
LiteOS-M不区分用户态内核态,上层组件与内核共用一套基于musl的C库,虽然编译时使用arm-none-eabi-gcc
,但只使用其工具链的编译功能,通过加上-nostdinc
与-nostdlib
强制使用我们自己改造后的musl-C。
内核提供了基于LOS_XXX适配实现pthread、mqeue、fs、semaphore、time等模块的posix接口(//kernel/liteos_m/kal/posix
)
内核提供的posix接口与musl中的标准C库接口共同组成LiteOS-M的LibC。
LiteOS-M的LibC组成结构:
newlib的适配实现:
头文件的适配:
原因类型 | 实施方法 | 例如 |
---|---|---|
头文件缺失 | 根据系统的实现所需,补充相关的标准声明定义 | <poll.h> |
被特定宏控制的声明定义 |
//kernel/liteos_m/kal/libc/newlib/porting/include 中添加同名头文件,采用-I {kernel/liteos_m/kal/libc/newlib/porting/include} 加#include_next <XXX.h> 的方式,编译时先找到我们新增的同名头文件,打开相关的宏开关,再找到工具链的原始头文件,获得所需的声明定义。 |
<sys/features.h> + <time.h> |
声明、定义差异 | 根据系统的具体实现,与#include_next 结合使用,替换工具链中的原始声明定义 |
<sys/_pthreadtypes.h> |
实现的适配:
原因类型 | 实施方法 | 例如 |
---|---|---|
接口实现缺失 | 采用内核自研接口补充 | kal/libc/newlib/porting/src/fs.c |
newlib钩子适配 | 采用当前内核实现的LOS_XXX接口适配或者默认空实现 | kal/libc/newlib/porting/src/other_adapt.c |
采用定制化的接口实现 | 通过wrap编译选项,替换工具链中的默认实现 | kal/libc/newlib/porting/src/malloc.c |
make menuconfig
-->Compat
-->Choose libc implementation
选择newlibc
hb build -f
即可//kernel/liteos_m/kal/libc/newlib/porting/include
中进行补充此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。