成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Keil切換到Armclang編譯器,到底強在哪里?

開發 前端
ARM Compiler 5(及更早版本)使用 armcc 編譯器。而AC6(ARM Compiler 6) 用 armclang 替換了 armcc,因此是一個新的編譯器。七年前就有人問了這樣的問題。

[[427278]]

大家好,我是小麥,上次寫過一篇文章 《Keil 編譯太慢怎么辦?教你一招,提速10倍 》,減少了中間文件的生成,確實把編譯速度提高了很多,其實沒有從根本上解決問題,有大佬提出用直接上AC6。

于是我就切換到AC6上嘗試了一下,效果還是不錯的,我就分享一下,感興趣的小伙伴們可以看一下,希望對你有所幫助。

AC6有何不同?

ARM Compiler 5(及更早版本)使用 armcc 編譯器。而AC6(ARM Compiler 6) 用 armclang 替換了 armcc,因此是一個新的編譯器。七年前就有人問了這樣的問題。

AC6和AC5具體有哪些差異呢?

參考鏈接:https://developer.arm.com/documentation/100068/0612/migrating-from-arm-compiler-5-to-arm-compiler-6/migration-overview

Arm Compiler 6 基于現代 LLVM 編譯器框架。Arm Compiler 5 不是基于 LLVM 編譯器框架。因此,將您的項目和源文件從 Arm Compiler 5 遷移到 Arm Compiler 6 ,我們需要注意幾點:

  • 調用編譯器時命令行選項的差異。
  • 遵守語言標準的差異。
  • 編譯器特定關鍵字、屬性和編譯指示的差異。
  • 編譯器優化和診斷行為的差異。

下面是AC6和AC5的工具鏈差異:

工具鏈差異

從這里我們可以看到,出了C編譯器和預處理器不同以外,其他基本上都是相同的。

除了工具鏈的差異,優化也有差異,還有一些默認的差異,包括編譯選項,生成的固件命后綴不同等等,詳細可以參考上述的鏈接。至于強不強,用了才知道嘛。

Keil中切換編譯器

在Keil MDK 5.27中,我們打開項目選項,就可以切換編譯器了,這里包括了AC5和AC6,具體如下圖所示;

為了測試,我用CubeMX生成了一個STM32F103CB基于HAL庫的Keil MDK工程,使用AC5編譯器進行構建;

總共耗時 10 秒;

后面我切換成AC6編譯器,進行重新構建;

總共耗時 5 秒;

如果單純基于HAL庫,沒有加入其他第三方庫的話,直接在項目選項中的編譯器選項中,選擇AC5和AC6就可以實現無縫切換,這是因為在CMSIS中已經幫你做好了兼容性的處理,在cmsis_compiler.h中,這里的條件編譯選項,我們可以發現已經通過判斷不同的編譯器版本,而包含了不同的頭文件,分別是對應armcc和armclag的;如下圖所示;

項目已經根據系統進行了選擇;

  1. #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) 
  2.   #include "cmsis_armclang.h" 

判斷當前__ARMCC_VERSION的版本號,然后在包含cmsis_armclang.h頭文件,這個文件中就已經幫我們做好了AC6所需要的兼容性修改。參考官方的文檔“apnt_298,Migrate ARM Compiler 5 to ARM Compiler 6 MDK Tutorial”,可以知道在C語言部分需要做以下的修改:

當然了,一些涉及到很底層的操作,需要C和匯編混合編程的地方,也需要進行修改,這里在文檔中也有類似的說明;

參考鏈接:https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C

添加FreeRTOS

通過ST官方的CubeMX可以非常方便地在項目中添加FreeRTOS。

不過通過這個軟件進行添加RTOS的話,它默認使用的是ARMCC VERSION 5,所以,我直接切換成ARMCC VERSION 6的時候,進行編譯就出現了115個Errors。

