RT-thread、手把手教学RTOS移植stm32过程
环境
芯片:stm32l431
编译器:keil ARM
一.rtt文件添加
1.下载RT-Thread Nano
官网下载rt-thread.org/download.html
2.解压rt-thread文件夹
3.rt-thread文件结构如下
4.RT-Thread 启动流程如下所示,在图中标出颜色的部分需要用户特别注意(黄色表示 libcpu 移植相关的内容,绿色部分表示板级移植相关的内容)。
5.接下来开始移植准备好项目文件和rt-thread文件
6.把rt-thread复制进项目文件夹
7.打开工程,先编译一下确保没有错误
8.开始添加RTT文件,User组添加board.c,rtconfig.h。
9.新建rtt/port组,并添加rtt C文件
10.新建rtt/source组,添加内核支持文件根据内核选择
我这里使用的是stm32l4系列,是contex-m4内核
11.在编译器中添加rtt头文件,包括以下这些
12.在User组新建board.h文件,添加rtt相关文件
二.修改rtt代码
1.首先注释rtconfig.h的头文件
2.注释后编译可以看到,因为rtt接管了部分中断所以和it.c文件函数有冲突,将it.c里面的3个函数注释掉。
it.h头文件也要注释
3.再次编译可以看到已经没有错误
4.接下来开始配置board.c文件,要将所有初始化放在这个文件里面,先添加头文件
将这里系统时钟初始化注释掉
下面的时钟宏定义,以及系统内核时钟函数也注释掉
把stm32的系统时钟放到board.c后面
把系统时钟初始化放到void rt_hw_board_init()
5.重新编译没有错误,自此移植结束。
三.使用rt-thread点亮LED
1.首先GPIO初始化
在board.c添加GPIO初始化函数
2.使用2种方式点亮LED
使用静态栈方式
#include "board.h"
//使用静态栈
ALIGN(RT_ALIGN_SIZE) //声明
static rt_uint8_t rt_led_link_thread_stack[512]; //申请栈空间
static struct rt_thread led_thread; //定义线程控制块
static void led_link_thread_entry(void* parameter)
{
while(1)
{
LED_ON;
rt_thread_delay(1000);
LED_OFF;
rt_thread_delay(1000);
}
}
int main(void)
{
rt_thread_init(&led_thread, "led_Link", led_link_thread_entry,\
RT_NULL, &rt_led_link_thread_stack[0], \
sizeof(rt_led_link_thread_stack), 3, 20);//初始化线程,优先级,时间片
rt_thread_startup(&led_thread); //启动LED线程
}
编译下载
可以看到LED正常闪烁
静态栈点亮LED
使用动态堆方式(推荐)
首先将rtconfig.h里面的宏定义打开
//使用动态内存,使用动态内存时需要在rtconfig将RT_USER_HEAP开启
static rt_thread_t led_thread = RT_NULL; //定义线程控制块
static void led_link_thread_entry(void* parameter); //声明进程
int main(void)
{
led_thread = rt_thread_create("led_Link",
led_link_thread_entry,
RT_NULL,
512, 4, 20);
if (led_thread != RT_NULL)
rt_thread_startup(led_thread); //启动led线程
else
return -1;
}
static void led_link_thread_entry(void* parameter)
{
while(1)
{
LED_ON;
rt_kprintf("led1_thread running,开灯!\r\n");
rt_thread_delay(50);
LED_OFF;
rt_kprintf("led1_thread running,关灯!\r\n ");
rt_thread_delay(50);
}
}
编译下载
也可以看到LED正常闪烁
动态堆点亮LED
作者:諰.