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 移植相关的内容,绿色部分表示板级移植相关的内容)。

RT-Thread 启动流程

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值