[其他] 【灵动微电子MM32F0121测评】进阶任务-FREERTOS(AC6)

[复制链接]
 楼主| jinyi7016 发表于 2025-6-25 14:29 | 显示全部楼层 |阅读模式
本帖最后由 jinyi7016 于 2025-7-2 14:34 编辑

#申请原创# @21小跑堂

上一篇,由于使用AC6移植FreeRTOS失败,很是不甘心,在网上找了很长时间,都是针对STM32的,于是只能自己研究了。

AC6使用的编译器工具链是ARMCLANG
移植支持ARMCLANG编译指令格式的文件,在portable/gcc中,即要使用portable/GCC/ARM_CM0中的文件
在工程目录下,删除原有RVDS的文件,添加GCC的文件,如下所示。


屏幕截图 2025-06-25 141158.jpg


在keil工程中,多增加两个源文件:


无标题.png
如果这时开始编译,会有如下的错误


屏幕截图 2025-06-25 141434.jpg


这个原因分析,可能是使用了gcc的M0文件,SVC_Handler的地址超过了0x800 - 0x7fe,无法进行寻址。
可以看到SVC_Handler在portasm.c中,找到这个函数。


屏幕截图 2025-06-25 141844.jpg


可以看到,我们在FreeRTOSSConfig.h中的宏定义为:
#define vPortSVCHandler         SVC_Handler


但这里调用的是vPortSVCHandler_C,而这个函数是在port.c中定义的,这与AC5编译器版本存在差异。
这时,我们把汇编指令 b 修改为bl ,再编译则没有这些错误了。


1750830841366.png


虽然修改后编译将没有错误,但下载运行后,程序会卡住,无法运行,仿真时,程序停在port.c中的如下断言位置。
  1. configASSERT( pxVectorTable[ portVECTOR_INDEX_SVC ] == SVC_Handler );
  2. configASSERT( pxVectorTable[ portVECTOR_INDEX_PENDSV ] == PendSV_Handler );
通过分析,是中断向量不匹配
pxVectorTable中的portVECTOR_INDEX_SVC (11)不是SVC_Handler
那回到中断向量的配置位置,是我们的启动文件中。
startup_mm32f0120_keil.s中的SVC_Handler 并不是这个名字,而是SVCall_Handler 。

于是修改startup_mm32f0120_keil.s文件中的所有SVCall_Handler 修改为SVC_Handler 。编译通过,并运行正常。
1750831064837.png

程序烧写后,运行正常,与AC5移植的工程效果相同。




AdaMaYun 发表于 2025-7-31 17:46 | 显示全部楼层
进阶任务-FREERTOS非常值得学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

1411

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部