1. 基礎知識
移植內核對技術的要求比較高、比較細。
1.1 單片機相關的知識
-
棧的作用
-
加載地址、鏈接地址
-
重定位
-
幾個簡單的硬件知識
串口
定時器
-
定時器
-
中斷的概念
1.2 Linux操作相關的知識
-
Linux常用命令
-
簡單的腳本:腳本就是把命令寫在一個文件里
-
Makefile
-
GCC編譯命令
1.3 芯片相關知識
-
能閱讀芯片手冊(英文):移植最小系統時,涉及的手冊內容不多
-
能看懂硬件原理圖:移植最小系統時,涉及的原理圖內容不多
2. 驅動程序知識
對於只有單片機知識的人來說,怎么去操作硬件?
-
直接讀寫寄存器
-
使用庫函數
在RTOS中,本質也是去讀寫寄存器,但是需要有統一的驅動程序框架。
所以:RTOS驅動 = 驅動框架 + 硬件操作
2.1 以點燈為例
2.1.1 硬件原理
2.1.2 單片機點燈
- 方法1:直接讀寫寄存器
- 方法2:使用廠家的HAL庫
2.1.3 FreeRTOS點燈
2.1.4 rt-thread點燈
- 方法1:直接操作寄存器
- 方法2:使用驅動程序
驅動模型如下:
驅動示例如下:
調用過程框架
調用過程示例
2.1.5 Liteos-a/Linux怎么點燈
使用MMU時,一般APP與內核是相互隔離的。APP通過標准的open/read/write等文件操作函數去調用驅動程序。
如下圖所示:
為何要多此一舉?
-
它們支持MMU(內存管理單元)
-
用戶程序跟內核是分隔開的,用戶程序不能直接讀寫寄存器
-
用戶程序通過標准接口訪問驅動程序
-
基於這些內核的軟件一般都比單片機軟件復雜,術業有專攻
-
不應該讓寫APP的人去看原理圖、寫驅動、寫寄存器
-
軟件和硬件隔離,硬件再怎么變化,只需要改驅動,APP不需要改
2.1.6 Android怎么點燈
-
Android是Linux操作系統上的一套操作系統
-
Android通過Linux來訪問硬件,本質還是Linux驅動
-
一般的C程序、C++程序,可以直接調用open/read/write等函數
-
使用java編寫的程序要訪問C函數需要通過JNI
2.2 以LCD為例
2.2.1 硬件原理
-
設置LCD控制器,它會自動從FrameBuffer中讀取每個像素的數據發送到LCD上
-
把要顯示的文字、圖像放入FrameBuffer中
2.2.2 Liteos-a/Linux怎么操作LCD
為何要多此一舉?
-
它們支持MMU(內存管理單元)
-
用戶程序跟內核是分隔開的,用戶程序不能直接讀寫寄存器
-
用戶程序通過標准接口訪問驅動程序
-
基於這些內核的軟件一般都比單片機軟件復雜,術業有專攻
-
不應該讓寫APP的人去看原理圖、寫驅動、寫寄存器
-
軟件和硬件隔離,硬件再怎么變化,只需要改驅動,APP不需要改
2.2.3 Android怎么操作LCD
Android/QT等GUI系統里:
-
LCD會被多個APP使用,如果不統一管理必定亂套
-
所以,肯定有一個管理軟件,或稱為服務軟件
-
APP自行構造自己的界面,提交給顯示顯示服務軟件
-
顯示服務軟件:根據多個APP的前后層次,合並最終的顯示圖像
-
再調用驅動程序顯示出來
2.2.4 鴻蒙怎么操作LCD
鴻蒙支持Liteos、Linux內核,在內核之上怎么去為多個APP管理唯一的顯示設備?
鴻蒙還支持軟總線,理論上可以支持更多的LCD,怎么做?
務軟件:
- 根據多個APP的前后層次
- 合並最終的顯示圖像
- 再調用驅動程序顯示出來
原文鏈接:https://developer.huawei.com/consumer/cn/forum/topic/0201396913445810055?fid=0101303901040230869
作者:韋東山