0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

怎么使用CMake编译RTT微内核

电子设计 来源:电子设计 作者:电子设计 2020-12-14 22:33 次阅读

首发:Rice 嵌入式开发技术分享
作者:RiceDIY

已经大半个月没有更新文章了,大家还记得之前作者写的一篇关于RT-Thread的微内核移植的文章吗?

《如何移植RTT微内核到树莓派3B》
目前RTT微内核是RTT提供的体验版本。它采用了scons构建。作者也是刚接触scons,不是很了解,在这不过多的说明。那么来谈谈为什么不使用scons,采用cmake编译。不是因为scons不好,而是之前作者在写关于cmake的文章中,熊大(RTT的创始人)看到,然后在交流中,熊大说可以采用cmake进行编译。所以我也是冒着尝试的想法,开始了使用cmake去构建微内核。下面几篇文章是关于CMake理论的文章。

《CMake,大型项目采用的构建工具》

《CMake 静态库与动态库构建》

《CMake 教你如何链接共享库》

在构建过程中,由于不是很熟悉整个构建流程,在熊大亲自指导下,让我清晰很多。非常感谢熊大的支持。
其实整个过程最麻烦的编译选项的问题,特别是最后链接部分,这也是我花费最长去研究的。接下来,说一说微内核初步版本(只单独编译一个application)。
整个CMakeLists.txt文件如下,下面对每一行进行说明:

cmake_minimum_required(VERSION 3.10)

1.检查cmake的版本

cmake_minimum_required(VERSION 3.10)

2.其中

CMAKE/_SYSTEM/_NAME:这个变量被设置,cmake才认为采用交叉编译,CMAKE/_SYSTEM/_NAME即目标机target所在的操作系统名称,比如ARM或者Linux你就需要写”Linux”,如果Android平台你就写”Android”,如果你的嵌入式平台没有相关OS你即需要写成”Generic”。
CMAKE/_SYSTEM/_PROCESSOR:代表目标系统的硬件或者CPU的型号,例如ARM、X86。

set(CMAKE_SYSTEM_NAME Generic)

3.关闭编译检测

set(CMAKE_C_COMPILER_FORCED TRUE)

4.定义sdk和apps两个目录变量。

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

5.定义项目的名字。

project(rtt_microkernel)

6.使能可以支持的语言,这里使能C语言汇编语言。如果不是能,则相关文件不会进行编译。

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目录执行(cmake ..),然后查看flags.make文件。

flags.make文件的内容如下(包含相关语言的编译选项,宏定义,相关头文件路径):我们通过这个文件查看是否正确:

9.定义两个头文件变量,分别是sdk头文件目录和apps头文件目录:

