RT-Thread线程构建
RT-Thread 操作系统的启动过程如下
main()函数作为其中的一个线程在运行。
如果想新建一个线程,和main()线程并行运行,步骤如下:
第一步:线程初始化函数申明 static void LED1_thread_init(void);
第二步:定义线程堆栈大小static rt_uint8_t RT_LED1_STACK[2048];
第三步:定义线程结构体变量 struct rt_thread LED1;
第四步:定义线程入口函数
void thread_entry_LED1(void * parameter)
{
MX_GPIO_Init(); //必不可少
while(1)
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); //PA0=0,LED ON
rt_thread_mdelay(300);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); //PA0=1,LED OFF
rt_thread_mdelay(300);
rt_kprintf("thread %d is running ,thread %d count = %d\n", 2 , 5 , 34);
}
}
第五步:初始化线程并启动线程,类似于初始化函数和启动函数,见图。
①和第三步所构建的线程结构体名称相同
②和入口函数名称相同
③④堆栈数组名
⑤优先级
⑥时间片,如果时间片到了就重置时间片,调用rt_thread_yield()让出CPU。
⑦启动线程
⑧指示性语句,可有可无
第六步:只有执行LED1_thread_init()才会启动此线程;可在main()函数中如图2-12-8所示启动静态线程。
实验现象:主线程main()和LED1线程各自不受干扰的闪烁;串口发送不同的内容到计算机,表明main线程和LED1线程全部工作。
rt_thread_mdelay(300);是延时300ms的函数,但是这个函数并不独子占用CPU,即这个函数会被分割成很多的时间片去分别执行,而不是一直连续执行到结束。
通过类似的方法可以添加更多的线程。