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自动初始化机制,确保函数在系统启动阶段被调用;若在应用代码中手动调用,需保证系统内核已初始化完成。