基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植

基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植

    • 准备工作
    • 安装rt_thread nano 3.0.3 软件包
    • 裸机工程添加rt_thread源码
    • RT-Thread文件夹内容简介
    • 添加RT_Thread源码到工程组文件夹
    • config.h文件修改
    • board.c文件修改
    • 修改main.c函数
    • 注意,此时编译还会存在问题,需要将stm32F10x_it.c中的HardFault_Handler(void)、PendSV_Handler(void)、SysTick_Handler(void)三个函数注释掉,才能编译成功,因为函数重复定义了。
    • 下载到开发板即可看到led闪烁实验现象

mdk527版本可以直接使用软件包方式进行移植,简单几步就可以完成,网上教程挺多,正点原子论坛也有教程,这里不赘述!本篇文章使用的是比较新的版本rt_thread nano(3.0.3)版本。nano版本是master版本的简洁版,新手使用建议采取这个版本就行,后期也很方便进行功能扩展,不用担心。
本文档主要参考野火的《RT_Thread内核实现与应用开发实战指南》

准备工作

  1. mdk527版本,可以进行官网下载
  2. rt_thread nano 3.0.3 版本,版本放在keil的官网,下载地址
    基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第1张图片
  3. 正点原子裸机工程模板,这里使用库函数版 “实验1.跑马灯实验”
    基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第2张图片

安装rt_thread nano 3.0.3 软件包

下载软件包之后,得到一个exe为后缀的文件,点击安装即可,安装目录与keil安装目录一致,成功安装后可以在keil安装目录看到此软件包的所有文件基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第3张图片
也可以在keil软件包管理页面看到
基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第4张图片

裸机工程添加rt_thread源码

使用软件包方式移植的工程,如果在新的没有安装rt_thread的keil中打开,会提示找不到rt_thread源文件。所以,在这里不采用软件包方式,我们把整个源码文件夹复制到我们的裸机工程根目录。基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第5张图片
源码文件夹下所有内容如下图所示
在这里插入图片描述
基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第6张图片
然后复制两个文件到user文件夹中
复制rtthread\3.0.3\bsp文件夹下的rtconfig.h文件到user文件夹下,该文件定义了rtthread的内核功能,可以通过宏定义进行裁剪内核功能
复制rtthread\3.0.3\bsp文件夹下的board.c文件到user文件夹下

RT-Thread文件夹内容简介

1、bsp文件夹
bsp(board support package)板级支持包。该文件夹内是rtthread为各个半导体厂商写好的驱动程序,nano版本只有少量几款开发板驱动,master版本有更多。我们现在只关心这个文件夹下的board.c 和rtconfig.h两个文件,前者是用来初始化开发板硬件的相关函数,后者是进行配置rtthread功能的基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第7张图片
2、components文件夹
RT_Thread除了内核文件,其他由第三方添加的软件都是组件,比如gui、fatfs、lwip、和finsh。这些组件都放在此文件夹内,目前nano版本只有finsh,其他都被删除。finsh是RT_Thread中最有特色的组件,他通过串口打印的方式输出各种信息,方便我们调试程序。
3、include文件夹
从文件夹名字就可以看出此文件夹是存放RT_Thread内核的头文件,是不可分割的一部分
4、libcpu文件夹
RT_Thread是一个操作系统,单片机是硬件实物,需要由接口文件讲 两者结合在一起,这些文件通常由汇编和C语言联合编写,真正的移植应该是编写这些文件,但是这些文件通常由RT_Thread和mcu原厂人员负责,这些文件存放在此文件夹内,我们只需要选择对应的文件(cortex-m3)加入到自己工程即可.
5、src文件夹
该文件夹内存放的是RT_Thread内核的源码,详细了解可以参考RT_Thread官网文档中心学习,有视频教程学习内核!

添加RT_Thread源码到工程组文件夹

