STM32CubeMX+FreeRTOS學(xué)習(xí)[1]-任務(wù)的創(chuàng)建(Lu_第1頁
STM32CubeMX+FreeRTOS學(xué)習(xí)[1]-任務(wù)的創(chuàng)建(Lu_第2頁
STM32CubeMX+FreeRTOS學(xué)習(xí)[1]-任務(wù)的創(chuàng)建(Lu_第3頁
STM32CubeMX+FreeRTOS學(xué)習(xí)[1]-任務(wù)的創(chuàng)建(Lu_第4頁
STM32CubeMX+FreeRTOS學(xué)習(xí)[1]-任務(wù)的創(chuàng)建(Lu_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、寫在前面的話本系列筆記一共七篇,是我個(gè)人學(xué)習(xí)FreeRTOS的實(shí)驗(yàn)筆記。學(xué)習(xí)過程中寫筆記有幾個(gè)好處:一是可以加深自己對(duì)FreeRTOS的理解;二是使學(xué)習(xí)更有成就感。筆記可以作為自己學(xué)習(xí)進(jìn)步和知識(shí)儲(chǔ)備的憑證,當(dāng)然沒人去查,關(guān)鍵是自己真的從中有更多的收獲。在開始學(xué)習(xí)FreeRTOS時(shí),我就已經(jīng)計(jì)劃寫成筆記并上傳帶百度文庫,希望對(duì)初學(xué)者有所幫助。因?yàn)槲业膶W(xué)習(xí)歷程也非常依賴網(wǎng)絡(luò)資源。本人在學(xué)習(xí)FreeRTOS之前,已經(jīng)學(xué)過C/OS II,也上傳了幾篇學(xué)習(xí)筆記。這兩個(gè)系統(tǒng)非常相似,都是開源的RTOS,但是一個(gè)是免費(fèi)的,另一個(gè)是收費(fèi)的。筆記的主要內(nèi)容就是學(xué)習(xí)FreeRTOS的各種通訊機(jī)制。筆記的結(jié)構(gòu)非常簡(jiǎn)

2、單,就是通過簡(jiǎn)單的實(shí)例,演示FreeRTOS的各種通訊機(jī)制的使用方法。跟隨本筆記學(xué)習(xí)完,能夠做到以下幾點(diǎn)即可:1.了解FreeRTOS程序的基本架構(gòu);2.能夠理解和應(yīng)用信號(hào)量、消息隊(duì)列、郵箱隊(duì)列等相關(guān)知識(shí)。特別說明:本筆記以STM32為平臺(tái),任何STM32平臺(tái)都可以。所有例程只用到簡(jiǎn)單的硬件資源:最小系統(tǒng)的資源,LED輸出,UART輸出。為了開發(fā)簡(jiǎn)單,本筆記的例程全部使用STM32Cube配置生成,只需要添加很少的代碼。如果不熟悉STM32Cube的使用,也沒關(guān)系。只要在網(wǎng)上下載安裝STM32CubeMX和相應(yīng)芯片的支持包,然后跟著筆記的步驟操作即可,該筆記沒有省略任何步驟。要學(xué)習(xí)STM32C

3、ube,可到ST社區(qū)論壇/module/forum/forum.php,搜索STM32Cube,即可查看相關(guān)帖子。其中比較詳細(xì)和全面的是微雪電子發(fā)布的帖子。重要參考資料:FreeRTOS實(shí)時(shí)內(nèi)核實(shí)用指南.pdf (由Zou Changjun翻譯并分享),建議學(xué)習(xí)者先通讀一遍該文檔,這是翻譯自FreeRTOS作者Richard Barry于2009年發(fā)布的手冊(cè)。最新最詳細(xì)的資料當(dāng)然是官網(wǎng)發(fā)布的信息。由于本人水平有限,錯(cuò)漏難免,歡迎指正,謝謝!S.D.Lu于 深圳2016年8月E-mail:FreeRTOS學(xué)習(xí)之一:

4、任務(wù)的創(chuàng)建前提:默認(rèn)已經(jīng)裝好MDK V5和STM32CubeMX,并安裝了STM32F1xx系列的支持包。硬件平臺(tái):STM32F1xx系列。目的:學(xué)習(xí)FreeRTOS任務(wù)的創(chuàng)建。創(chuàng)建任務(wù)是使用FreeRTOS的必要步驟,本文通過實(shí)例描述怎樣使用STM32CubeMX配置創(chuàng)建FreeRTOS的任務(wù)。本文例子將創(chuàng)建兩個(gè)任務(wù),每個(gè)任務(wù)分別控制一個(gè)LED的閃爍。Step1.打開STM32CubeMX,點(diǎn)擊“New Project”,選擇芯片型號(hào),STM32F103RBTx。Step2.配置時(shí)鐘引腳。Step3.配置PA8和PD2為Output,并把用戶標(biāo)簽分別改為L(zhǎng)ED0,LED1。Step4.使能F

5、reeRTOS。Step5.配置時(shí)鐘樹。8M輸入時(shí),通過PLL得到72M內(nèi)部時(shí)鐘。Step6.配置FreeRTOS。Config parameters選項(xiàng)卡中是配置參數(shù),其中列出了FreeRTOS的可配置參數(shù),對(duì)應(yīng)于FreeRTOSConfig.h文件中的配置參數(shù)。Include parameters選項(xiàng)卡的參數(shù)則是用來配置裁剪FreeRTOS的。Tasks and Queues用于添加任務(wù)和隊(duì)列。默認(rèn)配置了一個(gè)名為defaultTask的任務(wù),其優(yōu)先級(jí)為普通,任務(wù)堆棧大小為128字,任務(wù)函數(shù)名為StartDefaultTask。雙擊藍(lán)色的地方,彈出對(duì)話框,將任務(wù)名修改為Task_LED0,將

6、任務(wù)函數(shù)名修改為Func_LED0。點(diǎn)擊Add按鈕,增加一個(gè)任務(wù)Task_LED1,優(yōu)先級(jí)設(shè)置為Normal,函數(shù)名為Func_LED1。需要注意的是,STM32Cube對(duì)FreeRTOS進(jìn)行了一些修改,比如優(yōu)先級(jí)只有7個(gè),如下圖。Timers and Semaphores是添加軟件定時(shí)器和信號(hào)量的選項(xiàng)。注:該步驟中,除了添加任務(wù),其他的都使用默認(rèn)參數(shù)。Step7.生成代碼。這時(shí)候會(huì)彈出一個(gè)警告。原因是FreeRTSO使用了Systick作為時(shí)鐘節(jié)拍,而HAL庫也使用了Systick作為HAL_Delay()和各種timeout的時(shí)鐘基準(zhǔn)。因此需要將HAL的時(shí)鐘基準(zhǔn)改為其他TIMER。一般使用

7、一個(gè)基本定時(shí)器。點(diǎn)擊“No”按鈕,然后在Pinout設(shè)置頁面選擇時(shí)基源為TIM4再次點(diǎn)擊代碼生成按鈕,等完成后直接打開工程。工程基本組織結(jié)構(gòu)如下圖,其中Application/User組中的文件是用戶可以修改的,而其他組中的文件一般不進(jìn)行修改。Step8.分析程序結(jié)構(gòu)。在進(jìn)入main函數(shù)之前,先定義了兩個(gè)變量,聲明了幾個(gè)函數(shù)。再看main函數(shù)。將main函數(shù)整理,刪除很多注釋之后,得到下圖所示內(nèi)容。其中第部分,是硬件配置;第部分,創(chuàng)建兩個(gè)線程(或稱任務(wù));第部分,啟動(dòng)調(diào)度器。這就是程序的基本結(jié)構(gòu)。啟動(dòng)調(diào)度器后,程序就由FreeRTOS的調(diào)度器管理了,將會(huì)被執(zhí)行的是兩個(gè)已經(jīng)創(chuàng)建的任務(wù)函數(shù)Func

8、_LED0和Func_LED1,后面的while(1)是不會(huì)執(zhí)行到的。Step9.添加代碼。在main.c文件中,找到前面配置添加的兩個(gè)任務(wù)函數(shù),F(xiàn)unc_LED0和Func_LED1,然后在里面分別添加LED0和LED1的控制代碼。Step10.編譯下載運(yùn)行。LED0和LED1分別閃爍,LED0閃爍周期是1秒,LED1的周期是2秒。程序分析:1.分析語句:osThreadDef(Task_LED0, Func_LED0, osPriorityNormal, 0, 128);osThreadDef()并不是一個(gè)函數(shù),而是一個(gè)宏。其定義在cmsis_os.h文件中,作用是定義一個(gè)osThread

9、Def_t結(jié)構(gòu)體。在cmsis_os.h文件中,osThreadDef_t結(jié)構(gòu)體的定義如下:因此,將osThreadDef(Task_LED0, Func_LED0, osPriorityNormal, 0, 128);展開結(jié)果就是const osThreadDef_t os_thread_def_Task_LED0 = Task_LED0, (Func_LED0), (osPriorityNormal), (0), (128) ;即,定義了一個(gè)名為os_thread_def_Task_LED0的osThreadDef_t類型結(jié)構(gòu)體,并賦值給各個(gè)成員變量。2.分析語句:Task_LED0Han

10、dle = osThreadCreate(osThread(Task_LED0), NULL);同樣的,osThread()也是一個(gè)宏定義,在cmsis_os.h文件中可查到。osThread(Task_LED0)展開的結(jié)果就是 &os_thread_def_ Task_LED0。因此,將Task_LED0Handle = osThreadCreate(osThread(Task_LED0), NULL);展開結(jié)果就是 Task_LED0Handle = osThreadCreate(&os_thread_def_Task_LED0, NULL);所以上面分析的兩句話,其過程就是定義一個(gè)結(jié)構(gòu)體

11、變量,然后將結(jié)構(gòu)體作為參數(shù)傳遞給osThreadCreate()函數(shù),創(chuàng)建一個(gè)任務(wù)。3.分析osThreadCreate()函數(shù)。查看其源碼,可以發(fā)現(xiàn),這個(gè)函數(shù)實(shí)際上調(diào)用了xTaskCreate()函數(shù),這才是原生FreeRTOS的API函數(shù)。STM32CubeMX的工程師根據(jù)CMSIC接口標(biāo)準(zhǔn)對(duì)FreeRTOS的API函數(shù)進(jìn)行了二次封裝,使用戶開發(fā)更加容易。封裝后的函數(shù)接口都放在cmsis_os.h文件中。其實(shí),在開發(fā)過程中,不需要像上面的分析過程那樣,將函數(shù)或者宏定義展開進(jìn)行詳細(xì)分析。我們知道每個(gè)接口參數(shù)的意義,并會(huì)使用該接口就行了。附加內(nèi)容:FreeRTOS任務(wù)調(diào)度策略探討本例中的兩個(gè)任

12、務(wù)函數(shù)Func_LED0和Func_LED1,他們實(shí)際占用CPU的時(shí)間很少,在調(diào)用osDelay()函數(shù)之后,它們就進(jìn)入阻塞狀態(tài)了,它們?cè)诘却岸〞r(shí)時(shí)間到”事件。在用戶任務(wù)都進(jìn)入阻塞狀態(tài)時(shí),運(yùn)行的是空閑任務(wù)。空閑任務(wù)是啟動(dòng)調(diào)度器時(shí)自動(dòng)創(chuàng)建的。本例中,兩個(gè)任務(wù)的優(yōu)先級(jí)是一樣的,都是osPriorityNormal。但是由于調(diào)用了osDelay()函數(shù),它們進(jìn)入阻塞狀態(tài)時(shí)就讓出了CPU的使用權(quán)。因此,兩個(gè)任務(wù)看上去就像并行執(zhí)行的一樣。如果把其中的一任務(wù)的優(yōu)先級(jí)設(shè)置成osPriorityLow或者osPriorityHigh,讓兩個(gè)任務(wù)的優(yōu)先級(jí)不同,會(huì)怎樣呢?結(jié)果是,運(yùn)行起來還是像并行執(zhí)行的一樣。我們都知道,如果兩個(gè)就緒的任務(wù)優(yōu)先級(jí)不同,那么優(yōu)先級(jí)高的任務(wù)得到運(yùn)行。那么,如果兩個(gè)就緒任務(wù)優(yōu)先級(jí)相同,且一直處于就緒狀態(tài),那么在FreeRTOS中將如何運(yùn)行呢?下面將通過實(shí)驗(yàn)檢驗(yàn)其運(yùn)行過程。寫一個(gè)用for循環(huán)實(shí)現(xiàn)的延時(shí)函數(shù): 然后在任務(wù)中替代原來的osDelay()函數(shù)函數(shù)。這樣,兩個(gè)任務(wù)會(huì)一直處于可運(yùn)行的狀態(tài),因?yàn)樗麄儭翱偸怯惺虑橐觥薄).如果兩個(gè)任務(wù)的優(yōu)先級(jí)不同,則運(yùn)行結(jié)果是:只有優(yōu)先級(jí)高的任務(wù)得到運(yùn)行

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論