1. 创建第一个线程
任务目标
在RT-Thread系统中,使用rt_thread_create接口动态创建一个线程,线程启动后循环打印运行信息,以此掌握线程创建、启动与任务切换的基本流程。
核心实现
本案例基于RT-Thread标准版(QEMU模拟环境或真实开发板均可)。线程入口函数中通过rt_kprintf输出日志,并使用rt_thread_mdelay让出CPU,模拟周期性工作负载。
#include <rtthread.h>
/* 线程入口函数 */
static void thread1_entry(void *parameter)
{
rt_uint32_t count = 0;
while (1)
{
rt_kprintf("thread1 running, count = %d\n", count++);
rt_thread_mdelay(1000); /* 延时1秒,触发线程调度 */
}
}
/* 线程控制块指针 */
static rt_thread_t thread1 = RT_NULL;
/* 应用初始化示例:在rt_application_init中调用 */
int thread_sample_init(void)
{
/* 动态创建线程:名称、栈大小、优先级、时间片 */
thread1 = rt_thread_create("thread1",
thread1_entry,
RT_NULL,
1024, /* 栈空间1KB */
25, /* 优先级25 */
10); /* 时间片10个tick */
if (thread1 != RT_NULL)
{
rt_thread_startup(thread1); /* 启动线程 */
return 0;
}
else
{
return -1; /* 创建失败 */
}
}
/* 自动初始化:系统启动后自动调用 */
INIT_APP_EXPORT(thread_sample_init);
运行与验证
编译与运行:在RT-Thread工程中,将上述代码保存为thread_sample.c并添加到构建目录。若使用QEMU模拟器(如qemu-vexpress-a9),执行scons编译后运行生成的内核镜像;若使用真实开发板,则编译烧录后通过串口终端查看输出。
预期输出:系统启动后,串口终端应周期性打印类似以下信息(具体计数数值随运行时间递增):
thread1 running, count = 0
thread1 running, count = 1
thread1 running, count = 2
...
通过条件:观察到上述打印信息以约1秒间隔持续输出,且系统无崩溃或卡死现象,说明线程已成功创建、启动并正常参与调度。若使用list_thread命令(在FinSH控制台输入),应能看到名为thread1的线程处于suspend状态(因延时阻塞),证明线程生命周期管理正常。
关键说明
rt_thread_create动态分配线程控制块和栈空间,适用于线程数量不确定或需要销毁的场景;若需静态创建可使用rt_thread_init。- 优先级数值越小优先级越高,本例使用25(普通优先级),时间片10仅在相同优先级线程间轮转时生效。
INIT_APP_EXPORT为RT-Thread自动初始化机制,确保函数在系统启动阶段被调用;若在应用代码中手动调用,需保证系统内核已初始化完成。