Libc
Categories:
2 分钟阅读
XWOS/xwos
内核对libc的依赖
string.h
:依赖memset()
、memcpy()
;stdlib.h
- 当配置了
XWOSCFG_SKD_THD_STDC_MM
、XWOSCFG_SKD_SWT_STDC_MM
、XWOSCFG_SYNC_SEM_STDC_MM
、XWOSCFG_SYNC_COND_STDC_MM
、XWOSCFG_SYNC_EVT_STDC_MM
或XWOSCFG_LOCK_MTX_STDC_MM
时, 依赖malloc()
和free()
函数动态创建和删除对象;
- 当配置了
inttypes.h
、stdint.h
、stddef.h
:XWOS的基本类型基于标准C的基本类型进行定义;stdbool.h
:依赖bool类型的定义;stdatomic.h
:依赖原子操作内存屏障的定义;stdarg.h
- 若
XWLIBCFG_SC
配置为1
,xwos/lib/sc.h
需要使用变参函数; - 若
XWLIBCFG_LOG
配置为1
,xwos/lib/xwlog.c
需要使用变参函数;
- 若
stdio.h
:若XWLIBCFG_LOG
配置为1
,xwos/lib/xwlog.c
中格式化日志依赖vsnprintf()
。
XWOS/xwmd
提供的对libc的支持
动态内存管理
-
stdlib.h
-
malloc()
-
free()
-
cfree()
-
realloc()
-
calloc()
-
memalign()
-
aligned_alloc()
-
valloc()
-
pvalloc()
-
根据配置中选择的libc:
- 当
XWCFG_LIBC
配置为newlib
时,这些函数由xwmd/libc/newlibac/mem.c
提供底层支持, 并覆盖了newlib中原有的实现。xwmd/libc/newlibac/mem.c
中的实现是对 mempool 的封装,- mempool 需要在
board_init()
中选择内存设备进行初始化后才可使用,并且需要提供newlibac_mempool
定义才可使用stdlib.h
的函数。
- mempool 需要在
- 当
XWCFG_LIBC
配置为picolibc
时,这些函数由xwmd/libc/picolibcac/mem.c
提供底层支持, 并覆盖了picolibc中原有的实现。xwmd/libc/picolibcac/mem.c
中的实现是对 mempool 的封装,- mempool 需要在
board_init()
中选择内存设备进行初始化后才可使用,并且需要提供picolibcac_mempool
定义才可使用stdlib.h
的函数。
- mempool 需要在
newlibac_mempool
或 picolibcac_mempool
需要BSP中提供定义,不同的工程情况不一致,XWOS项目组提供几个示例工程,
可以参考工程的 README.md
中的 libc
章节获得说明:
- ATKSTM32F407ZXWOS:正点原子F407核心板
- EmbedFireStm32H743XWOS:野火STM32H743-Pro开发板
- AtkApolloH743XWOS:正点原子阿波罗STM32H743开发板
- FK429M1XWOS:反客STM32F429-M1开发板
- WeActMiniStm32H750XWOS:微行电子MiniStm32H750开发板
setjmp()/longjmp()
setjmp()
和 longjmp()
函数对可实现在不同函数间的 goto
。
用户应该使用头文件 xwos/lib/setjmp.h
中代替标准C的头文件 setjmp.h
,
并且也应该使用 xwlib_setjmp()
与 xwlib_longjmp()
代替 setjmp()
和 longjmp()
。
此外,setjmp()/longjmp()
在 MISRA-C:2012
标准中被禁止使用。
errno
XWOS重构了 errno
的实现,将 errno
改为每个线程的私有变量,
线程访问 errno
时,只会访问自己的 errno
。
用户应该使用 xwos/lib/errno.h
替代libc中的 errno.h
。
根据配置中选择的libc:
- 当
XWCFG_LIBC
配置为newlib
时,errno
的实现位于xwmd/libc/newlibac/errno.c
; - 当
XWCFG_LIBC
配置为picolibc
时,errno
的实现位于xwmd/libc/picolibcac/errno.c
。
文件操作
- 头文件
stdio.h
-
fopen()
-
fclose()
-
fread()
-
fwrite()
-
fseek()
-
remove()
-
rename()
-
根据配置中选择的libc:
- 当
XWCFG_LIBC
配置为newlib
时,这些函数由xwmd/libc/newlibac/fops.c
提供底层支持,xwmd/libc/newlibac/fops.c
又依赖第三方软件xwem/fs/fatfs
; - 当
XWCFG_LIBC
配置为picolibc
时,这些函数由xwmd/libc/picolibcac/fops.c
提供底层支持,xwmd/libc/picolibcac/fops.c
又依赖第三方软件xwem/fs/fatfs
。
FatFs需要BSP中提供对块设备操作的支持,不同的电路板对文件操作的支持情况不一致,XWOS项目组提供几个示例工程,
可以参考工程的 README.md
中的 FatFS
章节获得说明:
- ATKSTM32F407ZXWOS:正点原子F407核心板
- EmbedFireStm32H743XWOS:野火STM32H743-Pro开发板
- AtkApolloH743XWOS:正点原子阿波罗STM32H743开发板
- FK429M1XWOS:反客STM32F429-M1开发板
- WeActMiniStm32H750XWOS:微行电子MiniStm32H750开发板
TLS
TODO
stdatomic
TODO
数学库
若SOC有FPU,并且配置 ARCHCFG_FPU
为 1
,则支持 libm
。
其他libc的功能
- ctype: 字符类型
- wchar: 多字节字符
- iconv: 字符集转换
- locale: 区域,暂时不支持
- search: 查找
- argz: 字符串数组
- time: 时间,暂时不支持,需要底层提供RTC的驱动