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

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

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

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

電子設(shè)計(jì) ? 來(lái)源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-12-14 22:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

《如何移植RTT微內(nèi)核到樹(shù)莓派3B》
目前RTT微內(nèi)核是RTT提供的體驗(yàn)版本。它采用了scons構(gòu)建。作者也是剛接觸scons,不是很了解,在這不過(guò)多的說(shuō)明。那么來(lái)談?wù)劄槭裁床皇褂胹cons,采用cmake編譯。不是因?yàn)閟cons不好,而是之前作者在寫(xiě)關(guān)于cmake的文章中,熊大(RTT的創(chuàng)始人)看到,然后在交流中,熊大說(shuō)可以采用cmake進(jìn)行編譯。所以我也是冒著嘗試的想法,開(kāi)始了使用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)建過(guò)程中,由于不是很熟悉整個(gè)構(gòu)建流程,在熊大親自指導(dǎo)下,讓我清晰很多。非常感謝熊大的支持。
其實(shí)整個(gè)過(guò)程最麻煩的編譯選項(xiàng)的問(wèn)題,特別是最后鏈接部分,這也是我花費(fèi)最長(zhǎng)去研究的。接下來(lái),說(shuō)一說(shuō)微內(nèi)核初步版本(只單獨(dú)編譯一個(gè)application)。
整個(gè)CMakeLists.txt文件如下,下面對(duì)每一行進(jìn)行說(shuō)明:

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)名稱(chēng),比如ARM或者Linux你就需要寫(xiě)”Linux”,如果Android平臺(tái)你就寫(xiě)”Android”,如果你的嵌入式平臺(tái)沒(méi)有相關(guān)OS你即需要寫(xiě)成”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.使能可以支持的語(yǔ)言,這里使能C語(yǔ)言匯編語(yǔ)言。如果不是能,則相關(guān)文件不會(huì)進(jìn)行編譯。

enable_language(C ASM)

7.添加宏,即打開(kāi)源文件的某項(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)語(yǔ)言的編譯選項(xiàng),宏定義,相關(guān)頭文件路徑):我們通過(guò)這個(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)所依賴(lài)的頭文件目錄

target_include_directories(${PROJECT_NAME}PRIVATE${microkernel_sdk_inc}${microkernel_apps_inc})

14.添加目標(biāo)依賴(lài)的鏈接庫(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)證(燒錄到樹(shù)莓派上進(jìn)行驗(yàn)證):

如上是整個(gè)測(cè)試以及CMakeLists.txt講解。有疑問(wèn),請(qǐng)私聊作者。

