RT-Thread
文章平均质量分 94
RT-Thread个人学习笔记
柯西的彷徨
道阻且长,行则将至。
展开
-
[021] [RT-Thread学习笔记] CPU利用率计算
> 全速运行:不响应中断,也不去执行其他任务,就单纯让它在一个地方持续运行一段时间,这个值可以体现CPU的算力有多大。- `total_count`:单位时间内全速运行下的变量值,表现了单片机全速运行下,所能达到的最大值。- `count`:单位时间内**空闲**任务自加的变量值- `cpu_usage` :CPU利用率,`cpu_usage = (total_count – count)/ total_count × 100 %`- `CPU_USAGE_CALC_TICK`:cpu利用率计算周原创 2022-03-27 18:47:32 · 3175 阅读 · 0 评论 -
[020] [RT-Thread学习笔记] 消息队列
- 消息队列可以发送任意字节的数据(最大65535),但是每条消息的大小在初始化就已确定,之后不可以更改- 消息队列采用链式存储的队列结构,将队列缓冲区切割成`mq->max_msgs`个大小为`mq->msg_size + sizeof(struct rt_mq_message)`字节的节点,其中`struct rt_mq_message`为指向自身的结构,即链队的next指针,最后一个节点(最高地址)作为队头,从后往前链接消息节点- 每条消息前4个字节存储指针自身结构的指针(指针域),后面才开始存原创 2022-03-27 02:32:19 · 1124 阅读 · 0 评论 -
[019] [RT-Thread学习笔记] 线程位图调度算法
每个线程控制块都带有一个链表成员,根据优先级将`thread->slist`插入对相应优先级链表中,对于相同优先级采取时间片轮转调度方式,若线程当前时间片已用完,且其所在的优先级队列为当前系统最高优先级,则调用`rt_list_insert_before(&(rt_thread_priority_table[thread->current_priority]),&(thread->tlist))`将此线程插入到末尾,切换到表头线程运行。原创 2022-03-26 03:26:48 · 1292 阅读 · 0 评论 -
[018] [RT-Thread学习笔记] 上下文切换分析
- 进入ESR前,硬件将psr, pc, lr, r12, r3, r2, r1, r0 压入 [from] 线程栈中- 进入ESR中,若rt_thread_switch_interrupt_flag为0则退出,反之将其清零- 进入ESR中,软件将r4 - r11 压入 [from] 线程栈中- 进入ESR中,更新当前psp为to线程的栈指针- 进入ESR中,软件将 [to] 线程栈中的保存的r4 - r11 弹出给寄存器- 进入ESR中,将lr = `EXC_RETURN`的 第二位置1表示返回原创 2022-03-25 20:26:12 · 2315 阅读 · 1 评论 -
[017] [RT-Thread学习笔记] 线程栈的初始化
在初始化/创建线程时会调用`_thread_init()`函数,关键代码如下:```cstatic rt_err_t _thread_init(struct rt_thread *thread, const char *name, void (*entry)(void *parameter), void原创 2022-02-20 13:57:28 · 2050 阅读 · 0 评论 -
[016] [RT-Thread学习笔记] 链表源码分析
rt-thread中的链表源码在`rtservice.h`中,以宏或者内联函数的形式给出,其中,`list`为双向链表,`slist`为单向链表。rt-thread链表主要是为了连接管理内核对象,因此并无数据域,仅有指针域。# 1 单向链表## 1.1 单向链表节点结构体`Single List structure`定义在`rtdef.h`中:```cstruct rt_slist_node{ struct rt_slist_node *next;};typedef struc原创 2022-02-20 00:28:12 · 897 阅读 · 0 评论 -
[015] [RT-Thread学习笔记] 邮箱源码分析与应用
邮箱用于线程间通信(异步通信方式),如多个线程可以将它们检测到的按键状态、ADC采样值等信号发送到邮箱,其他线程向该邮箱取走需要的信息。# 1 邮箱工作机制![在这里插入图片描述](https://img-blog.csdnimg.cn/1a8681eea90642e7ba1c03acda947677.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5p-v6KW_55qE5b235b6o,size原创 2022-02-12 02:49:22 · 2044 阅读 · 0 评论 -
[014] [RT-Thread学习笔记] Keil中的$Sub与$Super的使用
# 1 功能介绍- `$Super$$foo`标识原函数`foo()`,调用`$Super$$foo`相当于直接调用`foo()`。- `$Sub$$foo`标识被调用的新函数,而不是原函数`foo`。在原函数之前或之后添加处理,即可在`$Super$$foo`调用前后都可以执行一些语句。# 2 应用场景- 对于无法修改或重新编译现有符号的情况,可以使用`$Sub`和`$Super`链接机制。例如,它位于外部库或ROM代码中。在这种情况下,您可以使用`$Super$$`和`$Sub$$`模式来原创 2022-02-11 13:41:12 · 639 阅读 · 0 评论 -
[013] [RT-Thread学习笔记] 动态内存堆管理
# 引言在[程序内存分布](https://blog.csdn.net/kouxi1/article/details/122860151?spm=1001.2014.3001.5502)中说明了ZI段的结束地址到RAM内存尾部的空间为RTT动态内存堆,本文主要说明RT-Thread**动态内存堆管理**算法,分析相关API源码,并给出示例代码以验证。# 1 裸机系统动态内存在启动文件`startup_stm32f103xe.s`中进行分配:```assembly;1-配置栈: 变量(局部/全原创 2022-02-10 22:44:06 · 992 阅读 · 0 评论 -
[012] [RT-Thread学习笔记] 程序内存分布
一般 MCU 包含的存储空间有:片内 Flash (ROM)与片内 RAM。```C Total RO Size (Code + RO Data) Total RW Size (RW Data + ZI Data) >>> RAM Total ROM Size (Code + RO Data + RW Data) >>> Flash(ROM)```| **Section** | **含义**原创 2022-02-10 14:36:22 · 1026 阅读 · 1 评论 -
[011] [RT-Thread学习笔记] 如何判断IPC通信的收发函数能否在中断上下文中使用
# 1 如何判断首先,IPC通信的初始化/脱离、创建/删除函数肯定不能在中断上下文中使用,因此这里主要判断IPC收发、等待这些函数可以使用的环境。简单粗暴的判断方法:只要函数中有`thread = rt_thread_self();`(*如果调度器还未启动,则返回RT_NULL*)这条语句,那么就不可以在中断上下文中使用。主要包含的函数为:信号量的获取、互斥量的获取和释放、事件集的接收、邮箱/消息队列的等待方式发送和接收。# 2 为什么?上述函数都是基于当前线程来执行相应操作的,如果资源不可原创 2022-02-08 23:15:45 · 525 阅读 · 0 评论 -
[010] [RT-Thread学习笔记] 线程内置定时器的作用
将线程内置定时器初始化为**单次触发硬件定时器**(`timer->parent.flag`没有或|上`RT_TIMER_FLAG_SOFT_TIMER`的话,就为硬件定时器,因为初值为0),其超时回调函数为`rt_thread_timeout`。最终会在滴答定时器Systick中断里,调用硬件定时器扫描函数`rt_timer_check`扫描硬件定时器列表,当有超时事件发生时就会调用对应的超时函数,因为是单次触发,所以**只会触发一次**定时器事件,触发后会将该定时器设为非激活态且不会再次启动。-原创 2022-02-08 22:07:57 · 991 阅读 · 0 评论 -
[009] [RT-Thread学习笔记] 事件集详解与应用
# 1 事件集概念事件是一种实现线程间通信的机制,主要用于实现线程间的**同步**,但事件通信只能是事件类型的通信,**无数据传输**。一个事件发生即是一个同步,事件集可以实现一对多(一个线程等待多个事件触发)、多对多(多个线程等待多个事件触发)的同步。其中,一个线程与多个事件的关系可以设为: - 特定事件触发唤醒线程 - 其中任意一个事件触发唤醒线程 - 几个事件都触发后才唤醒线程## 1.1 事件集与信号量的区别 - 对于事件集,接收线程可以等待多个事件同步,即多个事件对应一个或多个原创 2022-02-08 15:29:46 · 2048 阅读 · 0 评论 -
[008] [RT-Thread学习笔记] 求结构体首地址rt_list_entry函数与字节对齐RT_ALIGN宏
# 1 rt_list_entry函数rt_list_entry函数的作用是根据已知成员的地址,算出其结构体的首地址。函数定义如下(在`rtservice.h`中):## 1.1 源码分析```cpp#define rt_container_of(ptr, type, member) \ ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))/** * @brief 获取结构体入口地址 * @param no原创 2022-02-08 00:51:01 · 1905 阅读 · 2 评论 -
[007] [RT-Thread学习笔记] 中断锁、调度锁与死锁
中断锁中断锁即为全局中断开关,是禁止多线程访问临界区最简单的一种方式,即通过关闭中断的方式,来保证当前线程不会被其他事件打断(此时系统不再响应可以触发线程调度的外部事件),除非这个线程主动放弃了处理器控制权。CM3中任务调度是利用PendSV悬起异常完成的,PendSV中断的优先级一般设为最低,因为任务不能抢占中断获取CPU的使用权。中断锁中可以主动切换线程调度,因为本质上来说,线程的....原创 2022-02-07 21:20:23 · 4502 阅读 · 1 评论 -
[006] [RT-Thread学习笔记] 互斥量详解与应用
RT-Thread版本:4.0.5MCU型号:STM32F103RCT6(ARM Cortex-M3 内核)互斥量概念互斥量又名互斥锁、互斥型信号量,是一种特殊的二值信号量。任意时刻互斥量的状态只有两种:闭锁:互斥量被某线程持有,有且仅有该线程可以获得互斥量的所有权。开锁:互斥量被该线程释放,同时该线程也失去了对此互斥量的所有权。互斥量与信号量的区别:互斥量的线程拥有互斥量的所有权,互斥量只能由持有线程释放,信号量可以由任何线程释放;互斥量支持递归访问且能防止线程优先级翻转;二.原创 2022-02-06 22:06:16 · 1903 阅读 · 0 评论 -
[005] [RT-Thread学习笔记] 信号量详解与应用
同步与互斥先补充几个概念:执行单元:由当前硬件平台及其运行的操作系统来决定的,对于RT-Thread与STM32的执行单元为:线程与中断临界区:多个执行单元同时操作/访问同一块区域(代码)竞态:指多线程情况下计算的正确性依赖于相对时间顺序或线程的交错当多个执行单元(线程、中断)同时执行临界区,操作临界资源,会导致竞态产生,此时可以采用同步或互斥的方式解决该问题。同步:指按预定的先后次序运行。(有顺序性)线程同步:指多个线程通过特定的机制来控制线程之间的执行顺序。互斥:即不允许多个执行单元原创 2022-02-05 22:59:01 · 2427 阅读 · 2 评论 -
[004] [RT-Thread学习笔记] 定时器源码浅析及其应用
[RT-Thread学习笔记] 定时器源码浅析及其应用1 RT-Thread定时器基础知识1 RT-Thread定时器基础知识RT-Thread 的定时器提供两类定时器机制:单次触发定时器:在启动后只会触发一次定时器事件,然后定时器自动停止周期触发定时器:周期性的触发定时器事件,直到用户手动的停止,否则将永远周期性执行下去当系统时钟节拍与定时器设定的超时时间相等时会回调一个函数,此函数即为超时函数,根据超时函数执行的上下文环境不同,RT-Thread定时器分为硬件定时器与软件定时器,如下图所示原创 2022-01-25 00:26:27 · 1292 阅读 · 0 评论 -
[003] [RT-Thread学习笔记] 时钟节拍的获取与线程时间片轮转调度的实现
# 1 时钟节拍获取> 时钟节拍可以通过`RT_TICK_PER_SECOND`宏配置,默认1000,即每秒执行1k次RTOS时钟节拍通过中断触发模式的硬件定时器产生,当中断到来时将调用一次`rt_tick_increase()`函数,让全局变量`rt_tick`自增1。在STM32中采用滴答定时器`systick`实现(在`drv_common.c`中):```cvoid SysTick_Handler(void){ /* enter interrupt */ rt_inte原创 2022-01-23 22:15:08 · 3559 阅读 · 2 评论 -
[002] [RT-Thread学习笔记] Env 软件包管理配置工具
[RT-Thread学习笔记] Env 软件包管理配置工具1 基础使用2 常用命令注意:Env工具所在的目录不能有中文路径1 基础使用在bsp根目录(工程根目录)右键打开env,输入menuconfig按空格键可选中软件包选好软件包直接按esc退出,并且选中yes保持2 常用命令输入pkgs可看到所有命令简介pkgs --update下载 :如果软件包在本地已被选中,但是未下载,此时输入: pkgs --update ,该软件包自动下载;更新 :如果选中的软件包在服务器原创 2022-01-20 17:26:43 · 1898 阅读 · 0 评论 -
[001] [RT-Thread学习笔记] 高精度延时函数rt_hw_us_delay的陷阱与优化
[RT-Thread学习笔记] 高精度延时函数rt_hw_us_delay的陷阱1 高精度延时函数简介2 隐藏的陷阱RT-Thread版本:4.0.5MCU型号:STM32F103RCT6(ARM Cortex-M3 内核)1 高精度延时函数简介RT-Thread定时器的最小精度是由系统时钟节拍所决定的,定时器设定的时间必须是 OS Tick 的整数倍。当需要实现更短时间长度的系统定时时,操作系统定时器将不能够满足要求,只能通过读取系统某个硬件定时器的计数器或直接使用硬件定时器的方式。对于Co原创 2022-01-19 20:46:38 · 8811 阅读 · 0 评论