RT-Thread 的 CPU 固件移植理解

简介: RT-Thread 的 CPU 固件移植理解

RT-Thread 的 CPU 固件移植理解


博主介绍

RT-Thread 的 CPU 抽象层

STM32CubeMX 固件工具

RT-Thread 的 BSP

💫点击直接资料领取💫


博主介绍

🌊 作者主页:苏州程序大白


🌊 作者简介:🏆CSDN人工智能域优质创作者🥇,苏州市凯捷智能科技有限公司创立人,目前合作公司富士康、歌尔等几家公司

💬如果文章对你有帮助,欢迎关注、点赞、收藏(一键三连)和C#、Halcon、python+opencv、VUE、各大公司面试等一些订阅专栏哦

💅 有任何问题欢迎私信,看到会及时回复


RT-Thread 的 CPU 抽象层


在嵌入式领域有多重不同的 CPU 架构,我们知道 RT-Thread 是支持不同架构的嵌入式操作系统,我们先来大概看一下 RT-Thread 的架构。


7a2b8f3bba1d4b4498e733634d08f911.png


可以看到 RT-Thread 提供了一个 libcpu 抽象层来适配不同的 CPU 架构, libcpu 向上对内核提供统一的接口,包括全局中断的开关,线程栈的初始化,上下文切换等。


RT-Thread 的 libcpu 抽象层向下提供了一套统一的 CPU 架构移植接口,这部分接口包含了全局中断 开关函数、线程上下文切换函数、时钟节拍的配置和中断函数、Cache 等等内容。


