本帖最后由 sujingliang 于 2024-12-14 21:15 编辑
RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用于家电、消费电子、医疗设备、工控等领域大量使用的 32 位 ARM 入门级 MCU 的场合。
与 RT-Thread 完整版不同的是,Nano 不含 Scons 构建系统,不需要 Kconfig 以及 Env 配置工具,也去除了完整版特有的 device 框架和组件,仅是一个纯净的内核。
SDK中有一个RT-Thread Nano的例程,位于:G32A1xxx_SDK_V1.1(3)\G32A1xxx_SDK_V1.1\Examples\G32A1465\RTOS\RT-Thread
本文在这个例程的基础上再增加FinSH Shell点灯。
一、main函数是rt-thread的一个线程
void rt_application_init(void)
{
rt_thread_t tid;
#ifdef RT_USING_HEAP
tid = rt_thread_create("main", main_thread_entry, RT_NULL,
RT_MAIN_THREAD_STACK_SIZE, RT_MAIN_THREAD_PRIORITY, 20);
RT_ASSERT(tid != RT_NULL);
#else
二、main中建立2个点灯线程
int main(void)
{
/* Initialize LEDs */
LED_Init();
/* Create thread */
led_thread = rt_thread_create("led1",
led_thread_entry,
RT_NULL,
256,
3,
20);
/* Startup thread */
rt_thread_startup(led_thread);
led2_thread = rt_thread_create("led2",
led2_thread_entry,
RT_NULL,
256,
3,
20);
rt_thread_startup(led2_thread);
}
三、点灯线程函数
void led_thread_entry(void* parameter)
{
while (1)
{
LED_Toggle(LED_GREEN);
rt_thread_delay(1000);
}
}
RT-Thread 提供的 rt_thread_mdelay() 函数可以引起操作系统进行调度,当调用该函数进行延时时,本线程将不占用 CPU,调度器切换到系统的其他线程开始运行。而裸机的 delay 函数是一直占用 CPU 运行的。
上面实现了红灯和绿灯的翻转。
四、自建个FinSH Shell点灯文件led.c
#include "rtthread.h"
#include "board.h"
// 控制LED的函数
void led_control(rt_bool_t state)
{
if (state)
{
// 打开LED
LED_On(LED_BLUE);
}
else
{
// 关闭LED
LED_Off(LED_BLUE);
}
}
void led_on(void)
{
led_control(true);
}
void led_off(void)
{
led_control(false);
}
// 导出到msh(FinSH的命令行解释器)的命令
MSH_CMD_EXPORT(led_on, Turn the LED on);
MSH_CMD_EXPORT_ALIAS(led_on, lon, Turn the LED on (alias));
MSH_CMD_EXPORT(led_off, Turn the LED off);
MSH_CMD_EXPORT_ALIAS(led_off, loff, Turn the LED off (alias));
五、运行效果
键入help,可以看到shell commands增加了4个命令:
串口显示RT-THREAD已经成功运行。
键入led_on,蓝灯亮;
键入led_off,蓝灯灭。
|