为了简便起见,从这篇文章开始,题目不再增加ARM官方《CMSIS-RTOS教程》几个字。
多重实例化Multiple Instances
RTOS的一个有趣功能就是可以针对一个线程进行多个实例化,例如你可以基于一个线程代码创建多个用于控制UART的实例,此时,每个UART的实例都会管理一个不同的UART硬件。
首先我们要创建线程结构体,并设置线程实例个数为2:
osThreadDef(thread1, osPriorityNormal, 2, 0);
练习:线程的多重实例化
在本练习中,我们将创建一个线程,并针对这线程创建多个运行实例。
打开Pack Installers,选择“Ex 4 Multiple Instances ”并复制到你的指定路径。
这个工程实现和LED闪烁相同的功能,但是这里增加了一个带参数的led切换函数,这个参数用了决定是哪个LED闪烁:
void ledSwitcher (void const *argument) {
for (;;) {
LED_On((uint32_t)argument);
delay(500);
LED_Off((uint32_t)argument);
delay(500);
}
}
在定义线程的位置,我们把实例个数设置为2:
osThreadDef(ledSwitcher, osPriorityNormal, 2, 0);
然后我们在main线程里创建两个线程,这个两个线程拥有相同的代码,但是却是不同的实例,我们给不同的实例传递不同的参数来实现不同的LED闪烁:
led_ID1 = osThreadCreate(osThread(ledSwitcher),(void *) 1UL);
led_ID2 = osThreadCreate(osThread(ledSwitcher),(void *) 2UL);
编译工程,并启动仿真环境。
运行代码,并打开RTX任务和系统窗口。
查看右下角的Call stack + locals 窗口。
从图中我们可以看到ledSwitcher的两个实例,还有它们的所有变量状态,还可以看到每个实例被传递了不同的参数。