本文以FreeRTOS為例,如果我們自己在官網(wǎng)下載源碼然后手動移植代碼就是使用FreeRTOS的原生API接口,如果我們使用STM32CubeMX來配置工程就是使用的CMSIS-API接口,是對FreeRTOS的原生API接口進(jìn)行了封裝。
一、RTOS為什么要搞兩種API?
CMSIS-RTOS API是ARM公司為RTOS內(nèi)核制定的一套通用接口協(xié)議,它提供了一套「標(biāo)準(zhǔn)的API接口」,可以移植到各種各樣的RTOS上,使得上層的軟件、中間件、庫以及其他組件在不同的RTOS之上都可以正常工作。
簡單的說就是:STM32是ARM內(nèi)核的,這大家都知道。FreeRTOS是一種免費的開源的嵌入式操作系統(tǒng)。那它肯定就不屬于ARM公司的對不對?這也很好理解。現(xiàn)在你要在我ARM內(nèi)核上面使用不是我的RTOS產(chǎn)品,那么我ARM公司就要把你這個RTOS給打包一遍,封裝成屬于我的適合我的API接口協(xié)議類型的CMSIS-RTOS API。這樣解釋應(yīng)該好一點。
在STM32上使用FreeRTOS,可以直接使用FreeRTOS的原生接口(原生API),源碼移植就是使用的是原生API接口,這無可厚非。你也可以選擇CMSIS接口,實際上CMSIS接口和原生接口都是類似的,但是如果你學(xué)會了CMSIS的RTOS接口之后,也能自學(xué)對應(yīng)的原生接口,當(dāng)然還是有區(qū)別的,因此還是需要花時間去熟悉的。
學(xué)會了CMSIS的最大好處就是,只要其它RTOS有提供CMSIS接口,我們就可以直接使用CMSIS接口,而不需要再花時間去了解原生接口。比如我們在學(xué)習(xí)UCOS時,發(fā)現(xiàn)UCOS的API和FreeRTOS的API不同,是因為我們學(xué)的都是它們原生的API,就是我們下載源碼后在keil中移植的那種。但是如果我們學(xué)會了CMSIS-API,那么不管以后學(xué)習(xí)哪一個OS,只要這個OS提供了CMSIS的接口,我們就直接可以用CMSIS的API來調(diào)用學(xué)習(xí),而不需要再花時間去了解原生接口。
STM32CubeMX在提供FreeRTOS時也提供了CMSIS接口,后面具體舉例時就可以看到封裝的.c文件,總之ST對FreeRTOS封裝出了CMSIS接口。
二、使用CubeMX配置FreeRTOS
以STM32F407ZGT6芯片為例,使用CubeMX配置FreeRTOS。
1、新建工程
2、外部晶振
選擇外部晶振
4、下載器
選擇四線的SWD接口下載器。
5、打開FreeRTOS
這里可以看到STM32CubeMX只提供了一種RTOS就是FreeRTOS,并且提供的是CMSIS接口API,并沒有提供原生的API,所以如果你想學(xué)習(xí)原生API就必須學(xué)會手動移植源碼,使用STM32CubeMX來創(chuàng)建工程就必須使用ARM公司的CMSIS API
這一個與FreeRTOS的原生接口有關(guān),大家凡是看到v打頭、x打頭的函數(shù),都是FreeRTOS的原生函數(shù),我們現(xiàn)在要使用的是對原生接口封裝后的CMSIS API,通過Include paramter的配置可以決定哪些原生接口被使用,哪些不被使用,不過有關(guān)Include paramters中的內(nèi)容,一般情況下使用默認(rèn)設(shè)置即可。
User Constant
在該這欄目中可以添加宏定義,添加后就會在代碼中自動生成宏定義的代碼,但是我們一般不會這樣添加,我們需要定義什么宏定義,我們一般都是直接在代碼中編寫。
Task and Queues
在這一個欄目中,我們可以添加任務(wù)(線程),自動生成代碼時就會生成創(chuàng)建任務(wù)(線程)的代碼,一般會有一個默認(rèn)任務(wù),如果需要的話我們可以額外添加一個任務(wù),當(dāng)然我們也可以自己去寫這些創(chuàng)建任務(wù)的代碼。
添加一個任務(wù)(線程),默認(rèn)任務(wù)+添加的任務(wù),目前我們有兩個任務(wù),創(chuàng)建工程時會自動生成創(chuàng)建這兩個任務(wù)的代碼。
添加之前
添加之前
添加之后
添加之后
Timers and Semaphores
通過該欄目可以添加軟件定時器、互斥鎖和信號量,然后就可以自動生成軟件定時器、互斥鎖和信號量的代碼,但是一般情況是在寫代碼時我們自己添加相應(yīng)的代碼,而不是自動生成能,所以這個欄目不配置。
目前不添加定時器、互斥鎖和信號量,編程時在代碼中添加。
FreeRTOS Heap Usage(堆設(shè)置)
6、時鐘配置
Fvco:VCO頻率 SYSCLK:系統(tǒng)時鐘頻率 Fusb:USB,SDIO,RNG等的時鐘頻率 Fs:PLL輸入時鐘頻率,可以是HSI,HSE等. plln:主PLL倍頻系數(shù)(PLL倍頻),取值范圍:64~432. pllm:主PLL和音頻PLL分頻系數(shù)(PLL之前的分頻),取值范圍:2~63. pllp:系統(tǒng)時鐘的主PLL分頻系數(shù)(PLL之后的分頻),取值范圍:2,4,6,8.(僅限這4個值!) pllq:USB/SDIO/隨機(jī)數(shù)產(chǎn)生器等的主PLL分頻系數(shù)(PLL之后的分頻),取值范圍:2~15.
外部晶振為8M的時候,推薦值:plln=336,pllm=8,pllp=2
7、工程設(shè)置
8、生成代碼
建議勾選上分文件管理。我們在生成代碼的時候,出現(xiàn)了如下提示,我們這里需要解決這個警告,否者會出問題。
前面介紹FreeRTOS時說過,F(xiàn)reeRTOS線程切換的本質(zhì)就是定時器定一個時間,定的時間到了就切換運行其它線程,在默認(rèn)情況下會使用Systick來作為RTOS的時間片定時器,這里不湊巧的是HAL 庫代碼已經(jīng)使用了 Systick,所以上面警告就是告訴你沖突了,我們需要解決這個沖突。
如何解決沖突?
先點擊“否”,將 sys 中的 Systick 換成其它定時器,比如tim1,RTOS就使用 tim1來做自己的Systick。
做了以上設(shè)置后在生成代碼時就不會再出現(xiàn)前面所提到的警告。
FreeRTOSConfig.h
在生成的工程項目中的頭文件目錄下有一個FreeRTOSConfig.h,如果是源碼移植的話,我們應(yīng)該修改這一個.h來設(shè)置我們需要的配置,但是CubeMx提供了圖形化的配置界面,也就是我們前面所介紹的內(nèi)容,我們進(jìn)行了前面的配置后,關(guān)鍵配置信息就會記錄到這個.h中,最后 FreeRTOS在工作時就會使用到.h 中的相關(guān)配置。
3、工程文件介紹
CMSIS API
CMSIS API
怎么樣是不是跟我們使用原生API創(chuàng)建的任務(wù)函數(shù)有點不一樣,那是肯定不一樣的。但是要明白這種方式只不過是給FreeRTOS原生的API穿上了一件華麗的外衣而已,函數(shù)內(nèi)部其實還是調(diào)用的原生API,只不過沒讓你看見而已。
原生API
原生API
不管是CMSIS API還是原生API函數(shù)的創(chuàng)建過程基本是一樣的,只不過函數(shù)不一樣,所以也不要太過糾結(jié)使用哪一種API,后期這兩種API都會分析它們之間的不同,包括消息隊列、信號量、互斥量等等!
CMSIS API函數(shù)主要有:
SignalEvents//信號 osSignalSet:Setsignalflagsofathread. osSignalClear:Resetsignalflagsofathread. osSignalWait:Suspendexecutionuntilspecificsignalflagsareset. Mutexes//互斥鎖 osMutexCreate:Defineandinitializeamutex. osMutexWait:ObtainamutexorWaituntilitbecomesavailable. osMutexRelease:Releaseamutex. osMutexDelete:Deleteamutex. Semaphores//信號量 osSemaphoreCreate:Defineandinitializeasemaphore. osSemaphoreWait:ObtainasemaphoretokenorWaituntilitbecomesavailable. osSemaphoreRelease:Releaseasemaphoretoken. osSemaphoreDelete:Deleteasemaphore. MemoryPool//內(nèi)存池 osPoolCreate:Defineandinitializeafix-sizememorypool. osPoolAlloc:Allocateamemoryblock. osPoolCAlloc:Allocateamemoryblockandzero-setthisblock. osPoolFree:Returnamemoryblocktothememorypool. MessageQueue//消息隊列 osMessageCreate:Defineandinitializeamessagequeue. osMessagePut:Putamessageintoamessagequeue. osMessageGet:Getamessageorsuspendthreadexecutionuntilmessagearrives. MailQueue//郵箱隊列 osMailCreate:Defineandinitializeamailqueuewithfix-sizememoryblocks. osMailAlloc:Allocateamemoryblock. osMailCAlloc:Allocateamemoryblockandzero-setthisblock. osMailPut:Putamemoryblockintoamailqueue. osMailGet:Getamailorsuspendthreadexecutionuntilmailarrives. osMailFree:Returnamemoryblocktothemailqueue.
審核編輯 :李倩
-
接口協(xié)議
+關(guān)注
關(guān)注
5文章
41瀏覽量
18519 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6684瀏覽量
123140
原文標(biāo)題:干貨|操作系統(tǒng)RTOS為什么要搞兩種API?
文章出處:【微信號:電子工程世界,微信公眾號:電子工程世界】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論