
【說(shuō)在前面的話】
【入門成就:未聞花名】
從事嵌入式工作至少2年以上,之前從未聽說(shuō)過,也沒有真正注意到自己所使用的工程或者環(huán)境中用到了CMSIS;突然有一天,第一次聽說(shuō)CMSIS時(shí)獲得該成就。
該成就看似觸發(fā)條件比較苛刻——需要工作至少2年以上沒有注意到過CMSIS的存在——但實(shí)際上,這幾乎是大部分新手玩家的標(biāo)配成就。反倒是少數(shù)“內(nèi)測(cè)高玩”(指在學(xué)校期間就已經(jīng)是嵌入式大牛的人),因?yàn)檫^早接觸CMSIS而受到時(shí)間門檻的限制無(wú)法獲得該成就。

【新手成就:幾……室同堂?】
玩家第一次嘗試使用MDK的RTE(Runtime Environment)配置方式往工程中加入CMSIS的支持時(shí),沒有注意到工程里已經(jīng)有了老版本的CMSIS,兩個(gè)版本由于編譯時(shí)產(chǎn)生沖突,導(dǎo)致玩家抓耳撓腮——“明明正確配置了CMSIS,路徑也正確,為什么說(shuō)我編譯錯(cuò)誤呢?果然是RTE太高檔了,我用不來(lái)”——時(shí),獲得該成就。

【稀有成就:未曾設(shè)想的道路】
玩家因?yàn)槟撤N原因,第一次在MDK以外的環(huán)境,或是不借助MDK的RTE幫助的情況下,嘗試將CMSIS加入到自己的工程中,以源代碼形式進(jìn)行編譯引發(fā)“海量”編譯錯(cuò)誤時(shí)獲得該成就。
對(duì)大部分玩家來(lái)說(shuō),毫無(wú)疑問,該成就是一個(gè)“稀有”成就——因?yàn)闊o(wú)論是借助MDK的RTE輔助,還是使用方案供應(yīng)商“保姆式”SDK進(jìn)行開發(fā),基本上不太會(huì)需要自己往工程里添加CMSIS,就算有,使用源代碼進(jìn)行編譯的情況也是少之又少。通常只有團(tuán)隊(duì)里的骨灰級(jí)玩家才會(huì)“被迫”獲得該成就。
前面提到的“海量”編譯錯(cuò)誤,實(shí)際上由于CMSIS中諸如CMSIS-DSP這樣的庫(kù),為了提升代碼性能,采用了“在.c中包含其它.c”的做法而觸發(fā)的,比如 CMSIS-DSP 中很多目錄就如 InterpolationFunctions 這樣存在多個(gè).c,

而他們實(shí)際上都被 InterpolationFunctions.c 文件統(tǒng)一包含:

如果一股腦的把該目錄下的所有.c都加入到 MDK 工程中編譯,就會(huì)在鏈接階段報(bào)告大量的重復(fù)定義類錯(cuò)誤。

【稀有成就:吃螃蟹愛好者】
達(dá)成條件:
第一次通過MDK的Pack Installer將從Github上獲取最新的、尚未正式發(fā)布的CMSIS版本導(dǎo)入到MDK開發(fā)環(huán)境,并通過RTE部署到當(dāng)前工程中時(shí)獲得該成就。
雖然MDK的用戶很多,會(huì)用RTE的用戶已然很少,其中懂得利用Pack Installer更新軟件包的用戶就更少,而知道Pack Installer可以導(dǎo)入Git庫(kù)并以此來(lái)使用Github上最新的CMSIS的用戶幾乎就是鳳毛麟角了。雖然操作起來(lái)難度很小,但該成就的稀有度卻是滿星的。
如果你的MDK版本較老,同時(shí)因?yàn)槟承┰蛴植幌敫?/span>MDK版本,可以通過Pack Installer導(dǎo)入倉(cāng)庫(kù)的辦法獲取最新的CMSIS。具體步驟如下:
1、通過git工具將最新版本的CMSIS從https://github.com/ARM-software/CMSIS_5 的develop 分支下載到本地。比如,我使用的工具就是Github Desktop:


