线程是rt_thread中一个非常重要的东西,它就好比我们在完成一个任务时我们通常会把任务分成一个个小任务然后一步一步来完成这个大任务。线程就好比我们一步一步做的小任务,所以对线程的掌握在学习rt_thread中是很重要的。
首先先贴上代码:
#include <rtthread.h> #include <rtdevice.h> #include <board.h> static void ledjun(void *param){ rt_pin_mode(16,PIN_MODE_OUTPUT);//控制引脚输出模式 while(1){ rt_pin_write(16,PIN_LOW);//控制引脚输出低电平 rt_thread_mdelay(500);//延时50ms rt_pin_write(16,PIN_HIGH); rt_thread_mdelay(500); } } static void sat8(void){ rt_thread_t tid=rt_thread_create( "led", //给予线程名字 ledjun, //设置入口函数 RT_NULL, //函数输入参数为无 512, //分配线程栈的大小 10, //线程优先级 10); //配置时间片参数 if(tid!=RT_NULL) rt_thread_startup(tid); } MSH_CMD_EXPORT(sat8, sat8 is the best)
如果对rt_thread中函数掌握的比较牢固的话应该理解起来不难,首先完成对跑马灯程序的编写然后开始创建线程。
如何完成跑马灯的编程就不在这儿详细讲了,毕竟就这么点东西注释已经在旁边写好了,如果想详细了解一下跑马灯编程的可以看我之前写的:
在rt_thread中用main函数来实现跑马灯的功能
现在让我们把重点放在线程的创建上:
首先让我们从第一行开始看,我们先是调用了创建线程的函数也就是rt_thread_create,这个函数是rt_thread为我们创建的让我们来看看它的格式:
rt_thread_t rt_thread_create(const char *name, void (*entry)(void *parameter), void *parameter, rt_uint32_t stack_size, rt_uint8_t priority, rt_uint32_t tick) {
首先我们要为线程取一个名字,在这里我们取的名字是led;然后设置线程入口函数,因为我们要完成的效果是跑马灯而跑马灯的函数在上方已给出所以我们只要把我们已创建好的跑马灯的函数名字粘贴进去就好;接着我们要设置函数的输入参数,因为在这里我们并没有使用输入参数所以写了RT_NULL,鉴于可能有人不知道输入参数是什么那我们在这里简单的说一下,输入参数就是在函数内部定义的局部变量,举个例子:
void jun(int bian){}
在这里bian就是输入参数;接下来分配线程栈的大小,在这里我们设置成立512k;
下一步就是设置线程的优先级,在rt_thread中数字越小优先级越高,0是最高优先级;最后就是配置时间片参数。
至此我们已经成功将线程初始化完毕了,那么接下来就是要启动这个线程,
if(tid!=RT_NULL) rt_thread_startup(tid);
因为创立线程需要在内存中分配空间以运行这个线程所以在提交完建立线程的请求后会给我们返回一个值以此来告诉我们线程的创建是否成功,如果不成功就返回RT_NULL,所以只要返回的不是RT_NULL我们就启动这个线程,在使用rt_thread_starup这个函数时要注意括号里的参数应该是线程的句柄,什么是句柄?句柄顾名思义是一个柄,它可以拉起一大堆的东西,这个东西就是我们用户自己定义的函数或者其他的一些东西(在这里就是我们自己创建的线程),在某些方面句柄和指针差不多(注意,这里只是差不多,区别还是有的)。
到这里,我们就大功告成了!是不是很开心?让我们来看看我们的劳动成果,咦?为什么我们的开发板一点反应都没有?是不是哪编错了?我可以很负责任的告诉你刚才你做的都没有错,错就错在使用线程时我们要进行串口输出,通过将函数添加到msh命令列表来输出函数,大家可以去下载一个串口调试工具这样在调试时会方便一些。
MSH_CMD_EXPORT(sat8,sat8 is the best)
这段代码中的MSH_CMD_EXPORT就是msh提供的函数以此来将用户函数添加到msh命令列表中,sat8就是我们给跑马灯函数起的名字,sat8 is the best是用户自己定义的,多半情况下你可以把注释或标记写进去,在这里我们写的是sat8 is the best。
到这步才算是真正的结束,现在我们把程序编译一下再下载进去led就能闪起来了。