原創文章,轉載請註明出處:https://www.armbbs.cn/forum.php?mod=viewthread&tid=119562
版本迭代是嵌入式開發永久的痛,這麼多年不知道浪費了多少時間在版本迭代上。
部分系統組件還好點,有個LTS長期支持版,而廠家SDK和IDE環境可謂慘不忍睹,一代版本一代坑。
視頻版:
https://www.bilibili.com/video/BV1qu4y1d7wV
【MDK】
剛開始接觸M內核芯片的時候就是用的這款IDE,最早有MDK2(主要是51使用), MDK3, 進入MDK4後,MDK4.54算是一個經典版本,最早搞M內核那波人,很多人都是用的這個版本上手的。
迭代到MDK4.74後,開啓了MDK5時代,剛開始的MDK5.0X和MDK5.1X就是填坑,所以用MDK4轉載到MDK5的人還不是很多。
1、進入到MDK5.2X後,開始第1個分水嶺。
芯片廠家新出的新品沒法再用MDK4,必須轉戰到MDK5了。KEIL爲了緩解用戶的對MDK4的依賴,推出MDK5後,僅接着搞了個MDK5對MDK4的兼容包。初期推廣的時候,很多人不知道這個兼容包。
將MDK4使用MDK5強行打開後,各種各樣的問題,被搞得頭都大了。把所有的例子都用MDK5重新創建下,有點不現實,例子太多了。後來不斷摸索,搞了個騷操作,直接修改MDK4工程後綴
uvproj 改成 MDK5的後綴 uvprojx即可,大部分例子都可以這麼方便的使用MDK5打開。
2、第2個分水嶺,MDK5編譯HAL庫
MDK5 AC5編譯HAL庫帶brower info堪稱史詩級災難,編譯10來分鐘都是小意思。編譯慢就算了,電腦CPU都飆到100%了,電腦什麼都幹不了,只能乾等着。
爲了緩解用戶的焦慮,開始推進MDK AC6,剛開始的時候還挺開心,帶browser info編譯速度快了很多,當編譯完畢後,發現go to def不能用,研究了下,原來是把browser info生成搞到了後臺。實際總時間和AC5區別不大。
3、第3分水嶺,AC5轉AC6
這個痛點,估計近幾年無法得到解決,因爲市面上大量開源工程依然是MDK AC5創建的,更重要的是工程中一些開源組件不支持MDK AC6,這就給轉戰MDK AC6帶來很大難度。雖然KEIL後來出了AC5轉AC6文檔,但杯水車薪,複雜工程的修改難度太大了。
既然這麼麻煩,爲什麼還要轉戰AC6,因爲AC5從MDK5.37開始正式推出歷史舞臺,後面出的M23,M33,M55,M85等芯片也沒法用AC5了。
現在的大部分工程依然要使用AC5 LINK警告類型
4、第4個分水嶺,MDK RTE創建工程
早期的芯片還支持MDK RTE經典創建方式,這個方式非常好用,也非常給力,這個值得肯定。
後來新出的芯片,同樣是災難級表現,以STM32H7爲例,不再支持經典方式了,RTE必須配合STM32CubeMX一起使用, 而且對應的工程必須使用指定MDK版本,CMSIS版本和STM32H7軟件包版本。
5、第5個分水嶺,MDK軟件包下載問題
本來官網下載就奇卡無比,最近還搞了騷操作,讓本就難用的下載問題“雪上加霜”,軟件包的下載變得超級難用
6、今年年底要發佈MDK6
這個必將又是一頓瘋狂操作。
【IAR】
IAR最早用的是IAR6.3,之後陸續使用了7.x ,8.x和9.x
IAR早期版本最大的缺點就是毫無兼容性可言,你的工程是版本創建的,就必須使用那個版本打開。到後來的IAR8.X和9.X好了很多,可以強制轉換之前老版本創建的程序了。
除了兼容性問題,新出的IAR9.X帶來了一個坑,之前的fputc和fgetc重定向串口沒法用了,必須用他們官方的重定向方式解決。
https://www.armbbs.cn/forum.php?mod=viewthread&tid=109542
[GCC]
基於GCC創建的IDE環境,同樣是各種兼容性問題,以Embedded Studio爲例,之前用V5.X創建的工程,現在使用V7,X就無法正常編譯,直接報錯。
這找誰說理去,網友們一打開,無法正常編譯,這用戶體驗不太舒服。
基於eclipse/vscode/clion + gcc + openocd的玩法,我用的少,沒有研究過版本兼容問題。
[芯片廠家SDK]
芯片廠家的SDK也是各種坑,各種折騰用戶。
以STM32爲例進行說明
(1)標準庫到HAL和LL庫
本來早期的F1,F2,F3,F4等系列,標準庫玩法已經很成熟了,時間關鍵的地方再倒騰下寄存器方式加速實現,大部分項目也夠用。但後面爲了配合STM32CubeMX圖形化開發工具,不得不推出HAL和LL庫。
對於用戶做產品還好點,但像我們這種做開發板的,就是災難,不得不做HAL庫和標準庫兩個版本。甚至必要的情況下還得提供全部使用STM32CubeMX創建的工程。
(2)HAL庫的版本迭代
有時候版本迭代不考慮兼容性,同樣讓人頭疼,以串口代碼爲例,後面的升級竟然直接來個刪除結構體成員的騷操作:
針對各種兼容問題,大家有什麼好的思路來解決這些問題,歡迎分享,個人用倒是沒什麼,但是團隊之間或者網上分享給別,兼容性就不得不考慮了。