多线程-RGB_LED闪烁灯

目录

    • 线程
    • 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必须支持,如下:

多线程-RGB_LED闪烁灯

这里再谈一下,这个线程是提供的,相当于一个启动线程。它的任务就是创建用户需要的线程,完成使命后就退出。

这里的线程属性结构体用的直接初始化的形式,主要是为了知道有这种方式,其实不用写也没关系,创建线程时直接传入,使用默认值即可。

【创建线程】

搞定了和,就可以创建线程啦~,我们直接在中创建三个线程。

完整代码:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月27日
下一篇 2021年4月27日

相关推荐