本帖最后由 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移植的工程效果相同。
|