接下来让我们一起看看 RT-Thread 嵌入式系统的文件目录:(https://github.com/RT-Thread/rt-thread


15101138b98e45c2b8ece4f9b0e6a1cf.png


我手头的开发板是潘多拉物联网开发版,CPU 是 STM32L475VET6,去官网找到对应的文档可以得知 CPU 架构为 Cortex-M4 架构:


bf9ca1fafe254febb330aad6bab4a18f.png


打开 rt-thread\libcpu\arm\cortex-m4 目录会发现有如下几个文件:


libcpu\arm\cortex-m4 目录下文件


context_gcc.S


context_iar.S


context_rvds.S


cpuport.c


SConscript


其中上面的 context_rvds.S 文件就是 RT-Thread 的对该 CPU 提供的移植接口,相关 API 如下:


函数和变量 描述

rt_base_t rt_hw_interrupt_disable(void); 关闭全局中断

void rt_hw_interrupt_enable(rt_base_t level); 打开全局中断

rt_uint8_t *rt_hw_stack_init(void *tentry, void *parameter, rt_uint8_t *stack_addr, void *texit); 线程栈的初始化,内核在线程创建和线程初始化里面会调用这个函数

void rt_hw_context_switch_to(rt_uint32 to); 没有来源线程的上下文切换,在调度器启动第一个线程的时候调用,以及在signal 里面会调用

void rt_hw_context_switch(rt_uint32 from, rt_uint32 to); 从 from 线程切换到 to 线程,用于线程和线程之间的切换

void rt_hw_context_switch_interrupt(rt_uint32 from, rt_uint32 to); 从 from 线程切换到 to 线程,用于中断里面进行切换的时候使用

rt_uint32_t rt_thread_switch_interrupt_flag; 表示需要在中断里进行切换的标志

rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; 在线程进行上下文切换时候,用来保存 from 和 to 线程

具体的如何去移植,如何去修改对应参数,建议参考《RT-Thread 编程指南》的内核移植部分内容。


STM32CubeMX 固件工具


STM32CubeMX 是一个图形化的工具,可以使用该工具来很方便的配置 STM32 微处理器的相关硬件并生成底层驱动(Low-layer APIs(LL)),硬件抽象层接口(Hardware abstraction layer APIs(HAL)),板级支持包(Board Support Package(BSP))。


76e70eb742a1407d854446ebaceedde3.png


概括的说,STM32CubeMX 图形界面可以完成以下功能:


快速简便地配置所选外设和中间件的MCU引脚、时钟树和工作模式。


为开发板设计人员生成引脚配置报告。


生成一个完整项目,包含所有必需的库和初始化C代码,以在用户定义的工作模式下设置设备。可以在选定的应用开发环境中直接打开项目(适用于一系列支持的IDE),以继续进行应用程序开发。


c8fdd9d132d74624af2ac3db1df5da53.png


下载安装 CubeMX,


这里需要注意的是,该工具依赖 Java 环境,需要具备 Java 8.0 的环境,并配置环境变量,否则安装失败。


RT-Thread 的 BSP


前面我们已经看到 RT-Thread 的目录中有一个 bsp 文件夹,BSP 框架结构如下图所示:


7459f5cb6cad424abc0f243d52e8e1be.png


每一个 STM32 系列的 BSP 由三部分组成,分别是通用库、BSP 模板和特定开发板 BSP,下面的表格以 F1 系列 BSP 为例介绍这三个部分:


项目 文件夹 说明

通用库 stm32/libraries 用于存放 HAL 库以及基于 HAL 库的多系列通用外设驱动文件

F1 系列 BSP 工程模板 stm32/libraries/templates/stm32f10x F1系列 BSP 模板,可以通过修改该模板制作更多 F1系列 BSP

特定开发板 BSP stm32/stm32f103-atk-nano 在 BSP 模板的基础上修改而成

例如我手头的这个潘多拉 STM32L4 开发版,在 bsp\stm32\stm32l475-atk-pandora 目录下,我们可以在该目录看到 board\CubeMX_Config 目录中的 STM32CubeMX 工程,双击可以直接打开。


9f82b941c5f846739e6fc917f6d9127c.png


提示,建议复制一个 CubeMX_Config 目录再修改,可以对照前后变化。


当然,一般情况下我们不必要修改具体开发板下面的CubteMX,因为已经和开发板配套设置好了,如果我们手头有一款开发板还没有纳入 bsp 目录,此时我们可以去 bsp\stm32\libraries\templates\下面寻找对应系列的模板并打开进行修改。


f889d0389dd446c79fa81591ccd6286a.png


在 CubeMX 工程中将芯片型号为修改为实际型号,例如: STM32F103RBTx 。


打开外部时钟、设置下载方式、打开串口外设(注意只需要选择串口外设引脚即可,无需配置其他参数):


fbf4e15dacb948ff93f10c7a03f5b2fb.png


配置系统时钟:


3a8c60ce26324b4099647edad0c6d213.png


设置项目名称,并在指定地址重新生成 CubeMX 工程:


e966c0aaea0f4d38ae3a55a6eb68f41b.png


最终 CubeMX 生成的工程目录结构如下图所示:


50a7814ebf1a4355bc7b36189c393ba5.png


这里你是不是就有疑问了,生成的其余的文件夹为什么可以删除,那是因为在 bsp\stm32\libraries\STM32L4xx_HAL\ 已经包含了 STM32 的公共固件库(系列通用 HAL 库)。


ae11419ba36e4000b44d296fefee10c2.png


而在 bsp\stm32\libraries\HAL_Drivers\ 存放的是对应的驱动文件(连接 RT-Thread 内核和 HAL 之间的桥梁) 例如我们 gpio 的驱动 drv_gpio.c。


28c6553643db4b4ba1cf83e5bd6fd3bb.png


在 CubeMX 生成的文件中除了上面提到的 HAL 库外还有一个叫 CMSIS 的文件夹。


CMSIS(微控制器软件接口标准,Cortex Microcontroller Software Interface Standard)是 ARM 官方设计的驱动包,框图如下:


804cf953488e4c57b139198747e07b7d.png


ARM 推出 CMSIS 软件包意在统一各大芯片厂商的外设驱动,DSP 数字信号处理,下载器和各个主流 RTOS 的 API 统一。几年下来,各个厂商一直是各自为战,所以 CMSIS 的驱动一直没有被各个芯片厂商采用。



相关文章
|
安全 数据安全/隐私保护 数据中心
|
Web App开发 编解码 算法
发现一个非常好用的RTC(实时音视频通信)方案,做直播和视频通话都很牛
HaaS RTC是阿里云IoT联合视频云开发的IoT设备端上的实时通讯服务,主要面向直播,音视频通话等各种场景。
2968 20
发现一个非常好用的RTC(实时音视频通信)方案,做直播和视频通话都很牛
|
算法 UED 异构计算
性能优化在嵌入式系统中的应用
性能优化在嵌入式系统中的应用
271 3
|
存储 安全 API
基于FreeRTOS中的串口不定长接收(使用队列进行数据传输)
基于FreeRTOS中的串口不定长接收(使用队列进行数据传输)
1474 0
|
网络协议 Linux 网络安全
如何用阿里云实现内网穿透?如何在外网访问家里内网设备?
使用NPS自建内网穿透服务器教程,带WEB管理
35668 12
|
5月前
|
人工智能 JSON 搜索推荐
PowerToys 功能解析:窗口布局、快速启动与更多实用特性,微软官方软件PowerToys增强工具箱,27种功能介绍
Microsoft PowerToys 是一组实用工具,旨在帮助高级用户调整和优化 Windows 体验以提升工作效率。其功能包括:FancyZones(自定义窗口布局)、PowerToys Run(快速启动应用与命令)、Keyboard Manager(键盘按键重映射)、Shortcut Guide(快捷键指南)、文件资源管理器预览面板、颜色拾取器、图像大小调整器、批量重命名工具等。此外还提供 Always On Top、鼠标实用工具、屏幕标尺、文本提取器等功能,满足多样化需求。通过这些工具,用户可实现高效多任务处理、个性化操作及便捷的系统管理。
743 5
|
9月前
|
数据采集 人工智能 弹性计算
《解锁DeepSeek开源模型:定制你的专属AI解决方案》
在人工智能快速发展的背景下,DeepSeek作为备受瞩目的开源大语言模型,为开发者提供了强大的基础。通过明确业务需求、精心准备数据、合理选择和微调模型、高效集成部署及持续优化,开发者可以基于DeepSeek打造个性化AI应用,满足电商、医疗、法律等领域的特定需求,提升效率与竞争力。
408 1
|
人工智能 算法 测试技术
软件测试中的人工智能:提升测试效率与质量
随着软件开发的快速发展,传统的手工测试方法已经无法满足现代软件项目的需求。本文探讨了人工智能在软件测试中的应用,如何通过自动化测试、智能缺陷分析和测试用例生成等技术,提高测试效率和质量。我们将详细介绍这些技术的原理和实际应用,并讨论其带来的优势和挑战。
749 4
|
存储 算法 数据库连接
如何避免硬编码
如何避免硬编码
|
Ubuntu 安全 网络协议