RT-Thread学习笔记二——线程的实际使用和创建

线程的创建和使用可以分为以下几个具体步骤:

1.创建线程入口函数,此函数内容决定线程的功能是什么。

2.确定线程的类型(静态还是动态)以及线程的优先级,栈空间以及时间片大小。

3.创建线程,实际就是定义线程的结构体内容。

1.创建线程入口函数

static void 名称(void *parameter)
{
  “具体内容”
}

其中具体内容可循环执行(包括while(1))也可顺序执行.

2.线程类型确定以及具体线程控制块参数设定

静态线程为用户手动分配栈空间,动态由系统动态分配。静态线程为rt_thread_init,动态则为rt_thread_create创建。

线程优先级为0最高,255为系统支持的最低优先级,资源紧张的系统中一般由优先级可以设置为8或者32,一般使用STM32这种ARM Cortex-M框架的MCU,默认为32个优先级。

线程栈大小需要根据实际使用去设定,一般方法为设置一个固定值(2048,1052这种),然后观察线程栈最大使用量,为70%即为合适。

对于时间片的大小,若线程中无优先级相同的线程,则时间片大小不起作用,如果需要用到多个任务同时进行,则根据每个任务完成时间确定时间片大小,需要时间多的时间片较大。

时间片单位为系统节拍。

3.线程的创建

3.1静态线程创建

static rt_uint8_t thread1_stack[512];   //线程栈
static struct rt_thread thread1;		//线程控制块
rt_thread_init(&thread1,				//线程handle
               "thread1",				//线程名称
               thread1_entry,			//线程入口函数
               RT_NULL,					//线程入口参数
               &thread1_stack[0],       //线程栈地址
               sizeof(thread1_stack),	//线程栈大小
               15, 	 					//线程优先级
               5);	

静态线程占用内存不可释放,只能使用rt_thread_detach() 函数将该线程控制块脱离对象管理器。

线程删除使用        rt_rhread_detach(&xxx);

3.2动态线程创建

/* 定义线程控制块指针 */
rt_thread_t tid = RT_NULL;
/* 创建线程 */
tid = rt_thread_create(    "thread_test",
                           thread_entry, 								
	                       RT_NULL, 
                           512,
                           10,
                           5);

线程删除使用        rt_rhread_detach(&xxx);

动态线程创建实例: 



#include <rtthread.h>
void task1(void *parameter)
{
    rt_uint32_t ci=0 ;
    while(ci<100)
    {
        ci=ci+1 ;
   rt_kprintf("task is done %d\n",ci) ;
   rt_thread_mdelay(500);
    }
}
static rt_thread_t tid = RT_NULL ;
int main(void){
tid= rt_thread_create("usart",    //线程名称
                              task1,  //线程入口函数
                              RT_NULL,        //参数
                              1024,           //线程栈
                              3,             //优先级
                              10);            //时间片
if (tid != RT_NULL)
{
  // rt_thread_startup(tid);
   rt_kprintf ("uasrt is ok") ;
}//线程创建成功则开启线程
else{
   rt_kprintf ("dynamic_thread create failure\n") ;
}
return 0;
}

/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(task1, task1);

动态线程实际创建例程:

现象:在终端控制中输入task1并回车,即可观察到线程运行。如需自动运行,则将最后一行代码 MSH_CMD_EXPORT(task1, task1);注释即可。

猜你喜欢

转载自blog.csdn.net/Reasally/article/details/127027132