STM32
直播中

徐伟

7年用户 951经验值
私信 关注
[问答]

如何对基于正点原子精英版stm32f103zet6进行rt_thread进行移植?

如何对基于正点原子精英版STM32f103zet6进行rt_thread进行移植?

回帖(1)

李子跃

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



  • mdk527版本,可以进行官网下载
  • rt_thread nano 3.0.3 版本,版本放在keil的官网,下载地址




  • 正点原子裸机工程模板,这里使用库函数版 “实验1.跑马灯实验”





安装rt_thread nano 3.0.3 软件包

下载软件包之后,得到一个exe为后缀的文件,点击安装即可,安装目录与keil安装目录一致,成功安装后可以在keil安装目录看到此软件包的所有文件


也可以在keil软件包管理页面看到





裸机工程添加rt_thread源码

使用软件包方式移植的工程,如果在新的没有安装rt_thread的keil中打开,会提示找不到rt_thread源文件。所以,在这里不采用软件包方式,我们把整个源码文件夹复制到我们的裸机工程根目录。




源码文件夹下所有内容如下图所示










然后复制两个文件到user文件夹中
复制rtthread3.0.3bsp文件夹下的rtconfig.h文件到user文件夹下,该文件定义了rtthread的内核功能,可以通过宏定义进行裁剪内核功能
复制rtthread3.0.3bsp文件夹下的board.c文件到user文件夹下
RT-Thread文件夹内容简介

1、bsp文件夹
bsp(board support package)板级支持包。该文件夹内是rtthread为各个半导体厂商写好的驱动程序,nano版本只有少量几款开发板驱动,master版本有更多。我们现在只关心这个文件夹下的board.c 和rtconfig.h两个文件,前者是用来初始化开发板硬件的相关函数,后者是进行配置rtthread功能的




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用于存放libcpuarmcortex-m?文件夹的内容,此处?取决于开发板使用的芯片,精英版使用的是cortex-m3。
2、将rtconfig.h和board.两个文件添加到user组文件夹内。





3、指定RT_Thread头文件路径
包含源码中所有有H文件的文件夹





config.h文件修改

注释掉头文件RTE_components.h,因为这个文件是使用软件包时自动生成的,这里我们没有使用,所以没有这个文件,需要注释掉。


修改RT_THREAD_PRIORITU_MAX、RT_TICK_PER_SECOND和RT_MAIN_THREAD_STACK_SIZE这三个宏大小



board.c文件修改

修改内容也不多,首先systick相关的寄存器定义和初始化函数,这是与处理器有关的,稍后直接使用固件库函数就应,可以把这部分注释掉




RT_Thread启动时会调用rt_hw_board_init()的函数,从名字可以看出来是进行初始化开发板硬件的,比如时钟,串口等,初始化完成后才继续向下启动。
注释掉部分代码,系统时钟由固件库提供



再在user文件夹下新建一个board.h头文件,用来包含固件库和bsp相关的头文件,并存放board.c
中的函数声明,此头文件包含在board.c文件内,代码如下




#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()函数被调用








#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);
                }         
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分