2、打開Pack Installer,并通過菜單File->Manage Local Repository 打開倉(cāng)庫(kù)管理窗口:

3、單擊Add,并把剛剛從Github上獲取的CMSIS加入倉(cāng)庫(kù)中:

4、成功后,我們會(huì)看到最新的CMSIS已經(jīng)被加入到Pack列表中了:

此時(shí),單擊OK。經(jīng)過一番等待,我們發(fā)現(xiàn)最新的CMSIS 5.8.0(還沒有正式發(fā)布哦)已經(jīng)被加入到我們的MDK環(huán)境中了:


(圖片來(lái)自網(wǎng)絡(luò),侵刪)
【陰間成就:內(nèi)卷的開端……】
達(dá)成條件:
第一次注意到CMSIS提供的“固有函數(shù)(Intrinsics)”__disable_irq()在不同編譯器下有不同的函數(shù)原型時(shí),獲得該成就。
實(shí)際上,頭文件cmsis_compiler.h 的作用就是:自動(dòng)檢測(cè)當(dāng)前用戶所使用的編譯器,并以此為依據(jù)包含對(duì)應(yīng)的頭文件。例如,如果當(dāng)前用戶使用的是armclang,則cmsis_compiler.h會(huì)實(shí)際包含 cmsis_armclang.h;同理,如果編譯環(huán)境是GCC,對(duì)應(yīng)的頭文件就為 cmsis_gcc.h。
/* * Arm Compiler 4/5 */#if defined ( __CC_ARM )#include "cmsis_armcc.h"/* * Arm Compiler 6.6 LTM (armclang) */#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100)#include "cmsis_armclang_ltm.h"/* * Arm Compiler above 6.10.1 (armclang) */#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100)#include "cmsis_armclang.h"/* * GNU Compiler */#elif defined ( __GNUC__ )#include "cmsis_gcc.h"/* * IAR Compiler */#elif defined ( __ICCARM__ )#include <cmsis_iccarm.h>...
/**\brief Disable IRQ Interrupts\details Disables IRQ interrupts by setting special-purpose register PRIMASK.Can only be executed in Privileged modes.*//* intrinsic void __disable_irq(); */
然而,我們?cè)?strong style="max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;">arm_compact.h(包含cmsis_armclang.h時(shí)獲得)中發(fā)現(xiàn)了完全不同的函數(shù)原型:
static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__))__disable_irq(void) {...}
它居然是有返回值的,而且返回的是關(guān)閉全局中斷前一刻PRIMASK的值——這完全是搶了固有函數(shù)__get_PRIMASK() 的工作啊!更可怕的是,CMSIS這么多對(duì)不同編譯器提供支持的頭文件中,只有armclang在“加班”,甚至讓習(xí)慣了使用armclang的傻孩子我產(chǎn)生了__disable_irq()就應(yīng)該返回PRIMASK值的錯(cuò)覺——像極了公司團(tuán)隊(duì)“從一人開始內(nèi)卷到全團(tuán)隊(duì)加班稱為常態(tài)”的社畜生活,真實(shí)細(xì)思恐極啊。


1.機(jī)器學(xué)習(xí)的未來(lái)在何方?
2.Cadence“系統(tǒng)動(dòng)力雙劍”,這么霸氣的工具得用起來(lái)!
3.干貨 | 分享一個(gè)實(shí)用的、可應(yīng)用于單片機(jī)的內(nèi)存管理模塊
4.MCU、RTOS和物聯(lián)網(wǎng)之間有什么關(guān)系?
5.香港突發(fā):500萬(wàn)芯片搶劫案!全程搜捕!
6.肝 | 一種串口高效收發(fā)思路及方案

免責(zé)聲明:本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請(qǐng)與我們聯(lián)系,我們將根據(jù)您提供的版權(quán)證明材料確認(rèn)版權(quán)并支付稿酬或者刪除內(nèi)容。