1. 实验目标
  • 在 RT-Thread 中动态创建一个线程,控制 LED 以 1Hz 频率闪烁(亮 500ms,灭 500ms)。

  • 学习 RT-Thread 的动态线程创建、GPIO 操作和延时函数的使用。

#include <rtthread.h>

#include <board.h>  // 这个头文件会包含所有硬件相关的定义
#include <rtdevice.h>  // 必须包含这个头文件以使用GPIO功能



#define LED_PIN    GET_PIN(E, 7)  // 定义LED引脚为PE7

rt_pin_write(LED_PIN, PIN_HIGH);  // LED亮
rt_thread_mdelay(500);            // 延时500ms
rt_pin_write(LED_PIN, PIN_LOW);   // LED灭
rt_thread_mdelay(500);            // 延时500ms
2. 关键代码解析
(1) 硬件引脚定义
#include <rtthread.h>
#include <board.h>   // 硬件相关定义(如GPIO)
#include <rtdevice.h> // RT-Thread 设备驱动(必须包含)

#define LED_PIN GET_PIN(E, 7) // 定义LED引脚为PE7(根据实际硬件修改)
  • GET_PIN(E, 7):RT-Thread 的宏,表示 PE7 引脚(具体引脚需根据开发板调整)。

  • rtdevice.h:必须包含,否则无法使用 rt_pin_write() 等 GPIO 函数。


(2) 线程配置参数
#define THREAD_STACK_SIZE 512  // 线程栈大小(单位:字节)
#define THREAD_PRIORITY   25   // 线程优先级(数值越小优先级越高)
#define THREAD_TIMESLICE  5    // 时间片(单位:RT_TICK,可选)
  • 优先级:RT-Thread 优先级范围通常为 0~31(0 最高,31 最低)。

  • 栈大小:需根据任务复杂度调整(此处 512 字节足够点灯任务)。


(3) 线程入口函数

c

static void thread_entry(void *parameter)
{
    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); // 配置LED引脚为输出模式
    while (1)
    {
        rt_pin_write(LED_PIN, PIN_HIGH);   // LED亮
        rt_thread_mdelay(500);             // 延时500ms(非阻塞)
        rt_pin_write(LED_PIN, PIN_LOW);    // LED灭
        rt_thread_mdelay(500);             // 延时500ms
    }
}
  • rt_pin_mode():设置引脚模式(输入/输出/复用等)。

  • rt_thread_mdelay():毫秒级延时(非阻塞,线程会主动让出 CPU)。


(4) 动态线程创建
int thread_dynamic_create(void)
{
    rt_thread_t tid = rt_thread_create(
        "my_thread",          // 线程名称(用于调试)
        thread_entry,         // 入口函数
        RT_NULL,              // 参数(可传递变量)
        THREAD_STACK_SIZE,    // 栈大小
        THREAD_PRIORITY,      // 优先级
        THREAD_TIMESLICE      // 时间片(可选)
    );

    if (tid != RT_NULL)
    {
        rt_thread_startup(tid); // 启动线程(加入调度器)
        return RT_EOK;          // 返回成功
    }
    return -RT_ERROR;           // 返回失败
}

  rt_thread_create():动态创建线程(需手动释放内存)。

  • rt_thread_startup():启动线程(内部会调用 rt_thread_resume())。


(5) 主函数

int main(void)
{
    thread_dynamic_create(); // 创建并启动LED线程

    while (1)
    {
        rt_thread_mdelay(1000); // 主线程空闲(可添加其他逻辑)
    }
}
  • 主线程创建 LED 控制线程后,自身可执行其他任务或保持空闲。


3. 实验现象
  • LED 以 1Hz 频率闪烁(亮 500ms → 灭 500ms)。

  • 可通过 ps 命令查看线程状态:

    bash

    msh >ps
    thread     pri  status      sp     stack size max used left tick  error
    --------   ---  ------- ---------- ----------  ------  ---------- ---
    my_thread   25  running 0x00000080 0x00000200    30%   0x00000005 000
    main        10  suspend 0x000000b0 0x00000800    14%   0x00000014 000

4. 常见问题
  1. LED 不亮

    • 检查 LED_PIN 定义是否正确(参考开发板原理图)。

    • 确认硬件连接(如限流电阻、共阳/共阴电路)。

  2. 线程未启动

    • 确保调用 rt_thread_startup()

    • 检查栈是否溢出(通过 ps 命令的 max used 列)。

  3. 延时不准

    • rt_thread_mdelay() 受系统 tick 频率影响(默认 1000 ticks/秒)。


5. 扩展改进
  • 静态线程:改用 RT_THREAD_STATIC 定义线程(避免动态内存分配)。

  • 命令行控制:通过 FINSH 添加命令控制 LED 开关。

  • 信号量同步:用信号量实现线程间通信(如按键触发 LED 状态切换)。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