審核編輯 黃昊宇

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

    關(guān)注

    0

    文章

    66

    瀏覽量

    17575
  • CMake
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    1475
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    dfd#電路知識(shí) #RTT設(shè)計(jì)大賽

    RTT
    jf_34552825
    發(fā)布于 :2025年05月08日 19:50:18

    Linux內(nèi)核編譯失?。恳苿?dòng)硬盤(pán)和虛擬機(jī)的那些事兒

    Linux開(kāi)發(fā)中,編譯內(nèi)核是一項(xiàng)常見(jiàn)任務(wù),但不少開(kāi)發(fā)者在移動(dòng)硬盤(pán)或虛擬機(jī)環(huán)境下嘗試時(shí)會(huì)遭遇失敗。本文將簡(jiǎn)要探討這些問(wèn)題的成因,并介紹一些虛擬機(jī)使用技巧,幫助大家更好地應(yīng)對(duì)相關(guān)問(wèn)題。在移動(dòng)硬盤(pán)里編譯
    的頭像 發(fā)表于 04-11 11:36 ?294次閱讀
    Linux<b class='flag-5'>內(nèi)核</b><b class='flag-5'>編譯</b>失???移動(dòng)硬盤(pán)和虛擬機(jī)的那些事兒

    求助,關(guān)于STM32MP257編譯內(nèi)核問(wèn)題求解

    the Linux? kernel這篇文章里面的步驟來(lái)來(lái)編譯內(nèi)核時(shí),編譯會(huì)報(bào)錯(cuò)。不知道是否是文檔還未更新,還是這個(gè)內(nèi)核沒(méi)有更新,或者是其他問(wèn)題呢?目前按照文檔無(wú)法
    發(fā)表于 03-13 06:24

    在CubeMX V6.13.0版本上配置的CMake工程無(wú)法通過(guò)編譯怎么解決?

    在 CubeMX V6.13.0 版本上配置的 CMake 工程無(wú)法通過(guò)編譯,報(bào)錯(cuò)如下圖
    發(fā)表于 03-07 16:59

    為什么無(wú)法在OpenVINO? 2021.3源中使用CMAKE編譯ONNX模型?

    嘗試從源版本 2021.3 編譯OpenVINO? 錯(cuò)誤: ~/項(xiàng)目/OpenVINO/cmake-build-debug/_deps/ext_onnx-src/onnx/onnx_pb.h
    發(fā)表于 03-05 08:29

    使用OpenVINO?條件編譯功能,壓縮Windows應(yīng)用體積

    cmake -DENABLE_INTEL_GPU=OFF 便可以取消 GPU plugin 庫(kù)的編譯。除此以外 OpenVINO 還提供了條件編譯功能,用于針對(duì)特定模型進(jìn)行運(yùn)行庫(kù)壓縮,接下來(lái)就讓我們一起
    的頭像 發(fā)表于 01-13 10:26 ?505次閱讀
    使用OpenVINO?條件<b class='flag-5'>編譯</b>功能,壓縮Windows應(yīng)用體積

    關(guān)于驅(qū)動(dòng)編譯進(jìn)蜂鳥(niǎo)派內(nèi)核時(shí)候遇到的問(wèn)題

    內(nèi)核源碼為: 編譯內(nèi)核可以通過(guò),但編譯驅(qū)動(dòng)的時(shí)候無(wú)法生成.ko文件
    發(fā)表于 12-30 17:02

    Triton編譯器安裝步驟詳解

    1. 系統(tǒng)要求 在開(kāi)始安裝之前,請(qǐng)確保您的系統(tǒng)滿(mǎn)足以下要求: 操作系統(tǒng) :支持 Linux 或 Windows(通過(guò) WSL 或 Cygwin)。 編譯器 :GCC 或 Clang。 CMake
    的頭像 發(fā)表于 12-24 17:35 ?2264次閱讀

    Triton編譯器與其他編譯器的比較

    的GPU編程框架,使開(kāi)發(fā)者能夠編寫(xiě)出接近手工優(yōu)化的高性能GPU內(nèi)核。 其他編譯器 (如GCC、Clang、MSVC等): 定位:通用編譯器,支持多種編程語(yǔ)言,廣泛應(yīng)用于各種軟件開(kāi)發(fā)場(chǎng)景。 目標(biāo):提供穩(wěn)定、高效的
    的頭像 發(fā)表于 12-24 17:25 ?933次閱讀

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核編譯之初次編譯

    接下來(lái)我們就進(jìn)行內(nèi)核代碼的初次編譯,直接使用我們適配好的Linux內(nèi)核源碼進(jìn)行編譯。為了使編譯操作更加簡(jiǎn)單,我們提供了
    發(fā)表于 12-18 08:55

    飛凌嵌入式ElfBoard ELF 1板卡-內(nèi)核編譯之初次編譯

    接下來(lái)我們就進(jìn)行內(nèi)核代碼的初次編譯,直接使用我們適配好的Linux內(nèi)核源碼進(jìn)行編譯。為了使編譯操作更加簡(jiǎn)單,我們提供了
    發(fā)表于 12-17 09:34

    【敏矽ME32G070開(kāi)發(fā)板免費(fèi)體驗(yàn)】使用JLINK的RTT功能實(shí)現(xiàn)類(lèi)似串口printf打印功能

    和浮點(diǎn)數(shù),所以我還是希望 敏矽 能給我補(bǔ)發(fā)一個(gè)好的 ME32G070開(kāi)發(fā)板,方便我后面做電機(jī)FOC等復(fù)雜算法來(lái)實(shí)現(xiàn)浮點(diǎn)數(shù)據(jù)的打印功能。在此先謝謝電子發(fā)燒友群主。 Jlink RTT的打印結(jié)果視頻如下
    發(fā)表于 12-15 20:30

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

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

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

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

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

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

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品