0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么使用CMake編譯RTT微內(nèi)核

電子設(shè)計 ? 來源:電子設(shè)計 ? 作者:電子設(shè)計 ? 2020-12-14 22:33 ? 次閱讀

首發(fā):Rice 嵌入式開發(fā)技術(shù)分享
作者:RiceDIY

已經(jīng)大半個月沒有更新文章了,大家還記得之前作者寫的一篇關(guān)于RT-Thread的微內(nèi)核移植的文章嗎?

《如何移植RTT微內(nèi)核到樹莓派3B》
目前RTT微內(nèi)核是RTT提供的體驗版本。它采用了scons構(gòu)建。作者也是剛接觸scons,不是很了解,在這不過多的說明。那么來談?wù)劄槭裁床皇褂胹cons,采用cmake編譯。不是因為scons不好,而是之前作者在寫關(guān)于cmake的文章中,熊大(RTT的創(chuàng)始人)看到,然后在交流中,熊大說可以采用cmake進行編譯。所以我也是冒著嘗試的想法,開始了使用cmake去構(gòu)建微內(nèi)核。下面幾篇文章是關(guān)于CMake理論的文章。

《CMake,大型項目采用的構(gòu)建工具》

《CMake 靜態(tài)庫與動態(tài)庫構(gòu)建》

《CMake 教你如何鏈接共享庫》

在構(gòu)建過程中,由于不是很熟悉整個構(gòu)建流程,在熊大親自指導(dǎo)下,讓我清晰很多。非常感謝熊大的支持。
其實整個過程最麻煩的編譯選項的問題,特別是最后鏈接部分,這也是我花費最長去研究的。接下來,說一說微內(nèi)核初步版本(只單獨編譯一個application)。
整個CMakeLists.txt文件如下,下面對每一行進行說明:

cmake_minimum_required(VERSION 3.10)

1.檢查cmake的版本

cmake_minimum_required(VERSION 3.10)

2.其中

CMAKE/_SYSTEM/_NAME:這個變量被設(shè)置,cmake才認為采用交叉編譯,CMAKE/_SYSTEM/_NAME即目標(biāo)機target所在的操作系統(tǒng)名稱,比如ARM或者Linux你就需要寫”Linux”,如果Android平臺你就寫”Android”,如果你的嵌入式平臺沒有相關(guān)OS你即需要寫成”Generic”。
CMAKE/_SYSTEM/_PROCESSOR:代表目標(biāo)系統(tǒng)的硬件或者CPU的型號,例如ARM、X86。

set(CMAKE_SYSTEM_NAME Generic)

3.關(guān)閉編譯檢測

set(CMAKE_C_COMPILER_FORCED TRUE)

4.定義sdk和apps兩個目錄變量。

set(microkernel_sdk_dir "${CMAKE_SOURCE_DIR}/sdk")

5.定義項目的名字。

project(rtt_microkernel)

6.使能可以支持的語言,這里使能C語言匯編語言。如果不是能,則相關(guān)文件不會進行編譯。

enable_language(C ASM)

7.添加宏,即打開源文件的某項宏定義

