完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在开始之前,建议先备份你的工程代码。
迁移条件 要使用 ARM Compiler 6,建议MDK的版本至少为: MDK版本5.23或更高版本 MDK版本5.23提供两个编译器,分别是 ARM Compiler 5.06 和 ARM Compiler 6.6。 软件包也需要支持 ARM Compiler 6,以下是支持 ARM Compiler 6 的最低软件包版本: Keil MDK-Middleware包: 版本7.4.0及以上 Keil ARM Compiler Support 包: 版本1.3.0及以上 ARM CMSIS 包: 版本5.0.1及以上 切换编译器 使用MDK打开工程。 选择 Project - Options for Target from the menu。 点击 Target 选项卡,找到 ARM Compiler: 下拉列表。 设置ARM编译器为 Version 6 。 点击 OK 键确认更改。 切换后的ARM Compiler 6所有设置都为默认值。 设置警告级别 ARM Compiler 6 提供的警告级别比 ARM Compiler 5 多,如果你习惯 ARM Compiler 5 的警告级别,选择AC5-like Wamings。 可以通过在参数前面加上-Wno-来禁用特定诊断组的警告。 例如,通过选项-Wno-missing-noreturn禁用了–Wmissing-noreturn。 Misc Controls 在迁移的第一步中,建议将级别切换为“无警告”。 这将使您可以专注于错误消息。 解决所有错误信息后,选择AC5-like Wamings,设置-Wno-invalid-source-encoding选项:禁用源代码编码检测,因为LCD和打印信息有中文,编译器认为这些是无效编码。 如果想测试下代码是否规范,可以选择All wamings。 设置优化级别 选择-Os babanced级别,平衡代码大小和性能。 如果想代码执行速度快,可以选择-O2、-O3、-Ofast级别,优化性能(速度),优化依次提升,但生成的代码大小可能会变大。 如果想减少代码大小,可以选择-Os babanced、-Oz image size级别,代码大小优化依次提升。 比如我的工程,使用-Oz image size级别编译出的code大小为103026、使用-Os babanced级别编译出的code大小为115848字节、使用-O3级别编译出的code大小为160536。差别很大。 -O0级别没有做任何优化。注意ARM Compiler 5的-O0实际上是有优化的,所以ARM Compiler 6的-O1级别与ARM Compiler 5的-O0级别最为相似,都可以获取良好的调试体验,在调试阶段可以选用。 不兼容的语言扩展 主要是代码中的__align(x)、__packed、__weak等编译器扩展语言。解决方法是使用CMSIS定义的相关宏。 1.替换CMSIS头文件,这里使用的是5.6.0版本的CMSIS。 如果安装了较新的Keil,可以在路径.Keil_v5ARMPACKARMCMSIS目录中找到合适的CMSIS版本。 将.Keil_v5ARMPACKARMCMSIS5.6.0CMSISCoreInclude内的文件替换到工程code_cm3.h所在的文件夹。 2.修改lwip协议栈的cc.h文件,因为lwip使用到了编译器的扩展语言,比如取消结构体的对齐优化、指定变量对齐方式等,这些扩展语言 ARM Compiler 5 和 ARM Compiler 6 并不相同。 在cc.h文件中引用CMSIS提供的cmsis_compiler.h文件,然后修改结构体封装与对齐宏代码为: 3.程序中使用了__packed、__align(n)、__inline、__weak的地方分别用CMSIS提供的宏__PACKED、__ALIGNED(n)、__INLINE、__WEAK代替。 4.如果使用ARM Compiler 5 时习惯使用typedef __packed struct {}X;句法,推荐改为CMSIS提供的宏句法:typedef __PACKED_STRUCT {}X; 当使用ARM Compiler 5 时会自动扩展为:typedef __packed struct {}X; 当使用ARM Compiler 6 时会自动扩展为:typedef struct __attribute__((packed)) {}X; 5.如果使用内联函数建议按照以下格式: 防止ARM Compiler 6在-O0、-O1级别设置下,链接时出现未定义符号的错误。(在这种优化级别下__INLINE可能并不会内联) 不兼容的语言扩展总结如下: 提示:可以使用uVision IDE的查找功能来查找上述关键字,然后做迁移处理。 内嵌汇编 ARM Compiler 6 完全改变了处理汇编代码的策略。 汇编语法现在兼容GNU风格而不是ARM风格。 汇编也是由C编译器完成, 无需单独的汇编器。 FreeRTOS的移植层由..FreeRTOSSourceportableRVDSARM_CM3目录下的port.c和portmacro.h文件改为..FreeRTOSSourceportableGCCARM_CM3目录下的port.c和portmacro.h文件。 这是因为这两个文件会涉及内嵌汇编。 自定义的内嵌汇编函数。 ARM Compiler 5: ARM Compiler 6:(看了下帮助手册,也可以不使用汇编) 语法更严格 比如某个函数之前要对外开放,.c和.h中定义和声明都相同。后来在.c文件中将该函数定义为本地函数,使用static修饰,但.h中忘记删除也没有做相应修改。这种情况下,ARM Compiler 5 不会报错,ARM Compiler 6 会报错: ../file_name.c(10): error: static declaration of 'func_name' follows non-static declaration 2.如下代码: for(i=0; i《0x7E-0x20; i++) ARM Compiler 5 不会报错,ARM Compiler 6 会报错: ../file_name.c(332): error: invalid suffix '-0x20' on integer constant 需要将代码改为: for(i=0; i<0x7E - 0x20; i++) 优化问题 以下代码在 ARM Compiler 5 中,正常执行,但在 ARM Compiler 6 中,只要不是-O0级别,整个函数因为空循环问题,都被优化掉。也就是延时没有起作用。 void delay_us (uint32_t ul_time) { ul_time *= 30; while(--ul_time != 0); } 所以当升级到 ARM Compiler 6 出现使用软延时的外设不工作,比如软件IIC出错、软件SPI出错、LCD黑屏等问题,可以检查是否有类似的代码。 需要改成: void delay_us (uint32_t ul_time) { ul_time *= 30; while(--ul_time != 0) __nop(); } Keil编译器保证__nop()必定会插入一个NOP指令,在这里可以阻止编译器优化。当然,延时的初始值也要做相应的调整。 编译时间和大小 -O0:Program Size: Code=200360 RO-data=20576 RW-data=96 ZI-data=76316 Build Time Elapsed: 00:00:25 -O1:Program Size: Code=119328 RO-data=16824 RW-data=96 ZI-data=76300 Build Time Elapsed: 00:00:25 -O2:Program Size: Code=153340 RO-data=17100 RW-data=96 ZI-data=76300 Build Time Elapsed: 00:00:26 -O3:Program Size: Code=162292 RO-data=17040 RW-data=96 ZI-data=76308 Build Time Elapsed: 00:00:27 -Ofast:Program Size: Code=161896 RO-data=17040 RW-data=96 ZI-data=76308 Build Time Elapsed: 00:00:26 -Os balanced:Program Size: Code=115628 RO-data=17048 RW-data=96 ZI-data=76300 Build Time Elapsed: 00:00:28 -Oz image size:Program Size: Code=103784 RO-data=17020 RW-data=96 ZI-data=76308 Build Time Elapsed: 00:00:25 -Oz image size LTO:Program Size: Code=85888 RO-data=17064 RW-data=40 ZI-data=75960 Build Time Elapsed: 00:00:32 与Compiler 5 对比(我的程序-可能不具有一般性): -O2:Program Size: Code=94232 RO-data=16736 RW-data=540 ZI-data=75640 Build Time Elapsed: 00:00:16 |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard ELF 1板卡-CAN编程示例之开发板测试
649 浏览 0 评论
该问题是用APP给芯海科技的CST92F25芯片发指令是出现的
2232 浏览 1 评论
768 浏览 0 评论
1525 浏览 1 评论
2271 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 23:29 , Processed in 0.608067 second(s), Total 69, Slave 52 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号