技能的學習首先就要不求甚解,,先用起來再學習原理。學習RTOS亦是如此,,不能一開始就埋進源碼中,。這篇主要講怎么快速在STM32系列單片機上用起來FreeRTOS,并順帶著說一下自學的方法及資料查找,。 01 說在前面 RTOS為了提高任務調(diào)度效率一般都包含匯編程序,,因此移植起來需要一些匯編知識,就算網(wǎng)上肯定有移植教程,,初次搞起來還是挺費勁的,。初學時對RTOS代碼不熟悉,一開始就打擊了積極性可不好,。因此本篇不講怎么移植,,介紹使用ST“懶人神器”CubeMX來快速移植配置FreeRTOS。 02 RTOS介紹 目前嵌入式主流RTOS有uCOS,、FreeRTOS,,之所以很多第三方庫都有在FreeRTOS上的應用Demo,是因為FreeRTOS免費,。不要錢是真的厲害呀,!然而說實話,論源碼規(guī)范,,我還是喜歡uCOS,。FreeRTOS的匈牙利命名法真是讓我難受呀~~~ 03 配置CubeMX 設計實驗:配置CubeMX移植FreeRTOS,建立兩個任務,,一個讓LED0以500ms亮滅,,一個讓LED1以200ms亮滅。 比較本實驗和前面《消除硬延時函數(shù)Delay》的編程方式,,體會引入操作系統(tǒng)后軟件編程架構的變化,。 第一步 首先如1處勾選使用FreeRTOS的enable。然后將HAL庫的1ms定時中斷采用的定時器改為TIM1,,因為Systick要用作FreeRTOS的時基定時,。第三步配置IO口。忘記怎么配置的溫故《STM32CubeMX入門教程(一)》,。 第二步 配置FreeRTOS,。點擊FREERTOS按鈕。 配置界面如下,,通過配置界面可以實現(xiàn)操作系統(tǒng)的配置,、任務的配置、隊列、信號量及內(nèi)存管理的配置,。 ConfigParameters:配置操作系統(tǒng)功能,,就像手動移植時修改Config文件一樣,基本上可以按默認值,。具體每個配置的功能,,可以點擊該條目,底部會有相關介紹,。 IncludeParameters:配置操作系統(tǒng)API,,一些API不常用可以不使能編譯,減小系統(tǒng)大小,。這個也對應與移植時的Config文件,。例如刪除任務函數(shù)vTaskDelete()是否使能就在此配置。具體如下圖: UserConstants:添加一些用戶使用的常量,,很少用,。 TaskAndQueues:任務及隊列的配置。首先說任務配置,,點擊ADD,,彈出配置對話框。TaskName是任務名稱,,一個字符串而已。下面是優(yōu)先級配置,,再往下是任務堆棧大小,。EntryFunction是任務函數(shù)名。CodeGenerationOption是選擇自動生成代碼是否聲明成weak,。Allocation是配置內(nèi)存是否動態(tài)分配,,此處CUbeMX默認動態(tài)分配不給更改。 之后再看一下隊列的創(chuàng)建,。如下圖,,點擊ADD,彈出配置對話框,。首先是隊列名稱,。QueueSize是隊列長度,即包含的隊列項個數(shù),。ItemSIze是隊列項類型,。 TimersAndSemaphores:即軟件定時器及信號量的配置,界面如下圖,。Timer處的ADD按鈕不能點擊,,因為我們在配置時未使能軟件定時器功能。從上到下依次是:軟件定時器、互斥信號量,、遞歸信號量,、二值信號量、計數(shù)信號量,。 最后看一下堆棧及內(nèi)存管理,。 FreeRTOS Heap Usage:界面如下,這里會根據(jù)前面配置顯示出動態(tài)內(nèi)存使用情況,。用戶可配置內(nèi)存管理大小,,但不能比已配置使用了的小。所謂操作系統(tǒng)的內(nèi)存管理,,就是它自己先定義一個超大的數(shù)組,,把內(nèi)存坑全占了。你在應用開發(fā)時要拉屎,,你要用哪個坑你說的不算,,你告訴操作系統(tǒng),“我這邊四個哥們,,給我來四個坑”,,操作系統(tǒng)會找到一個連續(xù)的四個坑,并把首地址以指針的方式告訴你,,如果沒坑了,,就反饋申請內(nèi)存失敗。當然,,拉完要釋放內(nèi)存~之所以用FreeRTOS內(nèi)存管理,,是因為該操作系統(tǒng)提供5種內(nèi)存管理方案,有內(nèi)存碎片回收功能,,很強大,。 04 編程 配置完后生成代碼,打開freertos.c文件,,編寫任務函數(shù)代碼,。 osDelay()函數(shù)并不是FreeRTOS的原版API函數(shù),而是加上了CMSIS-RTOS封裝后的函數(shù),。 05 CMSIS-RTOS 我們知道,,大多數(shù)RTOS的原理都差不多的,都是任務調(diào)度,、延時函數(shù),、信號量、隊列等等東西,。Keil有自己的RTX操作系統(tǒng),。后來ARM收購了Keil,。CMSIS-RTOS相當于將不同廠家的RTOS封裝一下,形成了一個標準的API函數(shù)庫,。FreeRTOS的匈牙利命名法實在讓我難受,,我更喜歡用這個封裝庫。有時候想輸入一個函數(shù),,知道是Task的API,,就因為想不起來前面匈牙利縮寫是什么,硬是敲不出來,,編輯器也不提醒,,因為函數(shù)開頭就不知道是啥~~~~~ 06 授之以魚不如授之以漁 最后說一下自學方法。 通過本篇,,你至少可以寫出個非同步LED閃爍程序了吧,。體驗一下就好了。 然后,,學習CMSIS-RTOS有哪些API,,以及怎么用這些API。官網(wǎng)http://www./pack/doc/cmsis/RTOS/html/index.html ,。每個API函數(shù),,都有在線例程代碼,看起來非常爽,。當然你如果喜歡原版API,,這步就算了。 最后,,當用熟了之后再去學習源碼,。 最后的最后,有了操作系統(tǒng),,你就會知道項目怎么劃分任務了?你就可以做到全局變量不滿天飛了,?你就能編寫出好看的代碼了,? |
|