创建动态线程最简单代码
#include <rtthread.h>//包含头文件
static rt_thread_t thread1 = RT_NULL; //创建线程控制块指针,指向空
static void thread1_entry(void *parameter)//线程入口(干什么)
{
rt_kprintf("do something");
}
int thread_run(void)
{
thread1 = rt_thread_create("thread1",
thread1_entry,
RT_NULL,
1024,
30,
10);
if (thread1 != RT_NULL)//判断创建是否成功
rt_thread_startup(thread1);
return 0;
}
MSH_CMD_EXPORT(thread_run, thread sample);//导入命令
静态函数
- 其他文件中可以定义相同名字的函数,不会发生冲突。
- 静态函数不能被其他文件所用。
- 静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
静态变量
- 不会被其他文件所访问,修改
- 其他文件中可以使用相同名字的变量,不会发生冲突。
字节对齐
参考此视频
动态线程和静态线程
动态线程 | 静态线程 | |
---|---|---|
内存 | 不占用RW/ZI段空间,空间小,需要动态分配内存 | 占用RW/ZI段空间 ,不需要动态分配内存 |
运行效率 | 相对低 | 相对高 |
句柄
动态线程:static rt_thread_t tid1 = RT_NULL;
静态线程:static struct rt_thread thread2;
参看定义,得知:typedef struct rt_thread *rt_thread_t;
,会发现前者是后者的指针,本质上是一样的东西
创建方式
比较:相对动态线程,静态线程需要额外提供线程句柄和线程栈地址
动态线程 | 静态线程 | |
---|---|---|
线程名字 | 需要提供 | 需要提供 |
线程入口 | 需要提供 | 需要提供 |
入口参数 | 需要提供 | 需要提供 |
线程栈大小 | 需要提供 | 需要提供 |
线程优先级 | 需要提供 | 需要提供 |
时间片轮 | 需要提供 | 需要提供 |
线程句柄 | 不需要提供 | 需要提供 |
线程栈地址 | 不需要提供 | 需要提供 |
- 动态线程
tid1 = rt_thread_create("thread1",//线程名字
thread1_entry, //线程入口
RT_NULL, //入口函数参数
THREAD_STACK_SIZE,//线程栈大小
THREAD_PRIORITY, //线程优先级
THREAD_TIMESLICE);//时间片轮
- 静态线程
rt_thread_init(&thread2, //线程句柄
"thread2",//线程名字
thread2_entry,//线程函数入口
RT_NULL,//入口参数
&thread2_stack[0],//线程栈地址
sizeof(thread2_stack),//线程栈大小
THREAD_PRIORITY - 1, //线程优先级
THREAD_TIMESLICE);//时间片
备注:RW/ZI段是程序总共使用的RAM字节数
#include <rtthread.h>
#define THREAD_PRIORITY 25 //定义的线程优先级
#define THREAD_STACK_SIZE 512//线程栈的大小
#define THREAD_TIMESLICE 5//时间片
//动态线程
static rt_thread_t tid1 = RT_NULL; //静态定义一个线程号
//线程1做什么:一直打印数值
static void thread1_entry(void *parameter)
{
rt_uint32_t count = 0;
while (1)
{
/* 线程1采用低优先级运行,一直打印计数值 */
rt_kprintf("thread1 count: %d\n", count ++);
rt_thread_mdelay(500);
}
}
//静态线程
ALIGN(RT_ALIGN_SIZE)//字节对齐,线程栈需要4字节对齐(4字节刚好是一个指针的大小)
static char thread2_stack[1024];//线程栈
static struct rt_thread thread2;
//线程2干什么:打印十次数字之后就打印退出语句
static void thread2_entry(void *param)
{
rt_uint32_t count = 0;//计数
for (count = 0; count < 10 ; count++)
{
rt_kprintf("thread2 count: %d\n", count);
}
rt_kprintf("thread2 exit\n");
}
//运行函数,需要被外部使用所以就不能使用static定义
int thread_sample(void)
{
//创建线程1
tid1 = rt_thread_create("thread1",
thread1_entry, RT_NULL,
THREAD_STACK_SIZE,
THREAD_PRIORITY, THREAD_TIMESLICE);
if (tid1 != RT_NULL)
rt_thread_startup(tid1);//如果创建成功,启动线程1
rt_thread_init(&thread2, //创建线程2
"thread2",
thread2_entry,
RT_NULL,
&thread2_stack[0],
sizeof(thread2_stack),
THREAD_PRIORITY - 1, THREAD_TIMESLICE);
rt_thread_startup(&thread2);
return 0;
}
MSH_CMD_EXPORT(thread_sample, thread sample);//导入命令
关键字和API
关键字和API | 解释 |
---|---|
rt_thread_t | 动态线程(结构体指针) |
rt_thread | 静态线程(结构体) |
ALIGN(RT_ALIGN_SIZE) | 设置变量4字节对齐 |
rt_thread_create | 创建动态线程 |
rt_thread_init | 创建静态线程 |
MSH_CMD_EXPORT | 命令导入 |