RT-Thread是一个实时操作系统(RTOS),支持嵌入式系统中的线程管理。本文介绍了如何在RT-Thread中创建和脱离线程。通过示例代码,展示了如何创建两个静态线程led0_threadled1_thread,并分别控制LED灯的闪烁。led1_thread在执行20次后,会脱离led0_thread,使其停止闪烁。代码中详细说明了线程控制块、线程栈的初始化,以及线程的启动和调度过程。此示例展示了RT-Thread中线程管理的基本操作,适用于嵌入式开发中的多任务处理场景。

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "rtthread.h"

/****************************************
此代码创建两个静态线程led0_thread和led1_thread
线程2执行20次后会脱离线程1
******************************************/
static struct rt_thread led0_thread;//线程控制块
static struct rt_thread led1_thread;//线程控制块
ALIGN(RT_ALIGN_SIZE)
static rt_uint8_t rt_led0_thread_stack[1024];//线程栈
static rt_uint8_t rt_led1_thread_stack[1024];//线程栈
  
//线程LED0   led0闪烁计算闪烁次数输出
static void led0_thread_entry(void* parameter)
{
    while (1)
    {
        LED0=0; //注意:F7不支持位带操作,LED操作请参考代码修改
        rt_thread_delay(500);   //延时500个tick
        
        LED0=1;     
        rt_thread_delay(500);  //延时500个tick		
    }
}
  
//线程LED1
static void led1_thread_entry(void* parameter)
{
    rt_err_t err;
		rt_uint32_t count = 0;
    while (1)
    {
		LED1=0;   
		rt_thread_delay(500);  //延时100个tick

		LED1=1;    
		rt_thread_delay(500);   //延时100个tick
		if(count<21)
		{
			rt_kprintf("thread led1 count: %d\r\n",  count ++); /* 打印线程计数值输出 */
		}				
		if (count == 20)
		{
			err = rt_thread_detach(&led0_thread);            //当线程运行20次后,脱离线程LED0,led0不在闪烁

			if (err == RT_EOK)
			{
				rt_kprintf("led0线程已脱离\n");
			}
			else
			{
				rt_kprintf("led0线程未脱离\n");
			}
		}
		
    }
}
 
int main(void)
{
    // 创建静态线程
    rt_thread_init(&led0_thread,                 //线程控制块
                   "led0",                       //线程名字,在shell里面可以看到
                   led0_thread_entry,            //线程入口函数
                   RT_NULL,                      //线程入口函数参数
                   &rt_led0_thread_stack[0],     //线程栈起始地址
                   sizeof(rt_led0_thread_stack), //线程栈大小
                   3,                            //线程的优先级
                   20);                          //线程时间片
                               
    rt_thread_startup(&led0_thread);             //启动线程led0_thread,开启调度
									 
    // 创建静态线程                          
	rt_thread_init(&led1_thread,                 //线程控制块
				  "led1",                        //线程名字,在shell里面可以看到
				  led1_thread_entry,             //线程入口函数
				  RT_NULL,                       //线程入口函数参数
				  &rt_led1_thread_stack[0],      //线程栈起始地址
				  sizeof(rt_led1_thread_stack),  //线程栈大小
				  3,                             //线程的优先级
				  20);                                  
  
    rt_thread_startup(&led1_thread);             //启动线程led1_thread,开启调度
    
}

 串口运行截图入如下

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