当前位置:   article > 正文

鸿蒙南向开发:LiteOS-M内核支持musl与newlib平滑切换方案_定义和新版本的newlib冲突了

定义和新版本的newlib冲突了

背景

当前M核编译时上层组件与内核统一使用musl-C,位于//third_party/musl/porting/liteos_m/kernel/,内核当前的内部实现也是主要适配musl的结构体定义,但社区及三方厂商开发多使用公版工具链arm-none-eabi-gcc加上私有定制优化进行编译,考虑我们内核的易用性提升,故支持公版arm-none-eabi-gccC库编译内核运行。

Newlib

  1. newlib是小型C库,针对posix接口涉及系统调用的部分,newlib提供一些需要系统适配的钩子函数,例如_exit()_open()_close()_gettimeofday()等,操作系统适配这些钩子,就可以使用公版newlib工具链编译运行程序。

  2. 公版arm-none-eabi-工具链中带有通用newlib的C库头文件,在一份通用的C库头文件中,使用不同的宏开关来控制一些 宏、类型、结构体、函数的声明或者定义。这些宏有以下几种:

    1> 根据posix标准划分,例如:_POSIX_TIMERS,_POSIX_CPUTIME,_POSIX_THREADS等。

    2> 根据已支持的系统,例如:__CYGWIN____rtems____unix__等。

    3> 根据C库不同版本,例如:_GNU_SOURCE,_BSD_SOURCE 等。

方案

当前内核现状

  1. LiteOS-M不区分用户态内核态,上层组件与内核共用一套基于musl的C库,虽然编译时使用arm-none-eabi-gcc,但只使用其工具链的编译功能,通过加上-nostdinc-nostdlib强制使用我们自己改造后的musl-C。

  2. 内核提供了基于LOS_XXX适配实现pthread、mqeue、fs、semaphore、time等模块的posix接口(//kernel/liteos_m/kal/posix

  3. 内核提供的posix接口与musl中的标准C库接口共同组成LiteOS-M的LibC。

适配变更

  1. 适配newlib预留的钩子
  2. 针对当前内核的能力,去定义_POSIX_XXX的能力开关,来打开工具链里的所需内容的声明或定义
  3. 针对当前内核的具体实现,如果newlib中结构体的定义或者宏与内核相冲突,以当前内核具体实现为准
  4. 用自研的posix接口去补充或替换newlib的部分实现,根据posix标准补充newlib拓展头文件
  5. 系统编译过程支持newlib与musl平滑切换

最终实现

LiteOS-M的LibC组成结构:

newlib的适配实现:

  1. 头文件的适配:

    原因类型实施方法例如
    头文件缺失根据系统的实现所需,补充相关的标准声明定义<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>
  2. 实现的适配:

    原因类型实施方法例如
    接口实现缺失采用内核自研接口补充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

使用方式

  1. 当前产品编译时指定依赖内核后,会默认添加依赖内核的对外接口(LOS_XXX、libc),不必显式指明include路径。
  2. 在//kernel/liteos_m目录下使用make menuconfig-->Compat-->Choose libc implementation选择newlibc
  3. 项目根目录hb build -f即可

注意

  1. malloc函数相关功能当前采用了wrap方式,以采用内核提供的内存分配管理算法。
  2. printf函数采用newlib默认实现,单板进行适配时,需要根据板端所需能力提供printf的实现。
  3. 若newlib中缺少所需声明或定义,可参照内核具体实现以及业界C库标准定义在//kernel/liteos_m/kal/libc/newlib/porting/include中进行补充


最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

鸿蒙HarmonyOS Next全套学习资料←点击领取!(安全链接,放心点击

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!

鸿蒙(HarmonyOS NEXT)最新学习路线

有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。

获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

HarmonyOS Next 最新全套视频教程

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

《鸿蒙开发基础》

  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

《鸿蒙开发进阶》

  • Stage模型入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 通知与窗口管理
  • 多媒体技术
  • 安全技能
  • 任务管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向未来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

《鸿蒙进阶实战》

  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

大厂面试必问面试题

鸿蒙南向开发技术

鸿蒙APP开发必备

鸿蒙生态应用开发白皮书V2.0PDF

获取以上完整鸿蒙HarmonyOS学习资料,请点击→

纯血版全套鸿蒙HarmonyOS学习资料

总结
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/878799
推荐阅读
相关标签
  

闽ICP备14008679号