查看了錯誤的源頭,主要錯誤都在port.c和portmacro.h這兩個文件中,自己動手移植過FreeRTOS的同學應該知道,一般適配自己的硬件平臺,所要做的移植工作,都會放到這個兩個文件中;

我查看了錯誤,基本上是C編譯器語法,還有C和匯編混合編程語法不兼容所造成的問題;

從圖中可以知道,__forceinline和__asm{ }在AC6中都是不兼容的。

下面是來自文檔apnt_298對于匯編語法的兼容性修改;

當然,我們可以根據文檔將不兼容的部分都修改過來,不過這里需要對ARM匯編有較好的掌握。不過FreeRTOS已經有對AC6有較好的支持了。這里下載FreeRTOS的源碼,需要和前面的項目中所使用的FreeRTOS版本保持一致。

在源碼中找到了相應文件,提示讓我們使用GCC-ports;

在GCC的路徑下找到ARM_CM3,這里包含了我們移植所需要的兩個文件,port.c和portmacro.h;

只要把這兩個文件拷貝到項目中,替換原來的文件即可;

重新構建rebulid,可以看到構建成功,耗時也很少;

總結

 

本文參考了官方的文檔,簡單介紹了AC5和AC6的異同,并在Keil MDK環境下進行測試,添加了FreeRTOS,要從AC5移植到AC6則需要參考文檔Migrate ARM Compiler 5 to ARM Compiler 6 MDK Tutorial,這里面解釋地非常詳細。

 

責任編輯:武曉燕 來源: 小麥大叔
相關推薦

2021-12-15 06:58:28

RedisEhCache緩存

2021-02-26 07:17:47

MySQLMariaDB

2024-04-10 08:15:17

模型語言模型GPT

2017-06-22 16:18:58

IBM光譜存儲軟件定義存儲

2019-05-22 10:38:00

5G芯片中興

2014-01-07 13:54:40

Hadoop日志

2021-10-08 14:43:24

WiFi 5WiFi 6遠程

2012-09-13 14:11:07

Windows Ser微軟云平臺

2023-01-09 08:32:00

編譯器虛擬機操作系統

2017-11-30 14:14:53

2020-08-06 09:08:51

開發谷歌微軟

2017-03-16 14:31:11

2023-06-27 17:30:13

數字化

2015-06-30 14:33:52

物聯網

2010-01-18 10:34:21

C++編譯器

2010-01-21 09:11:38

C++編譯器

2009-08-10 17:12:54

C#編譯器

2017-03-20 18:01:55

編譯器匯編

2013-03-29 10:02:37

編譯器語言編譯開發

2010-03-23 11:17:16

Python 動態編譯
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99精品视频免费观看 | jlzzjlzz欧美大全 | 精品成人在线观看 | 国产免费一区 | 天天爽夜夜爽精品视频婷婷 | 精品国产视频 | 精品国产亚洲一区二区三区大结局 | 亚洲毛片在线 | 久久视频精品 | 亚洲国产一区二区三区 | 久久另类 | 97久久精品 | 久久久久久91 | 91精品www | 91社区在线高清 | 玖玖操| 国产精品一区二区精品 | 国产成人在线播放 | 亚洲人在线 | 国产精品美女久久久 | 久久国产精品视频 | 在线色网| 草久久免费视频 | 国内自拍偷拍一区 | 免费在线看黄视频 | 亚洲免费人成在线视频观看 | 成人超碰在线 | 色婷婷久久久久swag精品 | 你懂的在线视频播放 | 精品欧美一区二区中文字幕视频 | 日韩中文在线观看 | 久久99视频这里只有精品 | 欧美精品一区二区三区在线 | 精品中文字幕在线观看 | 天天操天天射天天 | 亚洲一二三区不卡 | 亚洲精品白浆高清久久久久久 | 伊人久久一区二区 | 中文字幕在线观看成人 | 精品欧美一区二区三区久久久 | 欧美午夜一区 |