Libc

XWOS/xwos 内核对libc的依赖

  • string.h:依赖 memset()memcpy()
  • stdlib.h
    • 当配置了 XWOSCFG_SKD_THD_STDC_MMXWOSCFG_SKD_SWT_STDC_MMXWOSCFG_SYNC_SEM_STDC_MMXWOSCFG_SYNC_COND_STDC_MMXWOSCFG_SYNC_EVT_STDC_MMXWOSCFG_LOCK_MTX_STDC_MM 时, 依赖 malloc()free() 函数动态创建和删除对象;
  • inttypes.hstdint.hstddef.h :XWOS的基本类型基于标准C的基本类型进行定义;
  • stdbool.h:依赖bool类型的定义;
  • stdatomic.h:依赖原子操作内存屏障的定义;
  • stdarg.h
    • XWLIBCFG_SC 配置为 1xwos/lib/sc.h 需要使用变参函数;
    • XWLIBCFG_LOG 配置为 1xwos/lib/xwlog.c 需要使用变参函数;
  • stdio.h:若 XWLIBCFG_LOG 配置为 1xwos/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 的函数。
  • XWCFG_LIBC 配置为 picolibc 时,这些函数由 xwmd/libc/picolibcac/mem.c 提供底层支持, 并覆盖了picolibc中原有的实现。 xwmd/libc/picolibcac/mem.c 中的实现是对 mempool 的封装,
    • mempool 需要在 board_init() 中选择内存设备进行初始化后才可使用,并且需要提供 picolibcac_mempool 定义才可使用 stdlib.h 的函数。

newlibac_mempoolpicolibcac_mempool 需要BSP中提供定义,不同的工程情况不一致,XWOS项目组提供几个示例工程, 可以参考工程的 README.md 中的 libc 章节获得说明:

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 章节获得说明:

TLS

TODO

stdatomic

TODO

数学库

若SOC有FPU,并且配置 ARCHCFG_FPU1 ,则支持 libm

其他libc的功能

  • ctype: 字符类型
  • wchar: 多字节字符
  • iconv: 字符集转换
  • locale: 区域,暂时不支持
  • search: 查找
  • argz: 字符串数组
  • time: 时间,暂时不支持,需要底层提供RTC的驱动