RT-Thread学习笔记
- AIot
- MMU
- CPU架构
- RT-Thread版本
- 工程创建
- 时钟配置
- FinSH
- 内核
- RT-Thread内核启动流程
RT-Thread是一个组件完整丰富、高度可伸缩、简易开发、超低功耗、高安全性的物联网操作系统
全称Real Time Thread
AIot
AIot: Artificial Intelligence of Things(人工智能物联网) 的缩写,是 AI(人工智能) 与 IoT(物联网) 的融合。
AIoT = AI + IoT 它指的是在传统物联网中引入人工智能技术,使设备不仅能“联网”,还能“思考”和“决策”。
MMU
MMU 是 Memory Management Unit(内存管理单元) 的缩写,是计算机系统中专门负责内存地址转换与管理的硬件模块。
CPU架构
RT-Thread版本
标准版本
Nano版本
Nano版本是一个精简版,主要用于一些内存较小的芯片结构中
RT-Thread Smart
类似于Linux系统,像Linux把驱动层和应用层分开一样,RT-Smart分出内核和用户应用层,用户与内核之间有一个系统调用,用于应用层访问内核
工程创建
使用RT-Thread Studio 进行工程创建
如果没有自己需要的芯片可以点击添加更多,根据需要安装相应的资源包
点击确定后即会创建工程
通过RT-Thread Studio自带的终端查看串口打印信息
程序的功能是1s打印一次 Hello RT-Thread
时钟配置
board.c 和 board.h 文件是与具体硬件板级相关(BSP,Board Support Package) 的文件,它们是 RT-Thread 启动和移植过程中非常核心的部分
这里默认使用的是系统内部的高速时钟,但是板子上有外部高速时钟,修改使用外部的晶振,系统会更稳定
修改代码,再次编译没有错误
程序运行正常
FinSH
FinSH:FinSH 是 RT-Thread 提供的一个内置 Shell 命令行解释器,类似于 Linux 的 Shell,用于在运行时通过串口或终端输入命令,调试和控制系统。
开启FinSH
默认就是开启的
为了方便观察FinSH的使用,先将源代码中的While循环注释掉,可以用Ctrl+L
快速注释
除了使用RT-Thread Studio自带的终端窗口,还可以用其他的软件,例如Mobaxterm
可以看到就是与Linux类似的命令行终端,可以用help
命令查看可以使用的命令
例如使用list_thread命令查看线程
内核
内核时操作系统最基础也最为重要的部分
- 线程管理(Thread Management)
提供线程的创建、删除、挂起、恢复、优先级管理、时间片轮转等功能。
支持抢占式调度、多优先级、时间片轮转调度等。- 调度器(Scheduler)
负责根据线程优先级和状态选择合适的线程运行。
支持抢占式调度机制,确保高优先级线程优先运行。- 中断管理(Interrupt Management)
支持中断嵌套与中断服务函数的注册。
中断中可切换为线程上下文以处理复杂任务。- 定时器管理(Timer Management)
提供软定时器功能,支持定时回调任务的调度。
支持一次性和周期性定时器。- 内存管理(Memory Management)
支持静态内存分配、动态内存分配、内存池等。
常用内存管理方式包括:堆管理(rt_malloc)、内存块(mempool)等。- 同步机制(Synchronization)
包括信号量、互斥锁(Mutex)、事件(Event)、邮箱(Mailbox)、消息队列(Message Queue)等。
用于多线程间的同步与通信。- 时钟系统(Clock System)
提供系统节拍(tick)支持,是整个RTOS时间管理的基础。
影响定时器、线程延时、调度器等功能。- 钩子函数(Hooks)
提供线程创建、删除、切换、空闲等阶段的钩子机制,便于调试与扩展。- 空闲线程(Idle Thread)
系统在没有其他线程可运行时执行空闲线程。
可在其中处理系统清理或功耗控制等任务。
RT-Thread内核最小的资源占用情况时 3KB ROM、1.2KB RAM
线程: 线程是 RT-Thread 操作系统中最小的调度单位,线程调度算法是基于优先级的全抢占式多线程调度算法,即在系统中除了中断处理函数、调度器上锁部分的代码和禁止中断的代码是不可抢占的之外,系统的其他部分都是可以抢占的,包括线程调度器自身。支持256个线程优先级(也可通过配置文件更改为最大支持32个或8个线程优先级,针对STM32默认配置是32个线程优先级),0优先级代表最高优先级,最低优先级留给空闲线程使用;同时它也支持创建多个具有相同优先级的线程,相同优先级的线程间采用时间片的轮转调度算法进行调度,使每个线程运行相应时间;另外调度器在寻找那些处于就绪状态的具有最高优先级的线程时,所经历的时间是恒定的,系统也不限制线程数量的多少,线程数目只和硬件平台的具体内存相关。
时钟管理: RT-Thread 的时钟管理以时钟节拍为基础,时钟节拍是RT-Thread 操作系统中最小的时钟单位。RT-Thread 的定时器提供两类定时器机制:第一类是单次触发定时器,这类定时器在启动后只会触发一次定时器事件,然后定时器自动停止。第二类是周期触发定时器,这类定时器会周期性的触发定时器事件,直到用户手动的停止定时器否则将永远持续执行下去。“另外,根据超时函数执行时所处的上下文环境,RT-Thread 的定时器可以设置为 HARD TIMER 模式或者 SOFT TIMER 模式。←通常使用定时器定时回调函数(即超时函数),完成定时服务。用户根据自己对定时处理的实时性要求选择合适类型的定时器。
线程间同步: RT-Thread 采用信号量、互斥量与事件集实现线程间同步。线程通过对信号量、互斥量的获取与释放进行同涉;互斥量采用优先级继承的方式解决了实时系统常见的优先级翻转问题。线程同步机制支持线程按优先级等待或按先进先出方式获取信号量或互斥量。线程通过对事件的发送与接收进行同步;事件集支持多事件的“或触发”和“与触发”,适合于线程等待多个事件的情况。
线程间通信: RT-Thread 支持邮箱和消息队列等通信机制。邮箱中一封邮件的长度固定为4字节大小;消息队列能够接收不固定长度的消息,并把消息缓存在自己的内存空间中。邮箱效率较消息队列更为高效。邮箱和消息队列的发送动作可安全用于中断服务例程中。通信机制支持线程按优先级等待或按先进先出方式获取。
内存管理: RT-Thread 支持静态内存池管理及动态内存堆管理。当静态内存池具有可用内存时,系统对内存块分配的时间将是恒定的;当静态内存池为空时,系统将申请内存块的线程挂起或阻塞掉(即线程等待一段时间后仍未获得内存块就放弃申请并返回,或者立刻返回。等待的时间取决于申请内存块时设置的等待时间参数),当其他线程释放内存块到内存池时,如果有挂起的待分配内存块的线程存在的话,则系统会将这个线程唤醒。“动态内存堆管理模块在系统资源不同的情况下,分别提供了面向小内存系统的内存管理算法及面向大内存系统的 SLAB内存管理算法。还有一种动态内存堆管理叫做memheap,适用于系统含有多个地址可不连续的内存堆。使用memheap可以将多个内存堆“粘贴”在一起,让用户操作起来像是在操作一个内存堆。
I/O设备管理: RT-Thread将PIN、I2C、SPI、USB、UART等作为外设设备,统一通过设备注册完成。实现了按名称访问的设备管理子系统,可按照统一的API界面访问硬件设备。在设备驱动接口上,根据嵌入式系统的特点,对不同的设备可以挂接相应的事件。当设备事件触发时,由驱动程序通知给上层的应用程序。这也很像Linux系统。
RT-Thread内核启动流程
RT-Thread 支持多种平台和多种编译器,而 rtthread_startup() 函数是 RT-Thread规定的统一启动入口。一般执行顺序是:系统先从启动文件(即汇编文件)开始运行,然后进入 RT-Thread 的启动 rtthread_startup(),最后进入用户入口 main()
先执行启动文件,汇编文件位置
对时钟等进行初始化
最后跳转到入口函数
进行初始化
即执行 main_thread_entry()
函数,最终还是执行main函数
即这个函数,对应用户层