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

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

本文基于正点原子的rtos工程进行移植。
打开工程,将其更换为AC6编译器,然后点击编译
在这里插入图片描述
编译完成之后,如下图,可以看到有很多的错误。
在这里插入图片描述
首先按照下面这篇文章修改好之后,再次进行编译

keil工程 freertos AC5编译器移植到AC6编译器
在这里插入图片描述
可以看到这次的错误出现在malloc.c里面,原因是因为AC6编译器已经识别不了这些指令了。我们将以上错误更换下面的

//内存池(4字节对齐)
__attribute__((aligned(4))) u8 mem1base[MEM1_MAX_SIZE];
__attribute__((aligned(4))) u8 mem2base[MEM2_MAX_SIZE] __attribute__((section(".ARM.__at_0x68000000"))); //外部SRAM内存池
__attribute__((aligned(4))) u8 mem3base[MEM3_MAX_SIZE] __attribute__((section(".ARM.__at_0x10000000"))); //内部CMM内存池
//内存管理表
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE];													//内部SRAM内存池MAP
u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((section(".ARM.__at_0X680C8000")));	//外部SRAM内存池MAP
u16 mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((section(".ARM.__at_0X1000F000")));	//内部CCM内存池MAP
//内存管理参数	   
const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE,MEM3_ALLOC_TABLE_SIZE};	//内存表大小
const u32 memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE,MEM3_BLOCK_SIZE};					//内存分块大小
const u32 memsize[SRAMBANK]={MEM1_MAX_SIZE,MEM2_MAX_SIZE,MEM3_MAX_SIZE};							//内存总大小

我将上面的各个块的地址计算出来然后加到新指令里面,暂时还没想到什么特别好的方法,然后我们在进行编译
在这里插入图片描述
可以看到错误明显的变少了。
在这里插入图片描述
再次进行工程编辑,把CC_ARM的宏定义取消,

在这里插入图片描述
可以看到编译成功。

### STM32 CubeMX FreeRTOS 使用 Arm Compiler V6 的配置教程及相关问题解决 #### 工具链概述 STM32CubeMX 是 STMicroelectronics 提供的一款图形化工具,用于简化基于 STM32 微控制器的项目初始化过程。通过该工具可以快速生成带有 FreeRTOS 实时操作系统的工程模板,并支持多种编译器环境,其中包括 ARM Compiler V6 (AC6)[^3]。 当使用 AC6 进行编译时,可能会遇到一些特定的问题或不兼容的情况。这些问题可以通过调整编译选项、修改链接脚本以及优化代码结构等方式加以解决[^4]。 --- #### 配置步骤 ##### 1. 创建并配置 STM32CubeMX 工程 在 STM32CubeMX 中创建一个新的工程,选择目标 MCU 并完成基本外设配置。随后,在中间件部分勾选 **FreeRTOS** 和其他必要的组件(如 LwIP 协议栈),以便自动生成相应的初始化代码[^1]。 ##### 2. 设置编译器Arm Compiler V6 进入 STM32CubeMX 的 “Project Manager” 页面,设置 Toolchain/IDE 为目标 IDE(例如 MDK-ARM)。接着切换到 Advanced Settings,指定 Compiler Version 为 `Arm Compiler V6`。这一步确保后续生成的 Makefile 或 UVision 工程文件适配最新的编译器特性。 ##### 3. 调整编译选项 由于 AC6 默认启用了更严格的语法检查机制,因此可能需要手动调整某些编译参数以消除警告或错误提示。常见的做法包括: - 添加 `-std=c99` 参数以启用标准 C99 支持; - 如果涉及 C++ 混合编程,则需额外引入 `-xc++` 标志; - 对于浮点运算单元的支持,应显式声明 FPU 类型(如 `-mfloat-abi=hard -mfpu=vfpv3-d16`)。 ##### 4. 修改链接脚本 有时默认生成的链接脚本无法完全满足复杂项目的内存布局需求。此时可尝试编辑 `.sct` 文件中的区域定义语句,确保堆栈分配合理且不会发生越界访问现象。例如: ```c LR_IROM1 0x08000000 0x000A0000 { ; load region size_region ER_IROM1 0x08000000 0x000A0000 { ; execution region RO code *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data & heap stack .ANY (+RW +ZI) } } ``` 上述片段展示了如何将程序加载地址与运行时数据区分开来,从而提升性能稳定性。 ##### 5. 解决已知问题 尽管官方文档提供了详尽指导,但在实际应用过程中仍可能出现意外状况。以下是几个典型案例及其应对策略: - **编译报错:未找到头文件** 确认路径变量是否正确设置了包含目录;如果仍然无效,则考虑更新至最新版 SDK 库[^2]。 - **调试连接异常中断** 查看 Keil uVision 是否安装了对应版本驱动包;另外还需验证 SWD 接口物理连线状态良好[^5]。 - **任务调度混乱** 审查优先级设定逻辑是否存在冲突之处;必要时降低并发度测试单一线程表现情况。 --- #### 示例代码 下面给出一段简单的 FreeRTOS 测试代码作为参考: ```c #include "main.h" #include "cmsis_os.h" void StartTask(void const * argument){ while(1){ HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7); osDelay(500); // 延迟时间单位毫秒 } } int main(void){ HAL_Init(); SystemClock_Config(); osThreadDef(defaultTask, StartTask, osPriorityNormal, 0, configMINIMAL_STACK_SIZE); osKernelStart(); // 启动 RTOS 内核 for (;;){} // 不执行到这里 } ``` 此范例演示了一个基础 LED 切换功能实现方式。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值