这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » Rt-thread学习总结

共5条 1/1 1 跳转至

Rt-thread学习总结

菜鸟
2023-06-16 11:49:48     打赏
Rt-thread学习总结前言

 

RT-Thread的应用案例 智能家居系统:RT-Thread可以用于开发智能家居系统,实现对家庭设备的控制和监测,如温湿度监测、灯光控制、安防监控等。 工业自动化系统:RT-Thread可以用于开发工业自动化系统,实现对生产设备的控制和监测,如PLC控制、传感器数据采集等 物联网设备:RT-Thread可以用于开发各种物联网设备,如智能穿戴设备、智能家电等,实现设备之间的互联和远程控制。

原子操作

原子操作(Atomic operation)是指一种不可分割的操作,要么完全执行成功,要么完全不执行。原子操作的执行过程中不允许有任何中断,如果出现了中断,那么操作的结果就无法保证。原子操作通常用于多线程编程中,保证多个线程之间的并发执行不会出现数据竞争等问题。在实现原子操作时,通常使用硬件指令或者操作系统提供的原子操作函数来保证操作的原子性。 在应用层面,原子操作可以用于实现一些高级的同步和并发控制机制。例如,在多线程编程中,如果多个线程都需要访问同一个共享变量,为了避免数据竞争问题,可以使用原子操作来保证对该变量的操作是原子的。

 

线程间同步

在多线程实时系统中,一项工作的完成往往可以通过多个线程协调的方式共同来完成,那么多个线程之间如何 默契协作才能使这项工作无差错执行?下面举个例子说明。

例如一项工作中的两个线程:一个线程从传感器中接收数据并且将数据写到共享内存中,同时另一个线程周期性的从共享内存中读取数据并发送去显示,下图描述了两个线程间的数据传递:

06inter_ths_commu1.png

如果对共享内存的访问不是排他性的,那么各个线程间可能同时访问它,这将引起数据一致性的问题。例如,在显示线程试图显示数据之前,接收线程还未完成数据的写入,那么显示将包含不同时间采样的数据,造成显示数据的错乱。

将传感器数据写入到共享内存块的接收线程 #1 和将传感器数据从共享内存块中读出的线程 #2 都会访问同一块内存。为了防止出现数据的差错,两个线程访问的动作必须是互斥进行的,应该是在一个线程对共享内存块操作完成后,才允许另一个线程去操作,这样,接收线程 #1 与显示线程 #2 才能正常配合,使此项工作正确地执行。

同步是指按预定的先后次序进行运行,线程同步是指多个线程通过特定的机制(如互斥量,事件对象,临界区)来控制线程之间的执行顺序,也可以说是在线程之间通过同步建立起执行顺序的关系,如果没有同步,那线程之间将是无序的。

多个线程操作 / 访问同一块区域(代码),这块代码就称为临界区,上述例子中的共享内存块就是临界区。线程互斥是指对于临界区资源访问的排它性。当多个线程都要使用临界区资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步。

线程的同步方式有很多种,其核心思想都是:在访问临界区的时候只允许一个 (或一类) 线程运行。进入 / 退出临界区的方式有很多种:

1)调用 rt_hw_interrupt_disable() 进入临界区,调用 rt_hw_interrupt_enable() 退出临界区;详见《中断管理》的全局中断开关内容。

2)调用 rt_enter_critical() 进入临界区,调用 rt_exit_critical() 退出临界区。

 

信号量

以生活中的停车场为例来理解信号量的概念:

当停车场空的时候,停车场的管理员发现有很多空车位,此时会让外面的车陆续进入停车场获得停车位;

当停车场的车位满的时候,管理员发现已经没有空车位,将禁止外面的车进入停车场,车辆在外排队等候;

当停车场内有车离开时,管理员发现有空的车位让出,允许外面的车进入停车场;待空车位填满后,又禁止外部车辆进入。

在此例子中,管理员就相当于信号量,管理员手中空车位的个数就是信号量的值(非负数,动态变化);停车位相当于公共资源(临界区),车辆相当于线程。车辆通过获得管理员的允许取得停车位,就类似于线程通过获得信号量访问公共资源。

信号量工作机制

信号量是一种轻型的用于解决线程间同步问题的内核对象,线程可以获取或释放它,从而达到同步或互斥的目的。

信号量工作示意图如下图所示,每个信号量对象都有一个信号量值和一个线程等待队列,信号量的值对应了信号量对象的实例数目、资源数目,假如信号量值为 5,则表示共有 5 个信号量实例(资源)可以被使用,当信号量实例数目为零时,再申请该信号量的线程就会被挂起在该信号量的等待队列上,等待可用的信号量实例(资源)。

 06sem_work.png