set(microkernel_sdk_inc 

10.定义两个源文件变量,分别是sdk源文件和apps源文件:

set(microkernel_sdk_src 

11.定义可执行文件的后缀。

set(CMAKE_EXECUTABLE_SUFFIX ".elf")

12.根据源文件,添加一个可执行文件。

add_executable(${PROJECT_NAME} ${microkernel_apps_src} ${microkernel_sdk_src})

13.添加目标所依赖的头文件目录

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

14.添加目标依赖的链接库。以及链接脚本。

target_link_libraries(${PROJECT_NAME}

15.最后链接生成可执行文件的命令是否正确,我们可以查看link.txt文件。

link.txt文件内容如下:

编译测试:

1.测试应用如下:

2.生成可执行文件:rtt/_microkernel.elf.

3.运行验证(烧录到树莓派上进行验证):

如上是整个测试以及CMakeLists.txt讲解。有疑问,请私聊作者。

审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RTT
    RTT
    +关注

    关注

    0

    文章

    63

    浏览量

    16884
  • CMake
    +关注

    关注

    0

    文章

    28

    浏览量

    1216
收藏 人收藏

    评论

    相关推荐

    Linux下如何使用CMake编译程序

    今天分享一篇关于 cmake 的相关文章,通过这个工具可以生成本地的Makefile。让我们不用去编写复杂的Makefile。
    的头像 发表于 11-21 09:28 402次阅读
    Linux下如何使用<b class='flag-5'>CMake</b><b class='flag-5'>编译</b>程序

    Windows下编译工具CMake的安装和最简使用

    (Autosar工程已经很复杂,一般使用CMake来构建工程)。本文将介绍Windows下编译工具CMake的安装和最简使用。
    的头像 发表于 11-14 10:18 1692次阅读
    Windows下<b class='flag-5'>编译</b>工具<b class='flag-5'>CMake</b>的安装和最简使用

    CMake构建后的项目结构解析

    地。下面我们将详细解析这个目录的结构。 首先,我们来看一下build目录的一级子目录: CMakeFiles:这个目录中存放的是CMake在构建过程中生成的临时文件,包括编译器检查的结果、Find模块
    的头像 发表于 11-10 10:27 408次阅读
    <b class='flag-5'>CMake</b>构建后的项目结构解析

    在Linux下如何使用CMake编译程序

    CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接
    的头像 发表于 11-08 16:15 1726次阅读
    在Linux下如何使用<b class='flag-5'>CMake</b><b class='flag-5'>编译</b>程序

    Linux内核编译脚本

    ,则: make V= 2 内核编译脚本 最后分享我常用的内核编译脚本 mk.sh ,给大家参考: #!/bin/sh export ARCH=arm export PATH=~/to
    的头像 发表于 09-27 11:52 367次阅读

    内核模块知识:多个源文件编译生成一个内核模块

    多个源文件编译生成一个内核模块 例如,将hello.c和world.c两个c文件编译生成一个叫hello_world.o的目标文件,则在 Makefile 中添加以下两句: obj-m
    的头像 发表于 09-26 16:58 525次阅读

    如何在Ubuntu18.04中编译小米K30U的内核呢?

    在Ubuntu18.04中编译小米官方内核K30U的内核,环境配置等。
    的头像 发表于 09-08 09:42 1739次阅读

    cmake编译rt-thread CMakeLists.txt中指定的编译器没有生效是为什么?

    CMakeLists.txt中有指定交叉编译器 执行 cmake .. 后,编译器变成了vs编译器,导致后面编译出错
    发表于 08-20 15:07

    跨平台编译工具cmake的简单使用

    在使用不同平台的电脑时,使用的编译也会不一样,如果想把一个项目在不同平台下编译,那有什么方式可以实现这样的需求呢,这就是这篇文章就来介绍其中的一种方式,就是使用cmakecmake
    发表于 08-14 10:40 485次阅读
    跨平台<b class='flag-5'>编译</b>工具<b class='flag-5'>cmake</b>的简单使用

    Linux内核编译主要过程

    Linux内核编译主要过程: 配置、编译、安装 。
    发表于 08-08 16:02 508次阅读
    Linux<b class='flag-5'>内核</b>的<b class='flag-5'>编译</b>主要过程

    cmake是什么?cmake的特性和编译原理(cmake原理和cmake编译过程)

    CMake是一个开源、跨平台的工具系列,是用来构建、测试和打包软件。
    的头像 发表于 07-18 10:53 1881次阅读
    <b class='flag-5'>cmake</b>是什么?<b class='flag-5'>cmake</b>的特性和<b class='flag-5'>编译</b>原理(<b class='flag-5'>cmake</b>原理和<b class='flag-5'>cmake</b><b class='flag-5'>编译</b>过程)

    Linux内核编译和运行

    想让Linux内核代码跑起来,得先搭建编译和运行代码的环境。
    发表于 06-23 11:56 361次阅读
    Linux<b class='flag-5'>内核</b>的<b class='flag-5'>编译</b>和运行

    剖析ROS编译教程

    ROS对CMake进行了扩展,于是便有了Catkin编译系统。 Catkin是基于CMake编译构建系统,具有以下特点: * Catkin沿用了包管理的传统像 `find
    的头像 发表于 05-19 17:01 478次阅读
    剖析ROS<b class='flag-5'>编译</b>教程

    14. 在 CMake 中自定义宏___CMake 保姆级教程【C_C++】

    CMake
    jf_97106930
    发布于 :2023年05月19日 12:49:38

    交叉编译之LoongArch(Makefile,CMake,AutoTool等方式)

    如果对交叉编译(cross compile)这个概念不太清楚的话,可以参考以下的一个说法。交叉编译通常指的是在PC机上使用交叉编译工具链(通常是编译
    发表于 05-07 18:55