
RT-Thread
文章平均质量分 76
xiangxistu
嵌入式学习者;我是因为喜欢而入门这个行业的,我很感激能以此生存。在一年多的工作中,我从欣喜到回归平淡,又到现在的重新唤醒乐趣。我感觉我收获了许多,这是一种“看山是山,看水是水”回归,希望我的分享给带给更多人学习的乐趣。
在此,我献出我一直珍藏的名言:“实迷途其未远,觉今是而昨为”,与君共勉。
展开
-
RT-Thead 的学习理解索引
索引基础篇中级篇高级篇本索引主要的目的是,收集整理在 RT-Thread 操作系统学习时的心得。在文章命名时会依据 “[基础篇] _ xx _ [xxxxx]” 的形式命名文章。如果想了解更详细的使用方法,建议访问官方的文档中心。基础篇基础篇的内容主要是描述 RT-Thread 出现的接口如何使用,以及在使用时需要注意的内容。基础篇_01_线程创建基础篇_02_线程切换钩子函数与临界区基础篇_03_堆的初始化及 map 文件基础篇_04_IPC之信号量基础篇_05_IPC之互斥锁原创 2021-04-18 18:11:36 · 428 阅读 · 0 评论 -
基础篇_05_IPC之互斥锁
互斥锁,IPC的一部分。互斥锁,算是信号量中特殊的一个例子,即信号量的数量只为1,只要有任何一个线程获取到这个互斥量,在没有释放这个互斥量之前,任何线程都获取不到。除此之外,互斥锁还有一个作用,那就是提升当前信号量获取线程的的优先级。/*节选自rt_mutex_take()函数*//* change the owner thread priority of mutex */ if (th...原创 2018-09-23 09:26:47 · 495 阅读 · 0 评论 -
中级篇_03_线程调度的实现(二)
前情提要Cotex - M内核的三个中断屏蔽器 PRIMASK 只有一个单一比特的寄存器,被置一则关闭所有可屏蔽异常。只剩下MMI和硬FAULT可以响应。缺省为0,表示没有中断 FAULTMASK 只有一个单一比特的寄存器,被置一时,只有NMI才能响应。缺省为0,表示没有关异常 BASEPRI 最多有9位(由表达优先级的位数决定),它定义了被屏蔽优先级的阈值...原创 2018-10-30 21:19:52 · 1125 阅读 · 0 评论 -
中级篇_02_线程调度的实现(一)
多任务的切换的关键在于:保存当前任务的数据 + 切换到其他任务。这两个条件的目的是为了能够使程序看起来像是连贯的进行,就像是同时进行一样。至于保存当前程序的状态,什么反映了当前程序的状态?大家恐怕是比较疑惑这里的,实际上,程序得以运行是依靠ARM架构下的寄存器的,寄存器包括哪些?这里有传送门<ARM寄存器组织>。调度准备篇还有思考过在创建线程时,需要开启一个栈,栈大小为512,...原创 2018-10-28 16:27:09 · 1146 阅读 · 0 评论 -
中级篇_04_对象容器的实现
目录对象枚举定义容器的定义容器接口的实现rt_object_get_information()函数rt_object_init()函数对象枚举定义** * The object type can be one of the follows with specific * macros enabled: * - Thread * - Semaphore * - Mutex ...原创 2018-11-02 18:32:27 · 2227 阅读 · 0 评论 -
中级篇_05_空闲线程和阻塞延时的实现
目录对空闲线程的理解空闲线程的实现对阻塞延时的理解阻塞延时的实现支持修改当前线程的状态支持记录线程恢复就绪态时间统计支持线程的切换对空闲线程的理解 空闲线程对于一个实时操作系统来说是十分重要的。因为线程会因为需要而主动放弃对CPU的使用,而恰好当前所有线程都放弃对CPU的使用,这时候就需要一个保底的线程----优先级最低的空闲线程。空闲线程的实现 空闲线程也是一个线程,同样是调用r...原创 2018-11-16 17:14:07 · 1017 阅读 · 0 评论 -
中级篇_06_优先级的实现
目录多优先级是怎么实现的__rt_ffs是怎么快速找到最先转入就绪态的线程的支持最多的优先级达到256级,怎么实现的[^1]多优先级是怎么实现的 多优先级是怎么实现的,__rt_ffs是怎么快速找到最先转入就绪态的线程的支持最多的优先级达到256级,怎么实现的1RTThread物联网操作系统&amp;lt;传送门&amp;gt; ↩︎...原创 2018-11-17 13:42:41 · 1927 阅读 · 0 评论 -
中级篇_07_定时器和时间片的实现
目录定时器的实现定时器的细节定时器定时余时检索硬定时器和软定时器时间片的实现时间片的细节长延时下的RT-Thread任务切换线程就绪列表,优先级表,定时器链表,对象容器,时间片这五者的关系怎么用一张图表示?他们中间是如何切换的?定时器的实现定时器的细节 对于一个单片机,定时器通常是最基础的功能。不过,这里的定时器是基于硬件的定时器。依靠时钟晶振,硬件电路来实现的。RT-Thread也有自己...原创 2018-11-17 20:50:00 · 2666 阅读 · 0 评论 -
ENV工具的使用
Scons构建工具的使用 scons工具在我第一次接触时候,就深深喜欢这样的配置方式。在env工具的加持下,配置工程变得轻而易举;学会使用scons工具不能局限于使用,还应当制作出package,进一步改善开发环境。目录Scons构建工具的使用...原创 2019-04-20 14:42:26 · 5637 阅读 · 0 评论 -
基础篇_04_IPC之信号量
IPC: Inter proess communication 大的任务中的各任务信息交互配合,内容包括信号量,互斥锁,消息队列,邮箱,事件 本篇文章,只讨论第一个内容,信号量1.信号量的创建和线程的创建方式类似,信号量的创建也分动态dynamic和静态static的分别,分别由两个函数实现。/*静态信号量的线程控制块*/static struct rt_semapho...原创 2018-09-22 11:26:06 · 790 阅读 · 0 评论 -
中级篇_01_从线程的创建到就绪态
多线程的表象就是CPU来回在多个线程中切换,造成这几个线程同时都在响应的感觉。所以核心是调度,而使调度有意义就需要告诉系统,当前可以调度那些线程。在RT-Thread中,线程创建——>加入就绪态——>线程运行。就绪态的实现,是因为引入了一个双向链表,将线程插入链表则表示就绪态,删除则表示脱离就绪态。...原创 2018-10-16 22:07:04 · 696 阅读 · 0 评论 -
基础篇_02_线程切换钩子函数与临界区
我们常说,空闲任务的优先级是最低的,仿佛任何任务都比它重要。但是实际上空闲任务,是作为所有RTOS中不可或缺的一部分。不管有那个任务被执行,总需要在必要时间切换到其他任务,满足系统的需要。所以,它最神奇,同时也最深奥。不过,由于知识能力所限,本人现在还不能清楚其中的重要核心部分;为了满足开发的需求,需要简单理解空闲任务及回调函数(钩子函数)的使用现象和简单的思考。1.钩子函数的创建 ...原创 2018-09-18 16:25:55 · 916 阅读 · 0 评论 -
基础篇_06_IPC之邮箱及消息队列
邮箱和消息队列,都是在需要数据交换的场景下使用。那么首先,先介绍邮箱。邮箱有一个具体的大小,邮箱内接收的数据的个数,不能超过邮箱总大小的四分之一。1.邮箱的创建&消息队列的创建/*静态邮箱的创建*/static struct rt_mailbox static_mailbox;static char mb_pool[2048];rt_mb_init(&stat...原创 2018-09-23 20:08:29 · 2449 阅读 · 0 评论 -
基础篇_07_IPC之事件
事件是什么,为什么需要事件?在RT-Thread中的IPC量已经包含了信号量,互斥量,邮箱,消息队列。事件作为IPC量的一种,它的和信号量和互斥锁类似,同样是为线程的运行增加限定条件。只不过事件的满足,拥有更加严格的条件。例如:同时满足1和2,满足1和2中的某一个,同时满足1,2,3,6中的条件或者满足其中某一个。1.事件的创建/*静态事件的创建*//*事件控制块*/static...原创 2018-09-23 22:01:42 · 460 阅读 · 0 评论 -
基础篇_08_IPC之消费者生产者问题
/* * 程序清单:生产者消费者例子 * * 这个例子中将创建两个线程用于实现生产者消费者问题 *(1)生产者线程将cnt值每次加1并循环存入array数组的5个成员内; *(2)消费者线程将生产者中生产的数值打印出来,并累加求和 */#include <rtthread.h>#define THREAD_PRIORITY 6#define THREA...原创 2018-09-24 10:42:08 · 389 阅读 · 0 评论 -
基础篇_09_信号机制
信号,信号不同于一般得IPC变量,信号不需要初始化,也没有删除;信号有安装,监控,发送,响应的操作。为什么没有安装操作的原因是,信号大部分是被系统所使用的,是已经创建过的,信号室友具体标号的,例如我们能使用的SIGUSR1,SIGUSR2;还有我们可以自己定义的部分。/** Each of the following macros expand to a positive integral...原创 2018-09-24 12:27:26 · 415 阅读 · 2 评论 -
基础篇_10_软件定时器
定时器,由RT_Thread虚拟出来得定时器,输入的参数有五个;相对于硬件的定时器,虚拟出来的定时器的定时时间的时间精度为滴答时钟起振的倍数,所以精度会有所损失;不过有利就有弊,软件定时器可以虚拟很多啊,也很好用。1.定时器的创建/* 静态创建 *//* 定时器的控制块 */static struct rt_timer static_timer;rt_timer_init(&am...原创 2018-09-24 16:59:48 · 1105 阅读 · 0 评论 -
基础篇_11_内存池
内存池,申请出得内存情况是内存块,相对于动态内存申请rt_malloc()申请的内存,rt_mp_alloc()申请的内存块的开头和结尾会包含指向上一块的指针和指向下一块内存块的指针。每块内存块的大小相等。动态申请内存不会出现任务调度,内存池申请内存会出现任务调度。1.初始化内存池对象/*静态初始化内存池对象*/static rt_uint8_t *ptr[50];static rt...原创 2018-09-24 19:25:11 · 351 阅读 · 0 评论 -
基础篇_03_堆的初始化及 map 文件
堆栈,是我们常常会听说过的词汇。搞嵌入式如果说不懂得堆栈可能会被怀疑学习了一个假的嵌入式。不过,坦白来说,我还是不太理解其中的细节,比如说栈的位置在哪?我们说栈是先进后出FILO形式的数据结构,堆是先进FIFO先出的形式的数据结构。栈是由系统操作的,而堆是由程序员操作的。我感觉这些解释都是玄而又玄的说法,我现在还没有理清头绪,以后有具体头绪了再来写出我的想法。现在先学习大佬的想法:栈...原创 2018-09-19 21:21:29 · 457 阅读 · 0 评论 -
基础篇_01_线程创建
1.thread线程的创建/*静态线程的创建启动删除的注意点*/在创建静态线程时,要注意分配线程控制块大小,以及线程结构体 threadx_statck[XX],static char threadx_statck[xx];static struct rt_thread threadx;静态线程的创建需要使用rt_thread_init()函数rt_thread_init...原创 2018-09-18 16:25:14 · 596 阅读 · 3 评论