线程的创建和使用可以分为以下几个具体步骤:
1.创建线程入口函数,此函数内容决定线程的功能是什么。
2.确定线程的类型(静态还是动态)以及线程的优先级,栈空间以及时间片大小。
3.创建线程,实际就是定义线程的结构体内容。
static void 名称(void *parameter)
{
“具体内容”
}
其中具体内容可循环执行(包括while(1))也可顺序执行.
静态线程为用户手动分配栈空间,动态由系统动态分配。静态线程为rt_thread_init,动态则为rt_thread_create创建。
线程优先级为0最高,255为系统支持的最低优先级,资源紧张的系统中一般由优先级可以设置为8或者32,一般使用STM32这种ARM Cortex-M框架的MCU,默认为32个优先级。
线程栈大小需要根据实际使用去设定,一般方法为设置一个固定值(2048,1052这种),然后观察线程栈最大使用量,为70%即为合适。
对于时间片的大小,若线程中无优先级相同的线程,则时间片大小不起作用,如果需要用到多个任务同时进行,则根据每个任务完成时间确定时间片大小,需要时间多的时间片较大。
时间片单位为系统节拍。
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);
/* 定义线程控制块指针 */
rt_thread_t tid = RT_NULL;
/* 创建线程 */
tid = rt_thread_create( "thread_test",
thread_entry,
RT_NULL,
512,
10,
5);
线程删除使用 rt_rhread_detach(&xxx);
动态线程创建实例:
#include
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);注释即可。