本帖最后由 heart蓝 {MOD}CD 于 2020-2-22 12:33 编辑
分享iCore4T移植RT-Thread过程的点点滴滴——DAY 1
高手请略过,如有错误请多多批评指点!
首先放上iCore4T靓照
一、初识RT-Thread
RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统。以下我们就简称RTT,RTT是一款完全由我们国内团队开发的嵌入式实时操作系统,它诞生于2006年,最初源于对当时小型RTOS现状的诸多不满,RTT要打造一个精致而优雅的操作系统。从最初的V0.0.1发布,历经十几个年头的沉淀到今天的V4.0.0的发布,它正演变成一个功能强大、组件丰富的物联网操作系统。
RTT支持任务抢占,STM32默认支持优先级范围是32,支持多任务(线程)轮转调度,可以通过信号量、互斥量、事件集进行线程间同步,通过邮箱、消息队列、信号进行线程间的通信。RTT也支持动态内存、中断等管理。
二、辅助工具
2.1、Env简介
Env是RTT推出的开发辅助工具,针对基于RTT操作系统项目工程,提供编译构建环境、图形化系统配置及软件包管理功能,其内置的menuconfig提供了简单易用的配置剪裁工具,可对内核、组件和软件包进行自由剪裁,使用系统以搭积木的方式进行构建。
2.1.1 准备工作
在电脑上首先安装好git,软件包管理功能需要git的支持。
git下载地址:https://git-scm.com/downloads。
下载后一路next安装,安装完成测试是否安装成功。打开cmd,输入git,如果可以显示版本信息说明安装成功。
如果安装成功说明git已添加到系统环境变量。
下载Env工具
Env工具下载地址:https://www.rt-thread.org/page/download.html
下载后解压,打开Env控制台
双击Env目录下可执行文件env.exe
在文件夹中通过右键菜单打开 Env 控制台,添加 Env 至右键菜单。
2.1.2 如何使用
现在打开我已经制作好的bsp工程,我们通过Env工具对RTT系统进行菜单配置(制作方法我会在以后详细介绍)
打开工程文件rt-thread/bsp/stm32/stm32h750-gingko-icore4t,右击鼠标点击ConEmu Here
输入menuconfig,回车
至此我们就可以正确的借助Env来方便快速的对内核进行配置,进入RTT的世界。
2.2 Scons构建工具
SCons 是一套由 Python 语言编写的开源构建系统,类似于 GNU Make。它采用不同于通常 Makefile 文件的方式,而是使用 SConstruct 和 SConscript 文件来替代。这些文件也是 Python 脚本,能够使用标准的 Python 语法来编写。所以在 SConstruct、SConscript文件中可以调用 Python 标准库进行各类复杂的处理,而不局限于 Makefile 设定的规则。
上面我们介绍了可以通过Env来完成对内核、组件、BSP的配置,我们还可以通过Scons工具来完成对KEIL、IAR等工程的搭建。通过一条命令"scons --target=mdk5",即可完成KEIL新工程的生成。
三、烧录进我们的iCore4T双核心板
打开我们制作的最简单的BSP工程(在这里我们以MDK5为例),编译、下载。
iCore4T双核心板自带DEBUG_UART,打开终端Putty,程序运行后我们会发现RT-Thread信息打印在了终端。
我们在终端输入list_device,可以看一下当前已经挂载上的设备。
我将在DAY2里面给大家简单介绍如何制作最简单的BSP工程,也就是RT-Thread的移植过程。
高手请略过,如有错误请多多批评指点!
下面直接划重点
一、源代码下载
下载最新版的RT-Thread源代码:https://www.rt-thread.org/page/download.html
二、工程文件简介
2.1、我们将下载好的源码进行解压,可以看到共有以下文件夹,在这里我们只关注bsp文件夹下的内容。其他文件夹的内容暂时先不理会,有兴趣的伙伴可以先了解一下。
2.2、打开bsp文件夹,我们发现RT-Thread支持n多种厂商的MCU,iCore4T ARM+FPGA双核心板ARM采用的是ST的STM32H750IBK6,因此在这里我们打开stm32的文件夹。
2.3、打开stm32文件夹,可以看到这些文件夹可以大致分为3类,分别为docs文件夹,docs文件夹为官方提供的一些图文教程(相当详细);libraries文件夹,libraries文件夹为STM32的HAL库文件及RTT编写的STM32一些常外设的驱动文件;剩下的为各开发板的最简单的bsp工程。
三、BSP工程制作
我们今天的任务就是为iCore4T制作最简单的BSP工程,在这里我将文件夹命名为stm32h750-gingko-icore4t。 具体的制作过程我就不在重复介绍,上面介绍的docs文件夹中有非常详细的操作说明。
在这里我仅特别强调几个地方
1、使用STM32CubeMx(我用的是最新版本5.5.0)配置串口时候,我们配置UART2(iCore4T使用UART2做为DBG)。配置的时候只需要将UART2的两个引脚选择正确就可以了,其他参数我们不用理会,RTT驱动里面已经将其封装好。另:配置完引脚我习惯性将速度等级调至最大,以免会造成不必要的麻烦。
2、在../stm32/stm32h750-gingko-icore4t/board/Kconfig里面加入UART2的菜单配置。
3、Kconfig修改完成后按照我们在DAY1中的介绍,打开menuconfig,开启UART2,并将UART2做为DBG输出。
4、最后通过scons命令生成MDK工程,打开工程,修改main函数中的LED引脚,然后编译、下载,到此我们的BSP工程就制作完毕。我们再次看一下运行结果。
四、源代码
源代码可以移步这里下载:https://pan.baidu.com/s/1E627EdePeECauvWmAadxHA 提取码:i4wl
我将在DAY3里面给大家简单介绍RT-Thread的启动过程
高手请略过,如有错误请多多批评指点!
通过在DAY2移植好的程序进行下载发现,RTT的启动速度还是神速的,那么具体的过程是怎么样的呢?
1、SystemInit()
和裸机启动一样,第一步仍是先进行系统初始化,调用SystemInit()函数来完成FPU的设置以及向量表位置的配置。
2、$Sub$$main()
完成系统初始化后,就进入真的main函数开始系统启动,该函数在内核components.c文件中。那么$Sub$$main()函数到底是什么意思呢,我们在.s文件中可以看到,系统完成systeminit之后,就开始执行main函数,其实$Sub$$main()就是在主程序main前插入一段新代码,这段代码可以用来初始化系统,当然也可以做其他事情。在这里我们可以看到,调用了rtthread_startup()函数开始RTT系统启动。
3、rtthread_startup()
进入这个函数后就开始进行了真正的系统启动,我们可以看到rtthread_startup()共调用了这么多函数。
下面我给大家简单介绍一下这些函数具体做了哪些工作来完成整个系统启动的。
3.1 rt_hw_interrupt_disable()
该函数的功能就是关闭所有的中断。
3.2 rt_hw_board_init()
该函数的功能是进行板级初始化。使能ICache DCache,进行HAL初始化完成中断优化级配置、SYSTICK滴答定时器的配置,RTT操作系统堆初始化,GPIO时钟使能,UART设备初始化,选择作为终端输出的串口设备,最后进行板底层初始化。
3.3 rt_show_version()
该函数的功能是通过串口向终端输出RT-Thread操作系统的版本信息,就是我们在DAY1和DAY2中看到的信息。
3.4 rt_system_timer_init()
该函数的功能是完成系统定时器的初始化。
3.5 rt_system_scheduler_init()
该函数将初始化系统调度程序。
3.6 rt_application_init()
该函数的功能是创建main线程,并启动该线程,该线程默认优先级为10。
3.7 rt_system_timer_thread_init()
该函数的功能是创建定时器线程,并启动该线程,该线程的优先级最高,为0。
3.8 rt_thread_idle_init()
该函数的功能是创建空闲线程,并启动该线程,该线程的优化级最低。
3.9 rt_system_scheduler_start()
该函数的功能是开启系统调度。
至此系统启动完毕。
源代码可以移步这里下载:
链接:https://pan.baidu.com/s/1E627EdePeECauvWmAadxHA 提取码:i4wl
我将在DAY4里面给大家简单介绍RT-Thread添加设备驱动的方法
我的理解至少有几种优势:
1、成本优势:这个方案成本比ZYNQ低很多。
2、方案通用性:现在微控制器和FPGA都属于百花齐放的阶段,CPU和FPGA都可以根据自己的需求更换合适的,若成本敏感就换1块钱的M0和几块钱的CPLD,若需要更好的性能就用Cortex-A系列应用处理器加高容量FPGA。伸缩自如。
3、快速开发且更灵活:ZYNQ是 微处理器非控制器,裸奔过于复杂,需要上Linux,两个竞争不再一个段位内。
4、开发工具链优势:STM32在国内有众多的用户支持,且KEILMDK (或IAR )用户广泛,编译器优化的又快又好,而且出现了诸如CubeMX 这么优秀的工具,可以快速上手。
当然说这么多并不是ZYNQ不好,我的理解是任何东西合适就好,也许以后我们也会做ZYNQ的方案,各有千秋。
另外目前国内出现了诸多cortexM的国产芯片和一些国产的FPGA芯片,我认为这些东西目前属于百花齐放的阶段,某一个方案并不能够一统江湖。
以上为鄙人愚见,请多多指教。
一周热门 更多>