信号量控制模块

 

RT-Thread 中,信号量控制块是操作系统用于管理信号量的一个数据结构,由结构体 struct rt_semaphore 表示。另外一种 C 表达方式 rt_sem_t,表示的是信号量的句柄,在 C 语言中的实现是指向信号量控制块的指针。信号量控制块结构的详细定义如下:

struct rt_semaphore { struct rt_ipc_object parent; /* 继承自 ipc_object 类 */ rt_uint16_t value; /* 信号量的值 */ }; /* rt_sem_t 是指向 semaphore 结构体的指针类型 */ typedef struct rt_semaphore* rt_sem_t;

 

 

rt_semaphore 对象从 rt_ipc_object 中派生,由 IPC 容器所管理,信号量的最大值是 65535。

 

 

信号量的管理方式

信号量控制块中含有信号量相关的重要参数,在信号量各种状态间起到纽带的作用。信号量相关接口如下图所示,对一个信号量的操作包含:创建 / 初始化信号量、获取信号量、释放信号量、删除 / 脱离信号量。

06sem_ops.png 

创建和删除信号量

当创建一个信号量时,内核首先创建一个信号量控制块,然后对该控制块进行基本的初始化工作,创建信号量使用下面的函数接口:

rt_sem_t rt_sem_create(const char *name, rt_uint32_t value, rt_uint8_t flag);

当调用这个函数时,系统将先从对象管理器中分配一个 semaphore 对象,并初始化这个对象,然后初始化父类 IPC 对象以及与 semaphore 相关的部分。在创建信号量指定的参数中,信号量标志参数决定了当信号量不可用时,多个线程等待的排队方式。当选择 RT_IPC_FLAG_FIFO(先进先出)方式时,那么等待线程队列将按照先进先出的方式排队,先进入的线程将先获得等待的信号量;当选择 RT_IPC_FLAG_PRIO(优先级等待)方式时,等待线程队列将按照优先级进行排队,优先级高的等待线程将先获得等待的信号量。

Note

注:RT_IPC_FLAG_FIFO 属于非实时调度方式,除非应用程序非常在意先来后到,并且你清楚地明白所有涉及到该信号量的线程都将会变为非实时线程,方可使用 RT_IPC_FLAG_FIFO,否则建议采用 RT_IPC_FLAG_PRIO,即确保线程的实时性。

 

 

最后  rt-thead的移植步骤:

 

RT-Thread的移植代码需要根据具体的硬件平台进行适配和修改。

1. 创建一个新的目录,用于存放RT-Thread的移植代码。

 

2. 在该目录下创建以下文件和文件夹:

   - rtconfig.hRT-Thread的配置文件,用于定义系统的配置选项和硬件平台相关的宏定义。

   - bsp:存放硬件平台相关的驱动代码和初始化代码的文件夹。

 

3. 修改rtconfig.h文件,根据硬件平台的特点和需求进行配置:

   - 定义CPU类型和频率。

   - 定义内存布局和大小。

   - 配置任务栈大小和优先级等。

 

4. bsp文件夹下创建以下文件:

   - bsp.c:硬件平台的初始化代码,包括时钟初始化、中断初始化、外设初始化等。

   - bsp.h:硬件平台的相关宏定义和函数声明。

   - uart.c:串口驱动代码,用于与开发板上的串口设备进行通信。

   - uart.h:串口驱动的相关宏定义和函数声明。

 

5. 实现bsp.c文件中的函数,包括时钟初始化、中断初始化、外设初始化等。

 

6. 实现uart.c文件中的函数,包括串口设备的初始化、发送和接收等。

 

7. main函数中初始化RT-Thread,并启动操作系统:

   - 调用rt_system_init()函数进行系统初始化。

   - 调用rt_thread_startup()函数启动操作系统。

 

8. main函数中创建其他任务,通过调用rt_thread_create()函数创建任务,并设置任务的入口函数、优先级和堆栈大小等。

 

9. 编译并下载代码到目标硬件平台,运行程序。

 

 





关键词: Rt-thread     总结    

高工
2023-06-25 10:31:00     打赏
2楼

RT-thread的各方面与uCOS相比较如何


高工
2023-11-02 08:49:31     打赏
3楼

进一步学习OS


高工
2023-11-04 09:55:40     打赏
4楼

继续学习RT-thread


工程师
2023-11-27 08:36:40     打赏
5楼

嵌入式OS学习下


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]