目录
-
- 线程
- RTX Thread API
- 实验:RGB灯闪烁
-
- 准备
- 配置线程
- 编译运行
- 其他
-
- multiple instances(多个实例)
- joinable Thread(可接合线程)
- 小结
- 参考资料
开始学习线程之前,你可能需要复习:
-
什么使用RTOS/p>
-
TX系统移植
如果准备就绪,那么,进入正题!
线程
线程概念
In CMSIS-RTOS2, the basic unit of execution is a “Thread”. A Thread is very similar to a ‘C’ procedure but has some very fundamental (根本的)differences. An RTOS program is made up of a number of threads, which are controlled by the RTOS scheduler.
线程是程序执行的基本单元。我们可以将程序分解为多个功能相对独立的子任务(类似C函数模块化调用),然后为每个子任务分配一个线程,而RTOS负责子任务之间的调度,从而实现多线程的”并行”,提高程序的实时性和效率。
线程调度
问题来了,是如何进行线程调度的其实很简单,scheduler以产生的周期性中断作为时基,给每个线程分配一个时间片(相当于分配多少个sysTick),当某个线程的时间片用完了,就阻塞该线程,而调度另一个就绪线程执行。那是什么们知道微处理器上面有很多时序电路,所以我们经常会用到石英晶振来产生稳定的时钟信 。一个时钟周期就是一个,它一般是一个很精准的固定量,比如对于8MHz的晶振,其时钟周期是 1 / 8 M H z = 0.125 u s 1/8MHz = 0.125us 1/8MHz=0.125us,即。
线程管理
When a thread is created, it is also allocated its own thread ID. This is a variable which acts as a handle for each thread and is used when we want to manage the activity of the thread.
每个线程都有一个id,我们可以通过这个id来管理线程。
线程切换
当线程切换时,kernel会将当前线程的所有变量状态保存到该线程的栈中,同时将该线程的运行信息保存到线程控制块中,然后执行另外一个线程。
线程通常有三种状态:运行态、就绪态、阻塞态。
配置线程
- 创建线程ID
- 创建线程函数和线程属性结构体
- 创建线程
【创建线程ID】
创建三个线程,分别表示红、绿、蓝三个线程ID。
【创建线程函数和线程属性结构体】
这里以线程为例,其他两个类似。首先,我们来看线程创建函数,其函数原型为:
该函数有三个参数:
- : 线程名字
- : 线程函数的参数
- : 线程的属性配置,包括线程函数名,栈大小,优先级等等。
返回值
- : 表示该线程的ID 。
所以,在创建线程之前,我们需要先定义:和
线程函数就是一般的函数形式,唯一注意的是两点:函数内包含死循环,以及参数为。重点说一下线程属性结构体。
类型 | 数据成员 | 描述 |
---|---|---|
线程名 | ||
不关心 ~ | ||
线程控制块起始地址,默认为动态分配 | ||
线程控制块大小,默认为 | ||
线程栈起始地址,默认为使用定长内存池 | ||
线程栈大小,默认为 | ||
线程优先级,默认 | ||
安全区标志,默认 | ||
保留位,必须是 |
一共9个,好多参数啊~,其实不必担心,我们常用的可能就和,其余的默认就好。所以,就有如下这种简易表示法。
不过要使用这种方式,keil必须支持,如下:

这里再谈一下,这个线程是提供的,相当于一个启动线程。它的任务就是创建用户需要的线程,完成使命后就退出。
这里的线程属性结构体用的直接初始化的形式,主要是为了知道有这种方式,其实不用写也没关系,创建线程时直接传入,使用默认值即可。
【创建线程】
搞定了和,就可以创建线程啦~,我们直接在中创建三个线程。
完整代码:
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!