RTT回顾

一、必备知识

①、多线程:在多线程系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称之为线程。每个线程都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理。

②、每个线程都需要分配独立的栈空间——预先定义好的全局数组or动态分配的一段内存空间,保存于RAM

③、系统为了顺利**调度线程**,为每个线程都额外定义了**线程控制块**——“身份证”。系统对线程的操作可以通过控制块来实现

④、线程创建好后,加入**就绪列表**,表示系统可以随时调度。

⑤、调度器是操作系统的核心——**实现线程的切换**
步骤:初始化、启动。
系统调度:在就绪列表寻找优先级最高的就绪线程,后执行。

⑥、临界段——一段在执行的时候不能被中断的代码段。
(对临界段保护的处理:直接把中断全部关了,NMI FAULT 和硬 FAULT 除外)
说明:临界段是一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进 入临界区的线程开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。

⑦、对象:采用內核對象管理系統來訪問 / 管理所有內核對象。
RT-Thread 內核對象包括:線程,信號量,互斥量,事件,郵箱,消息隊列和定時器,內存池,設備驅動等。對象容器中包含了每類內核對象的信息,包括對象類型,大小等。對象容器給每類內核對象分配了一個鏈表,所有的內核對象都被鏈接到該鏈表上,如圖 RT-Thread 的內核對象容器及鏈表如下圖所示:
在这里插入图片描述

⑧、容器——每当用户创建一个对象,将这个对象放在容器中,方便管理
容器的成员是否有效都是通过宏定义来决定的
在这里插入图片描述

⑨、空闲线程与阻塞延时
——阻塞延时——即线程需要延时的时候,线程会放弃 CPU 的使用权,CPU 可以去干其它的事情,当线程延时时间到,重新获取 CPU 使用权,线程继续运行,
在这里插入图片描述

⑩、多优先级
同一优先级的线程会被插入到同一链表(时间片)。
不同优先级根据优先级来决定插入到线程优先级表。
在这里插入图片描述

11.定时器,每个线程都会内置一个定时器
在这里插入图片描述

12.支持时间片
——当同一个优先级下有两个或两个以上线程的时候,线程支持时间片功能,即我们可以指定线程持续运行一次的时间,单位为 tick。

二、应用知识

㈠、创建线程——静态or动态。
在这里插入图片描述

重映射串口到 rt_kprintf 函数。

㈡、启动流程
法一:将所有线程一次性创建后再调度。
在这里插入图片描述
法二:在 main 函数中将硬件和 RTOS 系统先初始化好,然后创建一个启动线程后就启动调度器,然后在启动线程里面创建各种应用线程,创建的线程会出现不同的优先级情况,根据具体情况具体处理,当所有线程都创建成功后,启动线程把自己删除。
(可参考:https://blog.csdn.net/qq_41070511/article/details/103179499)
在这里插入图片描述

㈢、线程管理
在这里插入图片描述
线程调度的原则:是一旦线程状态发生了改变,并且当前运行的线程优先级小于优先级队列组中线程最高优先级时,立刻进行线程切换(除非当前系统处于中断处理程序中或禁止线程切换的状态)。
线程状态
在这里插入图片描述
线程迁移
在这里插入图片描述

㈣、消息队列———用于线程间通信的数据结构,即在线程与线程间、中断和线程间传送信息。
消息队列的阻塞机制 ——目的:为了保护每个线程对消息队列能正常完成读写操作,而不受后来的线程干扰的过程,

㈤、信号量
——一种实现线程间通信的机制,实现线程之间同步或临界资源的互斥访问,常用于协助一组相互竞争的线程来访问临界资源。
信号量就像一把钥匙,把一段临界区给锁住,只允许有钥匙的线程进行访问:线程拿到了钥匙,才允许它进入临界区;而离开后把钥匙传递给排队在后面的等待线程,让后续线程依次进入临界区。

㈥、互斥量
——保护资源的互锁、可以通过优先级继承算法,降低优先级翻转问题产生的影响

㈦、事件
——事件是一种实现线程间通信的机制,主要用于实现线程间的同步,但事件通信只能是事件类型的通信,无数据传输。
事件用于事件类型的通讯,无数据传输。
——可用事件来做标志位,判断某些事件是否发生了,然后根据结果做处理

㈧、软件定时器
——软件定时器以系统节拍周期为计时单位。从指定的时刻开始,经过一个指定时间,然后触发一个超时事件。

㈨、邮箱
——邮箱可以在线程与线程之间。中断与线程之间进行消息的传递。

㈩、内存管理
——通过对内存的申请、释放操作,来管理用户和系统对内存的使用,使内存的利用率和使用效率达到最优,同时最大限度地解决系统的内存碎片问题。
——分为:静态内存管理(内存池)与动态内存管理(堆内存管理模块).

猜你喜欢

转载自blog.csdn.net/qq_41070511/article/details/106633865
RTT