刚刚只是把源码文件放在了本地工程中,还没有添加到开发环境的组文件夹中
1、新建两个组,rtt/source和rtt/ports
rtt/source用于存放src内的文件内容。
rtt/ports用于存放libcpu\arm\cortex-m?文件夹的内容,此处?取决于开发板使用的芯片,精英版使用的是cortex-m3。
2、将rtconfig.h和board.两个文件添加到user组文件夹内。
基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第8张图片
3、指定RT_Thread头文件路径
包含源码中所有有H文件的文件夹
基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第9张图片

config.h文件修改

注释掉头文件RTE_components.h,因为这个文件是使用软件包时自动生成的,这里我们没有使用,所以没有这个文件,需要注释掉。基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第10张图片
修改RT_THREAD_PRIORITU_MAX、RT_TICK_PER_SECOND和RT_MAIN_THREAD_STACK_SIZE这三个宏大小
基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第11张图片

board.c文件修改

修改内容也不多,首先systick相关的寄存器定义和初始化函数,这是与处理器有关的,稍后直接使用固件库函数就应,可以把这部分注释掉基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第12张图片
RT_Thread启动时会调用rt_hw_board_init()的函数,从名字可以看出来是进行初始化开发板硬件的,比如时钟,串口等,初始化完成后才继续向下启动。
注释掉部分代码,系统时钟由固件库提供
基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第13张图片
再在user文件夹下新建一个board.h头文件,用来包含固件库和bsp相关的头文件,并存放board.c
中的函数声明,此头文件包含在board.c文件内,代码如下
基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第14张图片

#ifndef _BOARD_H_
#define _BOARD_H_

/*
*****************************************************************
*         包含的头文件
*****************************************************************
*/

/*stme32 固件库文件*/

#include "stm32f10x.h"

/* 开发板硬件bsp头文件*/
#include "led.h"

/*
*****************************************************************
*         函数声明
*****************************************************************
*/


void rt_hw_board_init(void);
void SysTick_Handler(void);


#endif /*  _BOARD_H_*/

修改main.c函数

删除原裸机工程中的main.c文件内所有内容,新增如下内容
main.c文加内加入了一个静态线程,相关知识可以自行学习,下载到精英版可以看到led灯闪烁
led的初始化函数在board.c文件中的rt_hw_board_init()函数被调用
基于正点原子精英版stm32f103zet6进行rt_thread(3.0.3)的移植_第15张图片



#include "board.h"

#include "rtthread.h"

/*
*****************************************************************
*       变量
*****************************************************************
*/

/*定义线程控制块*/

static struct rt_thread led1_thread;

/*定义线程控制栈时候 需要进行字节对齐 */

ALIGN(RT_ALIGN_SIZE)

/*定义线程栈*/

static rt_uint8_t rt_led1_thread_stack[1024];

/*
*****************************************************************
*       函数声明
*****************************************************************
*/

static void led1_thread_entry(void *parameter);

/*
*****************************************************************
*       main函数
*****************************************************************
*/


 int main(void)
 {	
		/* 
	   *开发板硬件初始化,RTT系统初始化时候已经在main()函数之前完成
	   *即在compoment.c文件中的rtthread_startup()函数中完成了
	   *所以在main函数中只需要创建线程和启动线程即可
	  */
	 rt_thread_init(&led1_thread,
									"led1",
									led1_thread_entry,
									RT_NULL,
									&rt_led1_thread_stack[0],
									sizeof(rt_led1_thread_stack),
									3,
									20);
	rt_thread_startup(&led1_thread);
									
									
 }
/*
*****************************************************************
*       线程定义
*****************************************************************
*/
 
static  void led1_thread_entry(void *parameter)
{
		while(1)
		{
				LED0 = 0;
				rt_thread_delay(100);
				LED0 = 1;
				rt_thread_delay(100);
		}	 
}


注意,此时编译还会存在问题,需要将stm32F10x_it.c中的HardFault_Handler(void)、PendSV_Handler(void)、SysTick_Handler(void)三个函数注释掉,才能编译成功,因为函数重复定义了。

下载到开发板即可看到led闪烁实验现象

附完整工程代码链接:链接:https://pan.baidu.com/s/1p1MI0ZcvEK2bIUbSj7msyg
提取码:dwgo

你可能感兴趣的:(RT-Thread学习)