从收到开发板到现在已经有一段时间了,一直没有时间来学习,最近才匆匆忙忙移植了RT_Thread,中间也遇到了恨到问题,现在整理了一下发出来供大家一起参考、探讨及学习。(目前只是跑起来,后续的外设驱动如uart、I2C以及SPI等驱动正在写)。
1、准备工作
首先需要新建一乐裸机例程(需要在其开发工具NucleiStudio_IDE下建立),先打开开发工具文件夹下的eclipse,然后在Workspace处输入工作路径(必须为英文路径)
新建工程,点击File->New->C/C++ Project ,选择C Managed Build,然后输入工程名并选择GigaDevice RISC-V C Project,然后一路next,具体配置如图所示。
2 下载RT_Thread Nano 源码(文末有整理好的,也可以去RT_Thread官网下载),将其中的libcpu、include以及src文件夹复制到新建工程目录下的rt_thread文件夹中(需要在新建工程下新建rt_thread文件夹),同时还需要复制bsp文件夹下的board.c和rtconfig.h文件到新建工程下的rt_thread文件夹中。其中libcpu文件夹下只保留risc,risc文件夹下只保留bumblebee和common两个文件夹。
3 工具链配置:点击Project->Properties,首先配置Bulid Tool Path、OpenOCD Path、RISC-V Toolchains Paths,添加其路径(在解压的IDE文件夹下)
主要配置“C/C++ Build->Settings-> Tool Settings-> GUN RISC-V Cross Assembler->Includes”下可选择汇编头文件包含路径,添加bumblebee、rt_thread、include以及common文件夹,注意顺序(bumblebee文件夹必须在最前,原因还在研究。。。)
汇编头文件路径----->
同时在GUN RISC-V Cross C Compiler->Includes下添加所有用到的头文件路径。
随后在“C/C++ Build->Settings-> Build Steps->Post-Build steps 添加command: riscv-none-embed-objcopy -O binary "GD32VF103C_START.elf" "GD32VF103C_START.bin";riscvnone-embed-objdump -D "GD32VF103C_START.bin" > "GD32VF103C_START.dump"(不包括command后的冒号)4 修改start.S
修改启动文件,实现 RT-Thread 的启动:由于 RT-Thread Nano 在 GCC 环境下的启动是由 entrry() 函数调用了启动函数 rt_thread_startup(),所以需要修改启动文件 start.S,使其在启动时先跳转至 entry() 函数执行,而不是跳转至 main(),这样就实现了 RT-Thread 的启动。
5 系统时钟配置
需要在 board.c 中实现 系统时钟配置(为 MCU、外设提供工作时钟)与 OS Tick 的配置(为操作系统提供心跳 / 节拍)。
riscv_clock_init() 配置了系统时钟,ostick_config() 配置了 OS Tick。此处 OS Tick 使用硬件定时器实现,需要用户在 board.c 中实现该硬件定时器的中断服务例程 eclic_mtip_handler() ,调用 RT-Thread 提供的 rt_tick_increase() 。由于 eclic_mtip_handler() 中断服务例程由用户在 board.c 中重新实现,做了系统 OS Tick,所以需要将自定义的 eclic_mtip_handler 删除,避免在编译时产生重复定义。如果此时对工程进行编译,没有出现函数重复定义的错误,则不用做修改。
7 编译运行
移植好RT_Thread之后,只需在main函数中添加头文件rtthread.h(#include <rtthread.h>),并将原程序中的延时函数修改为rt_thread_mdelay(500)(延时时间自行设定)。
编译程序之后下载到芯片就可以看到基于 RT-Thread 的程序运行起来了,LED 正常闪烁。
注意事项:当添加 RT-Thread 之后,裸机中的 main() 函数会自动变成 RT-Thread 系统中 main 线程 的入口函数。由于线程不能一直独占 CPU,所以此时在 main() 中使用 while(1) 时,需要有让出 CPU 的动作,比如使用 rt_thread_mdelay() 系列的函数让出 CPU。
与裸机 LED 闪烁应用代码的不同:
1). 延时函数不同: RT-Thread 提供的 rt_thread_mdelay() 函数可以引起操作系统进行调度,当调用该函数进行延时时,本线程将不占用 CPU,调度器切换到系统的其他线程开始运行。而裸机的 delay 函数是一直占用 CPU 运行的。
2). 初始化系统时钟的位置不同:移植好 RT-Thread Nano 之后,不需要再在 main() 中做相应的系统配置(如 hal 初始化、时钟初始化等),这是因为 RT-Thread 在系统启动时,已经做好了系统时钟初始化等的配置。
至此,GD32VF103V_EVAL移植RT_Thread完毕,如有什么问题或者建议,一同学习探讨。
NucleiStudio_workspace.rar
(1.69 MB, 下载次数: 14)
全部回复 0
暂无评论,快来抢沙发吧