RT-Thread 动态线程点灯实验笔记
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. 常见问题
-
LED 不亮
-
检查
LED_PIN定义是否正确(参考开发板原理图)。 -
确认硬件连接(如限流电阻、共阳/共阴电路)。
-
-
线程未启动
-
确保调用
rt_thread_startup()。 -
检查栈是否溢出(通过
ps命令的max used列)。
-
-
延时不准
-
rt_thread_mdelay()受系统 tick 频率影响(默认 1000 ticks/秒)。
-
5. 扩展改进
-
静态线程:改用
RT_THREAD_STATIC定义线程(避免动态内存分配)。 -
命令行控制:通过
FINSH添加命令控制 LED 开关。 -
信号量同步:用信号量实现线程间通信(如按键触发 LED 状态切换)。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)