keil工程 freertos AC5编译器移植到AC6编译器

本文详细记录了将基于正点原子的Keil RTOS工程从AC5编译器移植到AC6的过程。首先,更换编译器后,编译出现大量错误,通过参考相关文章对源文件进行修改。接着,逐步解决编译错误,特别是针对函数`xPortPendSVHandler`进行了调整。在修改了特定文件如`port.c`后,错误明显减少。最终,经过对所有类似错误的处理,实现了AC6编译零错误零警告的目标。
摘要由CSDN通过智能技术生成

keil工程 freertos AC5编译器移植到AC6编译器

本文基于正点原子的rtos工程进行移植。
打开工程,将其更换为AC6编译器,然后点击编译
在这里插入图片描述
在这里插入图片描述
编译完成之后,我们可以看到有很多的错误,这里要先改基本的文件。
具体的可以参考这篇文章,本文不再过多赘述。

keil5工程 AC5 编译器升级 AC6编译器

在按照上述文章做了修改之后,再次编译
在这里插入图片描述
可以看到错误明显的变少了,这里的报错需要从源文件动手,因为AC5用的是GCC编译,AC6用的是clang编译,我们需要源文件的移植。

在这里插入图片描述
把上面这些文件复制过去,再次编译
在这里插入图片描述
可以看到错误又减少了很多,接下来打开port.c文件,可以看到有很多的错误
在这里插入图片描述
把这个函数换成下面这个

void xPortPendSVHandler( void )
{
	/* This is a naked function. */

	__asm volatile
	(
	"	mrs r0, psp							\n"
	"	isb									\n"
	"										\n"
	"	ldr	r3, pxCurrentTCBConst			\n" /* Get the location of the current TCB. */
	"	ldr	r2, [r3]						\n"
	"										\n"
	"	tst r14, #0x10						\n" /* Is the task using the FPU context?  If so, push high vfp registers. */
	"	it eq								\n"
	"	vstmdbeq r0!, {s16-s31}				\n"
	"										\n"
	"	stmdb r0!, {r4-r11, r14}			\n" /* Save the core registers. */
	"	str r0, [r2]						\n" /* Save the new top of stack into the first member of the TCB. */
	"										\n"
	"	stmdb sp!, {r0, r3}					\n"
	"	mov r0, %0 							\n"
	"	msr basepri, r0						\n"
	"	dsb									\n"
	"	isb									\n"
	"	bl vTaskSwitchContext				\n"
	"	mov r0, #0							\n"
	"	msr basepri, r0						\n"
	"	ldmia sp!, {r0, r3}					\n"
	"										\n"
	"	ldr r1, [r3]						\n" /* The first item in pxCurrentTCB is the task top of stack. */
	"	ldr r0, [r1]						\n"
	"										\n"
	"	ldmia r0!, {r4-r11, r14}			\n" /* Pop the core registers. */
	"										\n"
	"	tst r14, #0x10						\n" /* Is the task using the FPU context?  If so, pop the high vfp registers too. */
	"	it eq								\n"
	"	vldmiaeq r0!, {s16-s31}				\n"
	"										\n"
	"	msr psp, r0							\n"
	"	isb									\n"
	"										\n"
	#ifdef WORKAROUND_PMU_CM001 /* XMC4000 specific errata workaround. */
		#if WORKAROUND_PMU_CM001 == 1
	"			push { r14 }				\n"
	"			pop { pc }					\n"
		#endif
	#endif
	"										\n"
	"	bx r14								\n"
	"										\n"
	"	.align 4							\n"
	"pxCurrentTCBConst: .word pxCurrentTCB	\n"
	::"i"(configMAX_SYSCALL_INTERRUPT_PRIORITY)
	);
}

当然还有这里,
在这里插入图片描述
凡是遇到这种函数报错,全部换成上面或者下面的这种形式,之后也是如此,不再赘述。

static void vPortEnableVFP( void )
{
	__asm volatile
	(
		"	ldr.w r0, =0xE000ED88		\n" /* The FPU enable bits are in the CPACR. */
		"	ldr r1, [r0]				\n"
		"								\n"
		"	orr r1, r1, #( 0xf << 20 )	\n" /* Enable CP10 and CP11 coprocessors, then save back. */
		"	str r1, [r0]				\n"
		"	bx r14						"
	);
}

共计修改四个文件,有两个文件参考上面那篇文章修改,本文修改了两个文件。在这里插入图片描述
修改这两个文件完成之后编译。
在这里插入图片描述
可以看到AC6编译零错误零警告。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值