打印
[其他]

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

[复制链接]
536|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 jinyi7016 于 2025-7-2 14:34 编辑

#申请原创# @21小跑堂

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

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





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



如果这时开始编译,会有如下的错误





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





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


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





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

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


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




使用特权

评论回复
沙发
AdaMaYun| | 2025-7-31 17:46 | 只看该作者
进阶任务-FREERTOS非常值得学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

148

主题

1411

帖子

12

粉丝