首發(fā):Rice 嵌入式開發(fā)技術(shù)分享
作者:RiceDIY
已經(jīng)大半個(gè)月沒有更新文章了,大家還記得之前作者寫的一篇關(guān)于RT-Thread的微內(nèi)核移植的文章嗎?
《如何移植RTT微內(nèi)核到樹莓派3B》
目前RTT微內(nèi)核是RTT提供的體驗(yàn)版本。它采用了scons構(gòu)建。作者也是剛接觸scons,不是很了解,在這不過多的說明。那么來談?wù)劄槭裁床皇褂胹cons,采用cmake編譯。不是因?yàn)閟cons不好,而是之前作者在寫關(guān)于cmake的文章中,熊大(RTT的創(chuàng)始人)看到,然后在交流中,熊大說可以采用cmake進(jìn)行編譯。所以我也是冒著嘗試的想法,開始了使用cmake去構(gòu)建微內(nèi)核。下面幾篇文章是關(guān)于CMake理論的文章。
《CMake,大型項(xiàng)目采用的構(gòu)建工具》
《CMake 靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)構(gòu)建》
《CMake 教你如何鏈接共享庫(kù)》
在構(gòu)建過程中,由于不是很熟悉整個(gè)構(gòu)建流程,在熊大親自指導(dǎo)下,讓我清晰很多。非常感謝熊大的支持。
其實(shí)整個(gè)過程最麻煩的編譯選項(xiàng)的問題,特別是最后鏈接部分,這也是我花費(fèi)最長(zhǎng)去研究的。接下來,說一說微內(nèi)核初步版本(只單獨(dú)編譯一個(gè)application)。
整個(gè)CMakeLists.txt文件如下,下面對(duì)每一行進(jìn)行說明:
cmake_minimum_required(VERSION 3.10)
1.檢查cmake的版本
cmake_minimum_required(VERSION 3.10)
2.其中
CMAKE/_SYSTEM/_NAME:這個(gè)變量被設(shè)置,cmake才認(rèn)為采用交叉編譯,CMAKE/_SYSTEM/_NAME即目標(biāo)機(jī)target所在的操作系統(tǒng)名稱,比如ARM或者Linux你就需要寫”Linux”,如果Android平臺(tái)你就寫”Android”,如果你的嵌入式平臺(tái)沒有相關(guān)OS你即需要寫成”Generic”。
CMAKE/_SYSTEM/_PROCESSOR:代表目標(biāo)系統(tǒng)的硬件或者CPU的型號(hào),例如ARM、X86。
set(CMAKE_SYSTEM_NAME Generic)
3.關(guān)閉編譯檢測(cè)
set(CMAKE_C_COMPILER_FORCED TRUE)
4.定義sdk和apps兩個(gè)目錄變量。
set(microkernel_sdk_dir "${CMAKE_SOURCE_DIR}/sdk")
5.定義項(xiàng)目的名字。
project(rtt_microkernel)
6.使能可以支持的語言,這里使能C語言和匯編語言。如果不是能,則相關(guān)文件不會(huì)進(jìn)行編譯。
enable_language(C ASM)
7.添加宏,即打開源文件的某項(xiàng)宏定義
add_definitions(
8.添加編譯選項(xiàng),由于不同源文件添加的編譯選項(xiàng)的不同,所以需要分別添加(分別是:C,匯編,C++, 鏈接),分別如下:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-a -marm -msoft-float -Werror -Wall -O0 -g -gdwarf-2 -n -pie -fpie -fPIC -fpic --static -nostdinc")
如何看我們添加的編譯選項(xiàng)是否正確。我們編譯采用外部編譯,在build目錄執(zhí)行(cmake ..),然后查看flags.make文件。
flags.make文件的內(nèi)容如下(包含相關(guān)語言的編譯選項(xiàng),宏定義,相關(guān)頭文件路徑):我們通過這個(gè)文件查看是否正確:
9.定義兩個(gè)頭文件變量,分別是sdk頭文件目錄和apps頭文件目錄:
set(microkernel_sdk_inc
10.定義兩個(gè)源文件變量,分別是sdk源文件和apps源文件:
set(microkernel_sdk_src
11.定義可執(zhí)行文件的后綴。
set(CMAKE_EXECUTABLE_SUFFIX ".elf")
12.根據(jù)源文件,添加一個(gè)可執(zhí)行文件。
add_executable(${PROJECT_NAME} ${microkernel_apps_src} ${microkernel_sdk_src})
13.添加目標(biāo)所依賴的頭文件目錄
target_include_directories(${PROJECT_NAME}PRIVATE${microkernel_sdk_inc}${microkernel_apps_inc})
14.添加目標(biāo)依賴的鏈接庫(kù)。以及鏈接腳本。
target_link_libraries(${PROJECT_NAME}
15.最后鏈接生成可執(zhí)行文件的命令是否正確,我們可以查看link.txt文件。
link.txt文件內(nèi)容如下:
編譯測(cè)試:
1.測(cè)試應(yīng)用如下:
2.生成可執(zhí)行文件:rtt/_microkernel.elf.
3.運(yùn)行驗(yàn)證(燒錄到樹莓派上進(jìn)行驗(yàn)證):
如上是整個(gè)測(cè)試以及CMakeLists.txt講解。有疑問,請(qǐng)私聊作者。
審核編輯 黃昊宇
-
RTT
+關(guān)注
關(guān)注
0文章
65瀏覽量
17225 -
CMake
+關(guān)注
關(guān)注
0文章
28瀏覽量
1309
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
關(guān)于驅(qū)動(dòng)編譯進(jìn)蜂鳥派內(nèi)核時(shí)候遇到的問題
Triton編譯器安裝步驟詳解
Triton編譯器與其他編譯器的比較
飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核編譯之初次編譯
【敏矽微ME32G070開發(fā)板免費(fèi)體驗(yàn)】使用JLINK的RTT功能實(shí)現(xiàn)類似串口printf打印功能
linux驅(qū)動(dòng)程序的編譯方法是什么
linux驅(qū)動(dòng)程序的編譯方法有哪兩種
esp-box-0.5.0\\esp-box-0.5.0\\examples\\factory_demo編譯出錯(cuò)是什么原因?qū)е碌模?/a>
openthread組件使用源代碼編譯出錯(cuò)的原因?
剛剛裝好esp32 elipse CMAKE編譯環(huán)境,hello word編譯不通過怎么解決?
VSCode中編譯過程cmake錯(cuò)誤的原因?
如何編譯OTA時(shí)的加密固件?
微內(nèi)核實(shí)時(shí)操作系統(tǒng)的介紹
請(qǐng)問一下CMake和Make之間的區(qū)別有哪些?
鴻蒙輕內(nèi)核源碼分析:Newlib C
![鴻蒙輕<b class='flag-5'>內(nèi)核</b>源碼分析:Newlib C](https://file1.elecfans.com//web2/M00/C0/FD/wKgaomXRtJWAcFAVAAAJMiBrCl8247.png)
評(píng)論