add_definitions(

8.添加編譯選項,由于不同源文件添加的編譯選項的不同,所以需要分別添加(分別是: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")

如何看我們添加的編譯選項是否正確。我們編譯采用外部編譯,在build目錄執(zhí)行(cmake ..),然后查看flags.make文件。

flags.make文件的內(nèi)容如下(包含相關(guān)語言的編譯選項,宏定義,相關(guān)頭文件路徑):我們通過這個文件查看是否正確:

9.定義兩個頭文件變量,分別是sdk頭文件目錄和apps頭文件目錄:

set(microkernel_sdk_inc 

10.定義兩個源文件變量,分別是sdk源文件和apps源文件:

set(microkernel_sdk_src 

11.定義可執(zhí)行文件的后綴。

set(CMAKE_EXECUTABLE_SUFFIX ".elf")

12.根據(jù)源文件,添加一個可執(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)依賴的鏈接庫。以及鏈接腳本。

target_link_libraries(${PROJECT_NAME}

15.最后鏈接生成可執(zhí)行文件的命令是否正確,我們可以查看link.txt文件。

link.txt文件內(nèi)容如下:

編譯測試:

1.測試應(yīng)用如下:

2.生成可執(zhí)行文件:rtt/_microkernel.elf.

3.運行驗證(燒錄到樹莓派上進行驗證):

如上是整個測試以及CMakeLists.txt講解。有疑問,請私聊作者。

審核編輯 黃昊宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • RTT
    RTT
    +關(guān)注

    關(guān)注

    0

    文章

    65

    瀏覽量

    17063
  • CMake
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    1259
收藏 人收藏

    評論

    相關(guān)推薦

    linux驅(qū)動程序的編譯方法是什么

    Linux驅(qū)動程序的編譯方法主要包括兩種: 與內(nèi)核一起編譯編譯成獨立的內(nèi)核模塊 。以下是對這兩種方法的介紹: 一、與
    的頭像 發(fā)表于 08-30 14:46 ?368次閱讀

    linux驅(qū)動程序的編譯方法有哪兩種

    Linux驅(qū)動程序的編譯方法主要可以歸納為兩種: 手動編譯 和 使用內(nèi)核構(gòu)建系統(tǒng)(Makefile)自動編譯 。 1. 手動編譯 手動
    的頭像 發(fā)表于 08-30 14:39 ?469次閱讀

    esp-box-0.5.0\\esp-box-0.5.0\\examples\\factory_demo編譯出錯是什么原因?qū)е碌模?/a>

    使用的VSCODE搭建的編譯環(huán)境,安裝的esp-idf-v5.1.1,編譯hello_world可正常編譯; 編譯源碼
    發(fā)表于 06-27 07:04

    openthread組件使用源代碼編譯出錯的原因?

    menuconfig里使能Build esp_openthread libraries from source)的形式再編譯ot_cil的話會報錯: CMake Error at ../../../tools
    發(fā)表于 06-19 06:57

    剛剛裝好esp32 elipse CMAKE編譯環(huán)境,hello word編譯不通過怎么解決?

    CMake Error at E:/Work/eclipse-esp/esp-idf/tools/cmake/component.cmake:305 (message): Include
    發(fā)表于 06-18 06:15

    VSCode中編譯過程cmake錯誤的原因?

    VSCode中編譯產(chǎn)生一個問題,問題如下: CMake Error at CMakeLists.txt:1 (idf_component_register):Unknown CMake command
    發(fā)表于 06-06 06:48

    如何編譯OTA時的加密固件?

    main->CMakeLists.txt中添加以下生成加密OTA固件的命令。第一次編譯時能夠生成加密固件。但第一次之后,再編譯固件時,就生成不了加密固件了。請問我該怎么解決,達到每次編譯都能生成
    發(fā)表于 06-05 08:28

    內(nèi)核實時操作系統(tǒng)的介紹

    內(nèi)核實時操作系統(tǒng)(Microkernel Real-Time Operating System, μRTOS)是一種專為實時設(shè)計的操作系統(tǒng)。它采用內(nèi)核架構(gòu),以提高系統(tǒng)的可靠性、安全
    的頭像 發(fā)表于 05-11 17:13 ?450次閱讀

    請問一下CMake和Make之間的區(qū)別有哪些?

    CMake和Make是構(gòu)建軟件,其工作涉及將源代碼轉(zhuǎn)換為可執(zhí)行程序。CMake和Make是旨在實現(xiàn)構(gòu)建過程自動化的工具,幫助開發(fā)者節(jié)省時間和精力。
    的頭像 發(fā)表于 02-27 11:44 ?1677次閱讀

    鴻蒙輕內(nèi)核源碼分析:Newlib C

    /kal/posix)。內(nèi)核提供的 posix 接口與 musl 中的標(biāo)準(zhǔn) C 庫接口共同組成 LiteOS-M 的 LibC。編譯時使用 arm-none-eabi-gcc,但只使用其工具鏈的編譯
    的頭像 發(fā)表于 02-18 15:41 ?610次閱讀
    鴻蒙輕<b class='flag-5'>內(nèi)核</b>源碼分析:Newlib C

    鴻蒙使用的是內(nèi)核?

    我們常說,看一個系統(tǒng)是不是自研,就看它的內(nèi)核,常見的內(nèi)核分為:宏內(nèi)核內(nèi)核,當(dāng)然還有兩者結(jié)合體,他們到底有什么區(qū)別? 白話宏
    的頭像 發(fā)表于 01-30 16:43 ?437次閱讀
    鴻蒙使用的是<b class='flag-5'>微</b><b class='flag-5'>內(nèi)核</b>?

    RTT_Draco的外置uart接口(TXD,RXD)怎么配置和使用呢?

    RTT_Draco的外置uart接口(TXD,RXD)怎么配置和使用呢? RT-Thread的RTT_Draco是一款高性能的MCU芯片,它提供了外置UART接口(TXD,RXD)用于與外部設(shè)備進行
    的頭像 發(fā)表于 01-16 17:11 ?909次閱讀

    Linux下如何使用CMake編譯程序

    今天分享一篇關(guān)于 cmake 的相關(guān)文章,通過這個工具可以生成本地的Makefile。讓我們不用去編寫復(fù)雜的Makefile。
    的頭像 發(fā)表于 11-21 09:28 ?1585次閱讀
    Linux下如何使用<b class='flag-5'>CMake</b><b class='flag-5'>編譯</b>程序

    方法|T113開發(fā)板單獨編譯uboot和內(nèi)核和fastboot單獨更新鏡像

    ▲點擊上方“天嵌股份”關(guān)注公眾號后回復(fù)TQT113_CORE獲取板卡wiki資料 T113單獨編譯uboot和內(nèi)核和fastboot單獨更新鏡像1、u-boot單獨編譯 目錄
    的頭像 發(fā)表于 11-16 16:43 ?1350次閱讀
    方法|T113開發(fā)板單獨<b class='flag-5'>編譯</b>uboot和<b class='flag-5'>內(nèi)核</b>和fastboot單獨更新鏡像

    Windows下編譯工具CMake的安裝和最簡使用

    (Autosar工程已經(jīng)很復(fù)雜,一般使用CMake來構(gòu)建工程)。本文將介紹Windows下編譯工具CMake的安裝和最簡使用。
    的頭像 發(fā)表于 11-14 10:18 ?7264次閱讀
    Windows下<b class='flag-5'>編譯</b>工具<b class='flag-5'>CMake</b>的安裝和最簡使用