RT-Thread
文章平均质量分 92
RT-Thread学习
~Old
Nothing but more and more nothingness
展开
-
RT-Thread线程创建和切换分析
提出问题:什么叫线程?思考这个问题之前,先想想怎么切换线程?怎么保存线程?想要回答以上的问题,需要了解一些微机原理和ARM架构及汇编的知识。原创 2022-10-06 18:57:04 · 2387 阅读 · 0 评论 -
RT-Thread消息队列
消息队列名称,内存缓冲区,消息大小以及队列长度等,同时每个消息队列对象中包含着 多个消息框,每个消息框可以存放一条消息,消息队列中的第一个和最后一个消息框被分别称为消息链表头和消息链表尾,对应于消息队列控制块中的msg_queue_head和msg_queue_tail;这个长度可以在创建消息队列时指定。发送紧急消息的过程与发送消息几乎一样,唯一不同的是,当发送紧急消息时,从空闲消息链表上取下来的消息块不是挂到消息队列的队尾,而是挂到队首,这样接收者就能够优先接收到紧急消息,从而及时的进行消息处理。原创 2022-09-28 13:38:13 · 1845 阅读 · 0 评论 -
RT-Thread对象容器的实现
对象容器是一个全局变量的数组,数据类型为struct rt_object_information,这是一个结构体类型,包含对象的三个信息,分别为对象类型,对象列表节点头和对象的大小,在rt_def.h中定义,具体实现见下面代码所示。初始化对象容器——线程,线程是RTT中最基本的对象,是必须存在的,它和其他对象不一样,没有通过宏来选择,接下来下面的信号量,邮箱都通过对应的宏定义来控制是否初始化,即只有在创建了相应的对象之后,才在对象容器里面初始化。原创 2022-09-24 22:13:46 · 562 阅读 · 0 评论 -
RT-Thread邮箱
通过邮箱,线程或中断服务函数可以将一个或多个邮件放入邮箱中,同样,一个或者多个线程可以从邮箱中获得邮件消息,当有多个邮件发送到邮箱时,通常应将先进入邮箱的邮件先传给线程,也就是说,线程先得到的是最先进入邮箱的消息,即先进先出原则(FIFO),同时RT-Thread中的邮箱支持优先级,也就是说在所有等待邮件的线程中优先级最高的会先获得邮件。如果邮箱中存在邮件,那么接收线程将复制邮箱中的4个字节邮件到接收线程中,通常来说,邮件收取过程中可能是阻塞的,这取决于邮箱中是否有邮件,以及收取邮件时设置的超时时间。原创 2022-09-26 16:59:09 · 1354 阅读 · 0 评论 -
RT-Thread启动流程
第二种我称之为小心翼翼,十分谨慎法,这种方法是在main函数中将硬件和RTOS系统初始化好,然后创建一个启动线程后就启动调度器,然后再启动线程里面在创建各种应用线程,当所有的线程都创建好之后,启动线程把自己删除,具体的伪代码实现如下。、应用线程的优先级比初始线程的优先级高,那创建完后立马去执行刚 刚创建的应用线程,当应用线程被阻塞时,继续回到初始线程被打断的地方继续往下执行, 直到所有应用线程创建完成,最后初始线程把自己关闭,完成自己的使命;到所有应用线程创建完成,最后初始线程把自己关闭,完成自己的使命。原创 2022-09-24 14:23:56 · 1490 阅读 · 0 评论 -
RT-Thread互斥量
举个例子:怎么独享厕所?自己开门上锁,完事了自己开锁。相比于信号量,信号量是只要有钥匙,谁都可以开锁,互斥量相当于里面的人反锁了,只能谁拥有谁释放。这需要有两个前提:任务B很老实,不撬门(一开始不"give"信号量)没有坏人,别的任务不会give信号量可以看到,使用信号量确实也可以实现互斥访问,但是不完美它的核心在于:谁上锁,就只能由谁开锁。原创 2022-10-02 18:18:52 · 914 阅读 · 0 评论 -
RTOS的基本概念与线程基础知识
它有一个栈底的地址, 是一开始就确定的,当有数据进栈或者出栈时,地址就会连续变动,不然就放到同一个存储地址中了,CPU需要有个地方保存这个不断变化的地址,这就是栈指针(SP)寄存器。RTOS的意思是:Real Time Operating System,即实时操作系统,但使用Windows,我们经常碰到程序卡死、停顿的现象,日常生活中,这是可以忍受的,但是在电梯系统中,你按住开门键时如果没有即刻反应,即使知识慢个一秒钟,也会夹住人,在专用的电子设备中,实时性很重要。回答这个问题之前,先想想怎么切换线程?原创 2022-09-19 19:29:40 · 6160 阅读 · 5 评论 -
RT-Thread定时器
当指定的flag为RT_TIMER_FLAG_HARD_TIMER时,如果定时器超时,定时器的回调函数将在时钟中断的服务例程上下文调用,当指定的flag为RT_TIMER_FLAG_SOFT_TIMER,如果定时器超时,定时器的回调函数将在系统时钟timer线程的上下文中被调用。当定时器设定的时间到了,即超时时,执行的动作函数称之为定时器的超市函数。定时器,是指从指定的时刻开始,经过一个指定的时间,然后触发一个事件,类似定个时间提醒第二天能够按时起床,定时器有软件定时器和硬件定时器之分;原创 2022-09-27 15:35:17 · 3859 阅读 · 0 评论 -
RT-Thread任务间同步及通信
在多实时任务操作系统中,一项工作的完成往往可以通过多个任务协调的方式共同来完成。例如,一个任务从传感器中接收数据并且将数据写到共享内存中,同时另一个任务周期性的从共享内存中读取数据并发送显示,如下图两个线程间的数据传递如果对共享内存的访问不是排他性的,那么各个线程间可能同时访问它。这将引起数据一致性的问题,例如在显示线程显示数据之前,,传感器线程还未完成数据的写入,那么显示将包含不同时间采样的数据,造成显示数据的迷惑。原创 2022-09-28 19:45:34 · 995 阅读 · 0 评论 -
RT-Thread线程管理与调度
创建线程主要可以看成四个步骤:1、动态分配或者静态分配线程控制块2、动态分配或者静态分配线程栈3、创建入口函数4、构造栈内容(线程控制块结构体的成员)上述函数的作用:调整sp和虚构栈内容线程调度由抢占式优先级和时间片轮转调度算法进行调度RT-Thread启动流程。原创 2022-09-24 13:30:30 · 3010 阅读 · 0 评论 -
RT-Thread——概述与体验
RT-Thread启动代码统一入口为rtthread_startup(),芯片启动文件在完成必要工作(初始化时钟、配置中断向量表、初始化堆栈、初始化PC指针、调用C库函数-main最终去到C的世界)后,最终会在程序跳转市,跳转至RT-Thread的启动入口中,RT-Thread的启动流程如下;可以分析看到,在stm32的启动代码中,先调用SystemInit:系统初始化、比如初始化时钟,调用__main函数:重定位,比如把代码段从Flash复制到内存,然后执行$Sub$$main。原创 2022-09-16 18:04:40 · 1919 阅读 · 0 评论 -
RT-Thread信号量
信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到同步或互斥的目的。信号量就像一把钥匙,把一段临界区给锁住,只允许有钥匙的线程进行访问,线程拿到了钥匙,才允许它进入临界区,而离开后把钥匙传递给排队在后面的等待线程,让后续线程一次进入临界区。原创 2022-10-01 15:03:23 · 1887 阅读 · 0 评论