基于STM32的RTOS教程——RT-Thread学习教程_stm32f4基于keil的rt-thread例程

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

下面所有资料都是转载整理于:https://www.rt-thread.org/document/site/#/


文章目录
  • 内核基础
  • 线程管理
  • 时钟管理
  • 线程间同步
  • 线程间通信
  • 内存管理
  • 中断管理
  • 内核移植
  • [RT-Thread SMP 介绍与移植](#RTThread_SMP_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualsmpsmpidrtthreadsmp_545)
  • [I/O 设备模型](#IO_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicedeviceidio_547)
  • [UART 设备](#UART_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdeviceuartuart_v1uartiduart_549)
  • [ADC 设备](#ADC_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdeviceadcadcidadc_551)
  • [DAC 设备](#DAC_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicedacdaciddac_553)
  • [CAN 设备](#CAN_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicecancanidcan_555)
  • [I2C 总线设备](#I2C_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicei2ci2cidi2c_557)
  • [PWM 设备](#PWM_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicepwmpwmidpwm_559)
  • [RTC 设备](#RTC_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicertcrtcidrtc_561)
  • [SPI 设备](#SPI_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualdevicespispiidspi_563)
  • ringbuffer
  • [FinSH 控制台](#FinSH_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualfinshfinshidfinsh_567)
  • 虚拟文件系统
  • [ulog 日志](#ulog_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualulogulogidulog_571)
  • [utest 测试框架](#utest_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualutestutestidutest_573)
  • [POSIX 接口](#POSIX_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardprogrammingmanualposixposixidposix_575)
  • [**1. MQTT 背景应用**](#1_MQTT_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardapplicationnotepackagesumqttumqttid_1mqtt_577)
  • [应用 RT-Thread 实现蜂鸣器播放器](#_RTThread_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardtutorialbeepplayerREADMEidrtthread_579)
  • [应用 RT-Thread 实现蜂鸣器播放器](#_RTThread_httpswwwrtthreadorgdocumentsitertthreadversionrtthreadstandardtutorialbeepplayerREADMEidrtthread_581)
  • 智能车连载教程简介

新手指导

版本简介

RT-Thread 操作系统现在有三个版本,分别适应满足不同场合的需求。

学习路线

从版本简介中可以看出,Nano 版本标准版本 的极简内核版本,Smart 版本 是在 标准版本 上增加了用户态创造而来,所以学习 标准版本 是学习 RT-Thread 的基础。本篇文章以学习 RT-Thread 标准版本 为例,为初学者制定学习路线如下,分为入门学习、进阶学习、应用开发。

入门学习
无RTOS经验

针对人群:有 C 语言、嵌入式基础,想系统学习 RT-Thread 操作系统

模拟运行

Keil MDK 模拟器 STM32F103 体验

快速上手

推荐使用 潘多拉开发板 配套使用 潘多拉开发板教程. pdf,或者以下主流的学习板进行学习,不建议没有任何基础就将 RT-Thread 移植到一块开发板上。

内核学习

内核视频教程

《内核实验手册》

有RTOS经验

针对人群:学过 FreeRTOS 或 uC/OS, 想把 RT-Thread 使用起来

快速上手

准备一块板子,根据 RT-Thread 支持的板子 BSP 进行 快速上手,或者根据 STM32 系列 BSP 制作教程进行移植

如果使用 Ubuntu 进行开发,可以参考:在 Ubuntu 下开发 RT-Thread

编程指南

快速学习内核,参考:《RT-Thread 编程指南》

API 手册

查看 在线 API 手册下载 API 手册

第三方 RTOS 兼容层

为方便之前有其他 RTOS 使用经验的用户快速上手 RT-Thread,以及将基于其他 RTOS 的 API 编写的应用层代码快速移植到 RT-Thread 上,RT-Thread 社区编写了第三方 RTOS 兼容层。目前支持以下第三方 RTOS 的 API 无感移植:

进阶学习
开发工具
Env 工具

Env 工具:Env 工具用于对源码功能进行配置或裁减,可以生成 MDK/IAR/GCC 工程,需要配合 MDK/IAR/GCC 使用,详见 Env 用户手册

RT-Thread IDE

RT-Thread Studio :可以在 Studio 中下载源码包并创建 rt-thread 工程,独立完成开发、编译、下载、调试等功能,并能进行功能裁剪,详见 RT-Thread Studio 用户手册

设备与驱动

IO 设备模型

PIN 设备

UART 设备

UART 设备V2版本

CAN 设备

HWTIMER 设备

I2C 设备

PWM 设备

RTC 设备

SPI 设备

WATCHDOG 设备

SENSOR 设备

更多…

组件

FinSH 控制台

文件系统

netdev 网卡

SAL 套接字抽象层

AT 命令

ulog 日志

utest 测试框架

动态模块

POSIX 接口

电源管理

更多…

应用开发
应用开发列表应用开发列表
使用 Eclipse 开发 RT-ThreadCmBacktrace应用
使用 VS Code 开发 RT-Thread在STM32 Nucleo 开发板上使用 RW007 WiFi 模块
使用 Env 创建 RT-Thread 项目工程在 STM32L4 上应用 littlefs 文件系统
搭建RT-Thread项目框架在潘多拉上使用 SFUD 操作 Flash
在IoT Board上实现电源管理STM32 通用 Bootloader
网络协议栈驱动移植wireshark 抓取 tls 数据包
在STM32F429上应用网络功能在 STM32 上应用 C++
在STM32F429上应用文件系统STM32 上使用 PWM
FreeModbus 应用笔记STM32 上使用 USB Host 读写 U 盘
应用AT组件连接ESP8266模块QEMU网络视频教程
多线程非阻塞网络编程使用QEMU运行动态模块组件

应用设计参考…

Demo 示例
Demo演示和教程[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KBtUmYbL-1645022946719)()]Sample示例img
基于RT-Thread和i.MX RT1052的开源AutoQuad飞控
基于RT-Thread的开源飞控StarryPilot
基于RT-Thread的人体健康监测系统
基于RT-Thread的激光雷达避障小车
基于RT-Thread的蓝牙遥控平衡小车
蜂鸣器播放器
分布式温度监控系统
智能车教程
代码贡献
开发指南[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rb6TCmF3-1645022946720)()]代码规范[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eFZcaflt-1645022946721)()]提交代码img
软件包开发指南RT-Thread编程风格向RT-Thread贡献代码
STM32系列BSP制作教程BSP开发规范
传感器驱动开发指南

开发工具

  • RT-Thread Studio
  • Env 开发工具
  • Scons 介绍
  • Kconfig 介绍

RT-Thread 标准版本

RT-Thread 简介

作为一名 RTOS 的初学者,也许你对 RT-Thread 还比较陌生。然而,随着你的深入接触,你会逐渐发现 RT-Thread 的魅力和它相较于其他同类型 RTOS 的种种优越之处。RT-Thread 是一款完全由国内团队开发维护的嵌入式实时操作系统(RTOS),具有完全的自主知识产权。经过近 15 个年头的沉淀,伴随着物联网的兴起,它正演变成一个功能强大、组件丰富的物联网操作系统。

RT-Thread 概述

RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务),给人造成多个任务在一个时刻同时运行的错觉。在 RT-Thread 系统中,任务通过线程实现的,RT-Thread 中的线程调度器也就是以上提到的任务调度器。

RT-Thread 主要采用 C 语言编写,浅显易懂,方便移植。它把面向对象的设计方法应用到实时系统设计中,使得代码风格优雅、架构清晰、系统模块化并且可裁剪性非常好。针对资源受限的微控制器(MCU)系统,可通过方便易用的工具,裁剪出仅需要 3KB Flash、1.2KB RAM 内存资源的 NANO 版本(NANO 是 RT-Thread 官方于 2017 年 7 月份发布的一个极简版内核);而对于资源丰富的物联网设备,RT-Thread 又能使用在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,无缝地导入丰富的软件功能包,实现类似 Android 的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。

相较于 Linux 操作系统,RT-Thread 体积小,成本低,功耗低、启动快速,除此以外 RT-Thread 还具有实时性高、占用资源小等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。虽然 32 位 MCU 是它的主要运行平台,实际上很多带有 MMU、基于 ARM9、ARM11 甚至 Cortex-A 系列级别 CPU 的应用处理器在特定应用场合也适合使用 RT-Thread。

许可协议

RT-Thread 系统完全开源,3.1.0 及以前的版本遵循 GPL V2 + 开源许可协议。从 3.1.0 以后的版本遵循 Apache License 2.0 开源许可协议,可以免费在商业产品中使用,并且不需要公开私有代码。

RT-Thread 的架构

近年来,物联网(Internet Of Things,IoT)概念广为普及,物联网市场发展迅猛,嵌入式设备的联网已是大势所趋。终端联网使得软件复杂性大幅增加,传统的 RTOS 内核已经越来越难满足市场的需求,在这种情况下,物联网操作系统(IoT OS)的概念应运而生。**物联网操作系统是指以操作系统内核(可以是 RTOS、Linux 等)为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台,**RT-Thread 就是一个 IoT OS。

RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件,如下图所示。

RT-Thread 软件框架图

它具体包括以下部分:

  • 内核层:RT-Thread 内核,是 RT-Thread 的核心部分,包括了内核系统中对象的实现,例如多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等;libcpu/BSP(芯片移植相关文件 / 板级支持包)与硬件密切相关,由外设驱动和 CPU 移植构成。
  • 组件与服务层:组件是基于 RT-Thread 内核之上的上层软件,例如虚拟文件系统、FinSH 命令行界面、网络框架、设备框架等。采用模块化设计,做到组件内部高内聚,组件之间低耦合。
  • RT-Thread 软件包:运行于 RT-Thread 物联网操作系统平台上,面向不同应用领域的通用软件组件,由描述信息、源代码或库文件组成。RT-Thread 提供了开放的软件包平台,这里存放了官方提供或开发者提供的软件包,该平台为开发者提供了众多可重用软件包的选择,这也是 RT-Thread 生态的重要组成部分。软件包生态对于一个操作系统的选择至关重要,因为这些软件包具有很强的可重用性,模块化程度很高,极大的方便应用开发者在最短时间内,打造出自己想要的系统。RT-Thread 已经支持的软件包数量已经达到 60+,如下举例:
  • 物联网相关的软件包:Paho MQTT、WebClient、mongoose、WebTerminal 等等。
  • 脚本语言相关的软件包:目前支持 JerryScript、MicroPython。
  • 多媒体相关的软件包:Openmv、mupdf。
  • 工具类软件包:CmBacktrace、EasyFlash、EasyLogger、SystemView。
  • 系统相关的软件包:RTGUI、Persimmon UI、lwext4、partition、SQLite 等等。
  • 外设库与驱动类软件包:RealTek RTL8710BN SDK。
  • 其他。

Keil 模拟器 STM32F103 上手指南

一般嵌入式操作系统因为它的特殊性,往往和硬件平台密切相关连,具体的嵌入式操作系统往往只能在特定的硬件上运行。对于刚接触 RT-Thread 操作系统的读者并不容易马上就获得一个和 RT-Thread 操作系统相配套的硬件模块,但随着计算机技术的发展,我们可以采用软件方式来模拟一个能够运行 RT-Thread 操作系统的硬件模块,这就是 ARM 公司的 MDK-ARM 仿真模拟环境。

MDK-ARM(MDK-ARM Microcontroller Development Kit)软件是一套完整的集成开发环境(IDE),它出自 ARM 公司,包括了针对 ARM 芯片(ARM7,ARM9,Cortex-M 系列,Cortex-R 系列等)的高效 C/C++ 编译器;针对各类 ARM 设备、评估板的工程向导,工程管理;用于软件模拟运行硬件平台的模拟器;以及与市面上常见的如 ST-Link,JLink 等在线仿真器相连接以配合调试目标板的调试器。MDK-ARM 软件中的软件仿真模拟器,采用完全软件模拟方式解释执行 ARM 的机器指令,并实现外围的一些外设逻辑,从而构成一套完整的虚拟硬件环境,使得用户能够不借助真实的硬件平台就能够在电脑上执行相应的目标程序。

MDK-ARM 集成开发环境因为其完全的 STM32F103 软件仿真环境,也让我们有机会在不使用真实硬件环境的情况下直接在电脑上运行目标代码。这套软件仿真模拟器能够完整地虚拟出 ARM Cortex-M3 的各种运行模式、外设,如中断异常,时钟定时器,串口等,这几乎和真实的硬件环境完全一致。实践也证明,本文使用到的这份 RT-Thread 入门例程,在编译成二进制代码后,不仅能够在模拟器上软件模拟运行,也能够不需要修改地在真实硬件平台上正常运行。

下面我们将选择 MDK-ARM 集成开发环境作为目标硬件平台来观察 RT-Thread 操作系统是如何运行的。

准备工作

MDK 开发环境:需要安装 MDK-ARM 5.24 (正式版或评估版,5.14 版本及以上版本均可),这个版本也是当前比较新的版本,它能够提供相对比较完善的调试功能。安装方法可以参考 Keil MDK安装

使用 STM32F103 软件仿真 ,还需要下载安装 STM32F103 pack 文件,如果在 MDK 中下载较慢,也可以点击此处下载,下载后双击安装即可。

初识 RT-Thread

作为一个操作系统,RT-Thread 的代码规模怎么样呢?在弄清楚这些之前,我们先要做的就是获得与本文相对应的 RT-Thread 的例子,这份例子可以从以下链接获得:

RT-Thread Simulator 例程

这个例子是一个压缩包文件,将它解压,我们这里解压到 D:/。解压完成后的目录结构如下图所示:

rtthread_simulator_v0.1.0 代码目录

各个目录所包含的文件类型的描述如下表所示:

目录名描述
applicationsRT-Thread 应用程序。
rt-threadRT-Thread 的源文件。
- componentsRT-Thread 的各个组件目录。
- includeRT-Thread 内核的头文件。
- libcpu各类芯片的移植代码,此处包含了 STM32 的移植文件。
- srcRT-Thread 内核的源文件。
- toolsRT-Thread 命令构建工具的脚本文件。
driversRT-Thread 的驱动,不同平台的底层驱动具体实现。
LibrariesST 的 STM32 固件库文件。
kernel-sample-0.1.0RT-Thread 的内核例程。

在目录下,有一个 project.uvprojx 文件,它是本文内容所引述的例程中的一个 MDK5 工程文件,双击 “project.uvprojx” 图标,打开此工程文件:

打开第一个 RT-Thread 工程

在工程主窗口的左侧 Project 栏里可以看到该工程的文件列表,这些文件被分别存放到如下几个组内,分别是:

目录组描述
Applications对应的目录为 rtthread_simulator_v0.1.0/applications,它用于存放用户应用代码。
Drivers对应的目录为 rtthread_simulator_v0.1.0/drivers,它用于存放 RT-Thread 底层的驱动代码。
STM32_HAL对应的目录为 rtthread_simulator_v0.1.0/Libraries/CMSIS/Device/ST/STM32F1xx,它用于存放 STM32 的固件库文件。
kernel-sample对应的目录为 rtthread_simulator_v0.1.0/kernel-sample-0.1.0,它用于存放 RT-Thread 的内核例程。
Kernel对应的目录为 rtthread_simulator_v0.1.0/src,它用于存放 RT-Thread 内核核心代码。
CORTEX-M3对应的目录为 rtthread_simulator_v0.1.0/rt-thread/libcpu,它用于存放 ARM Cortex-M3 移植代码。
DeviceDrivers对应的目录为 rtthread_simulator_v0.1.0/rt-thread/components/drivers,它用于存放 RT-Thread 驱动框架源码。
finsh对应的目录为 rtthread_simulator_v0.1.0/rt-thread/components/finsh,它用于存放 RT-Thread 命令行 finsh 命令行组件。

现在我们点击一下窗口上方工具栏中的按钮img,对该工程进行编译,如图所示:

编译工程

编译的结果显示在窗口下方的 “Build” 栏中,没什么意外的话,最后一行会显示“0 Error(s), * Warning(s).”,即无任何错误和警告。

注:由于工程中包含的内核例程代码较多,若使用的是 MDK 试用版本,则会有 16KB 限制,此时可以只保留某个目标例程的代码(例如内核例程只保留一个 thread_sample.c 参与编译),将其他不用的例程先从工程中移除,然后编译。

在编译完 RT-Thread/STM32 后,我们可以通过 MDK-ARM 的模拟器来仿真运行 RT-Thread。点击窗口右上方的按钮img或直接按 “Ctrl+F5” 进入仿真界面,再按 F5 开始运行,然后点击该图工具栏中的按钮或者选择菜单栏中的 “View→Serial Windows→UART#1”,打开串口 1 窗口,可以看到串口的输出只显示了 RT-Thread 的 LOGO,这是因为用户代码是空的,其模拟运行的结果如图所示:

模拟运行 RT-Thread

提示:我们可以通过输入Tab键或者 help + 回车 输出当前系统所支持的所有命令,如下图所示。

模拟运行 RT-Thread

系统启动代码

一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。以 MDK-ARM 为例,MDK-ARM 的用户程序入口为 main() 函数,位于 main.c 文件中。系统启动后先从汇编代码 startup_stm32f103xe.s 开始运行,然后跳转到 C 代码,进行 RT-Thread 系统功能初始化,最后进入用户程序入口 main()。

下面我们来看看在 components.c 中定义的这段代码:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
ttps://img-blog.csdnimg.cn/img_convert/cc83f32e4094b27a53d8d0978d53f455.png)

系统启动代码

一般了解一份代码大多从启动部分开始,同样这里也采用这种方式,先寻找启动的源头。以 MDK-ARM 为例,MDK-ARM 的用户程序入口为 main() 函数,位于 main.c 文件中。系统启动后先从汇编代码 startup_stm32f103xe.s 开始运行,然后跳转到 C 代码,进行 RT-Thread 系统功能初始化,最后进入用户程序入口 main()。

下面我们来看看在 components.c 中定义的这段代码:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-tyzO1IuX-1713205851687)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值