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的驱动