基于RTT Nano的多任务嵌入式程序设计

一、RT-Thread 操作系统的特点和优势

RT-Thread可选优先级抢占式调度,256/32/8个优先级,线程数不限。相同优先级线程时间片轮转调度。支持动态创建/销毁线程.RT-Thread固定分区内存管理,小内存系统动态内存管理,大内存系统SLAB内存管理.RT-Thread支持semaphore、mutex、mailbox、message queue、event。mailbox可存储多条消息,任务等待可按照优先级进行排队。 UCOS信号量、互斥量、事件集、邮箱(邮箱最多只能存放一条消息),消息队列。 RT-Thread是由中国开源社区主导开发的开源实时操作系统。它的优点是精巧、高效、稳定的实时内核。

二、准备工作

2.1 CubeMX 上下载 RT-Thread Nano pack 安装包 1.Help -> Manage embedded software packages 点击 From Url 按钮,进入 User Defined Packs Manager 界面,其次点击 new,填入网址https://www.rt-thread.org/download/cube/RealThread.RT-Thread.pdsc,然后点击 check, 2.2 创建工程 芯片选择stm32f103c8 选择 Nano 组件 点击 Softwares Packages->Select Components,进入组件配置界面,选择 RealThread 配置Nano: RCC配置: SYS配置: 串口配置: 添加引脚A5,A6 NVIC取消选择 取消选择三个中断函数(对应注释选项是 Hard fault interrupt, Pendable request, Time base :System tick timer) 时钟树配置:

三、代码修改

在网上下载RT-THREAD:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/nano-port-keil/an0039-nano-port-keil 3.1 Keil添加 RT-Thread Nano 到工程

找到 RTOS,勾选 kernel,点击 OK 3.2 代码修改 创建任务 两个LED任务,一个灯每隔0.5秒闪烁,另一个灯在main.c中每隔一秒闪烁 在Application/USER文件夹下新 建rt_thread.c文件,并添加以下代码

#include "rtthread.h"
#include "main.h"
#include "stdio.h"
 
struct rt_thread led1_thread;
rt_uint8_t rt_led1_thread_stack[128];
void led1_task_entry(void *parameter);
 
//初始化线程函数
void MX_RT_Thread_Init(void)
{
          
   
	//初始化LED1线程
	rt_thread_init(&led1_thread,"led1",led1_task_entry,RT_NULL,&rt_led1_thread_stack[0],sizeof(rt_led1_thread_stack),3,20);
	//开启线程调度
	rt_thread_startup(&led1_thread);
}
 
//主任务
void MX_RT_Thread_Process(void)
{
          
   
	printf("Hello RT_Thread!!!");
	rt_thread_delay(2000);
}
 
//LED1任务
void led1_task_entry(void *parameter)
{
          
   
	while(1)
	{
          
   
		HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_6);
		rt_thread_delay(500);
	}
}

找到board.c文件,RT-Thread Nano 3.1.5生成的默认端口USART2,改为USART1 找到Application/User/Core里app_rt_thread.c下的rtconfig.h 在main.c文件中添加代码:

extern void MX_RT_Thread_Init(void);
extern void MX_RT_Thread_Process(void);
  MX_RT_Thread_Init();

while循环中添加代码:

HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_6);
		rt_thread_delay(1000);
经验分享 程序员 微信小程序 职场和发展