目录
[2.1 概述](#2.1 概述)
[2.2 编译器](#2.2 编译器)
[2.3 make使用](#2.3 make使用)
本文章引用了很多韦东山老师的教程内容,算是我学习过程中的笔记吧。如果侵权请联系我。
一、鸿蒙是什么
这里我补充一下对鸿蒙的描述
这张图片是鸿蒙发布时使用的,鸿蒙是一个很大的东西但是看起来他和linux差不多,其实内核和操作系统是两个东西,或者说他们是包含关系,内核是操作系统的一部分。这个在一年前我学linux时写文章就有提到过。鸿蒙的内核可以是linux也可以是liteos,这里沿用了ARM架构的划分根据芯片的电路复杂程度划分成了a和m两个级别。底层可能不太一样,因为linux是宏内核,驱动是内核的一部分。所以我们经常要插入驱动模块。在很久以前linux连插入功能都没有,只能重新编译然后重启。鸿蒙用的是微内核,把驱动分离出来了有个驱动子系统。在向上就是服务框架了,linux也是各种server思想上是差不多的。服务上就是用户可编辑的应用层。概念很大,但是这里的每个点都需要开发人员一起去优化。可做的东西还挺多的。
随着科技发展现在纯m核的芯片性能也很强a和m的界限变得很模糊,我现在有个疑问就是a和m的本质区别是什么。
我在韦东山老师的社区也发了。
m和a的区别到底在哪,或者说mcu和soc的界限在哪 - 嵌入式Linux开发 - 嵌入式开发问答社区
鸿蒙的liteos-a没有linux那么强大,它属于RTOS的范畴,小,启动快速,非常适合用在嵌入式领域。后面发展前景也不错,所以我毕设也选的它。不过工作量评估错误,现在有做不完的风险了。
鸿蒙IDE分为南向和北向,北向指APP南向是内核
下面是APP开发的插件,基于vscode的
华为集成开发环境IDE DevEco Device Tool下载 | HarmonyOS设备开发
二、Kconfig
2.1 概述
所以内核只要支持menuconfig都是使用的Kconfig,可以从一下途径获取资料。
任一个Linux内核的Documentation\kbuild\kconfig-language.rst
https://www.rt-thread.org/document/site/programming-manual/kconfig/kconfig/
链接是RT-thread的开发指南,其实RT-thread也是个很先进的RTOS,而且是国产的。年轻人总是有孜孜不倦的创造力。老的操作系统由于其附带资源太多已经难以调转研发方向(这里应该有个很贴切的成语,我忘记了叫什么,哈哈文盲了。)RT-thread支持命令行,smart版本还支持用户态。由于Linux的成功性和当前世界主流程序员大佬的编程风格都喜欢命令行所以现在很多新的系统都是模仿linux来做的。(用着确实舒服了,而且适应起来也很快)
cp tools/build/config/debug/imx6ull_clang.config .config // 配置
make clean // 先清除一下,否则会提示错误
make -j 8 // 编译内核,可以得到out/imx6ull/liteos.bin
make rootfs // 编译根文件系统,可以得到rootfs.img
cp out/imx6ull/rootfs.img out/imx6ull/rootfs.jffs2 // 改个名易辨认,烧写工具使用rootfs.jffs2
完整编译过程
内核的配置包括架构、芯片公司、芯片型号、板卡、硬件的版本。
因为可以用图形化配置我们试试都能配置什么
执行命令make menuconfig
可选的东西很多
我们可以对比一下linux的,少了很多东西因为驱动是分离的所以这里修改的只是原语上面那层
回到liteos的编译这里可以选编译器,我们linux编译器这里是直接指定一个字符串的可选更丰富一些。
可以选单片机型号
这里是韦东山老师移植的时候加的,正常只支持海思的芯片顶多加点RK的
还可以选GIC的版本,但是说实话我不知道这个GIC是不是指的中断控制器
还可以启动一些内核的特性
driver这里只到总线这层没具体的设备,linux的还支持具体设备选择。期待进一步丰富
在之前学习linux我就有说过这些所有的menuconfig图形化可配置的项都来源于.config这个文件
每个菜单的具体描述都在Kconfig这个文件中
具体语法可以看韦东山老师的网站提供的文档。解释很详细。这里我就不赘述了。
后面毕设做完有时间的话出一期相关语法的学习
2.2 编译器
编译最常用的肯定就是gcc+make了,我的hardware simuliation项目搭建环境的时候演示过,代码在csdn我以前发布的文章里。视频B站有。讲解过程就简化一下咯windows的gcc环境我就不安啦。
简单复习一下编译过程和gcc使用方法
其实编译器比操作系统更有技术深度,只是复杂度没操作系统高。
一个c/c++文件要经过预处理、编译、汇编和链接才能变成可执行文件。
(1)预处理 C/C++源文件中,以"#"开头的命令被称为预处理命令,如包含命令"#include"、宏定义命令"#define"、条件编译命令"#if"、"#ifdef"等。预处理就是将要包含(include)的文件插入原文件中、将宏定义展开、根据条件编译命令选择要使用的代码,最后将这些东西输出到一个".i"文件中等待进一步处理。
(2)编译 编译就是把C/C++代码(比如上述的".i"文件)"翻译"成汇编代码。
(3)汇编 汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码,在Linux系统上一般表现为ELF目标文件(OBJ文件)。"反汇编"是指将机器代码转换为汇编代码,这在调试程序时常常用到。
(4)链接 链接就是将上步生成的OBJ文件和系统库的OBJ文件、库文件链接起来,最终生成了可以在特定平台运行的可执行文件。
hello.c(预处理)->hello.i(编译)->hello.s(汇编)->hello.o(链接)->hello
bash
echo 'main(){}'| gcc -E -v - // 它会列出头文件目录、库目录(LIBRARY_PATH)
2.3 make使用
我写过好多文章大家可以参考下,也可以参考我的另一个项目写的
【002-编译框架搭建】 https://www.bilibili.com/video/BV1mN4y177mH/?share_source=copy_web\&vd_source=14a18fc17fc55c8c188a7883c6a4c42e
最近在移植有好多问题想交流一下感兴趣的同学可以一起:814096189