本帖最后由 xhackerustc 于 2024-5-8 21:53 编辑
#申请原创# @21小跑堂
本来想移植nuttx这款RTOS的,但恰好近一个月以来RT-Thread玩得比较多,所以练手目标改成RT-Thread了。大家想必有一个问题:APM官方sdk Examples/RTOS目录带了RT-Thread例子要移植啥?首先官方sdk那里是RT-Thread nano版,其次这就和各大厂商有自己linux内核仓库有自家芯片bsp,但又同时做主线linux内核一样。主线RT-Thread中目前还无APM32F411的支持,笔者本人以前从来没有独自给RT-Thread添加新芯片支持,这次就以这个任务来练练手。
clone最新RT-Thread源码
https://gitee.com/rtthread/rt-thread.git
更新apm32f4xx标准库
观察bsp/apm32下各目录组成:
形如apm32mnxyz-board这样的都是板级支持包。再看看libraries目录:
Drivers目录是在APM官方std driver之上的适用于RT-Thread接口的一层glue层,而形如APM32F4xx_Library这样的应该来自apm官方sdk,不妨瞅瞅APM32F4xx_Library:
这四个目录”APM32F4xx_ETH_Driver APM32F4xx_StdPeriphDriver CMSIS Device“大概率来自apm官方sdk。目前git log显示最近一次APM32F4xx_Library和apm sdk同步还是2023年一月,所以要支持APM32F411最好和APM的SDk同步下,直接从APM SDK那边拷贝过来。
新建bsp/apm32/apm32f411v-tinyboard目录
当然也不会从无到有创建此目录,最好以一个比较相似的芯片开发板为蓝本,仿照目录结构布局创建,比如笔者就选的apm32f407ig-minibroard
修改bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S
apm官方SDK默认是裸机环境,汇编初始化结束后跳转到main函数,但是RT-Thread通常是跳转到entry这个函数,需要做点修改应用于RT-Thread:
diff --git a/bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S b/bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S
index 89994c2022..1a5bbf0f8a 100644
--- a/bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S
+++ b/bsp/apm32/libraries/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S
@@ -91,8 +91,9 @@ L_loop1:
bl SystemInit
bl __libc_init_array
- bl main
- bx lr
+ bl entry
+L_loop3:
+ b L_loop3
.size Reset_Handler, .-Reset_Handler
// This is the code that gets called when the processor receives an unexpected interrupt.
修改bsp/apm32/apm32f411v-tinyboard/board/SConscript
这里需要修改下使用芯片相关的startup汇编源文件如下:
if rtconfig.PLATFORM in ['gcc']:
src += [startup_path_prefix + '/APM32F4xx_Library/Device/Geehy/APM32F4xx/Source/gcc/startup_apm32f411.S']
再加上芯片定义# You can select chips from the list above
CPPDEFINES = ['APM32F411']
修改bsp/apm32/apm32f411v-tinyboard/board/linker_scripts/link.lds
编主要是修改flash和sram大小
MEMORY
{
CODE (rx) : ORIGIN = 0x08000000, LENGTH = 512k /* 512KB flash */
DATA (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128KB sram */
}
以及startup code所在section,因为我下载的apm SDK中默认汇编写的startup code所在section名字为.apm32_isr_vector
KEEP(*(.apm32_isr_vector)) /* Startup code */
修改bsp/apm32/apm32f411v-tinyboard/applications/main.c
根据板子原理图有两LED,笔者选用LED2,它接到PE6引脚:
/* defined the LED2 pin: PE6 */
#define LED2_PIN GET_PIN(E, 6)
然后加点打印多显示一点信息,也区分其它板子bsp
#if defined(__CC_ARM)
rt_kprintf("using armcc, version: %d\n", __ARMCC_VERSION);
#elif defined(__clang__)
rt_kprintf("using armclang, version: %d\n", __ARMCC_VERSION);
#elif defined(__ICCARM__)
rt_kprintf("using iccarm, version: %d\n", __VER__);
#elif defined(__GNUC__)
rt_kprintf("using gcc, version: %d.%d\n", __GNUC__, __GNUC_MINOR__);
#endif
rt_kprintf("APM32F411V HelloWorld\r\n");
编译&烧录
cd bsp/apm32/apm32f411v-tinyboard/
scons --menuconfig
scons -j8
会在当前目录生成rtthread.bin文件,烧录之:
pyocd load -e sector -t apm32f411ve rtthread.bin
运行截图
|