Keil基于ARM Compiler 5的工程迁徙为ARM Compiler 6的工程

打印 上一主题 下一主题

主题 1829|帖子 1829|积分 5487

环境:

keil版本为5.38,版本务必高于5.30

STM32F4的pack包版本要高于2.9

软件包下载所在:https://zhuanlan.zhihu.com/p/262507061
一、更改Keil中编译器



更改后编译,会报很多错,先不管。
二、更改头文件依赖

观察报错会有条报错为:error: unknown register name vfpcc in asm,这是CMSIS库的版本过低,导致AC6不兼容,办理方法是升级CMSIS库,链接里面有下载包,肯定要确保CMSIS库在5.0以上。
假如你Keil的CMSIS版本是5.0以上的还是存在报错,阐明你工程里面的文件是老版本的,就不消升级了,按照下面步骤继续。
1. 删除工程CORE里面的.h文件


把这四个.h文件都删除
2.把Keil安装路径中的.h新文件复制到工程中的core文件夹中


3. 假如你工程用到了FreeRTOS,还需要用FreeRTOS源码中GCC的文件代替你工程中RVDS的文件。


三、修改部分语法

新的AC6中部分语法有更新,完成上述步骤后还可能报错,根据报错位置修改为AC6支持的语法格式就可以了。
错误有 pragma import(__use_no_semihosting) 、__asm void WFI_SET(void)、__FILE 等
print重定向修改为如下,这种格式能同时兼容AC5和AC6编译器,此中__CC_ARM是AC5编译器界说的标识,GNUC 和__clang__是AC6界说的标识,由此判断编译器版本。
  1. #if 1
  2. #ifdef  __CC_ARM
  3. #pragma import(__use_no_semihosting)
  4. struct __FILE
  5. {
  6.         int handle;
  7. };
  8. #elif defined ( __GNUC__ ) || defined (__clang__)
  9. __asm (".global __use_no_semihosting\n\t");   
  10. #endif
  11. FILE __stdout;      
  12. //定义_sys_exit()以避免使用半主机模式   
  13. void _sys_exit(int x)
  14. {
  15.         x = x;
  16. }
  17. //重定义fputc函数
  18. int fputc(int ch, FILE *f)
  19. {        
  20.         while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
  21.         USART1->DR = (u8) ch;      
  22.         return ch;
  23. }
  24. #endif
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

愛在花開的季節

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表