STM32CubeMX+FreeRTOS學(xué)習(xí)[2]-二值信號量(Lu)WORD_第1頁
STM32CubeMX+FreeRTOS學(xué)習(xí)[2]-二值信號量(Lu)WORD_第2頁
STM32CubeMX+FreeRTOS學(xué)習(xí)[2]-二值信號量(Lu)WORD_第3頁
STM32CubeMX+FreeRTOS學(xué)習(xí)[2]-二值信號量(Lu)WORD_第4頁
STM32CubeMX+FreeRTOS學(xué)習(xí)[2]-二值信號量(Lu)WORD_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、文檔可能無法思考全面,請瀏覽后下載! FreeRTOS學(xué)習(xí)之二:二值信號量前提:默認(rèn)已經(jīng)裝好MDK V5和STM32CubeMX,并安裝了STM32F1xx系列的支持包。硬件平臺:STM32F1xx系列。目的:學(xué)習(xí)使用二值信號量進(jìn)行任務(wù)同步。二值信號量主要用于任務(wù)的同步。本文例子使用STM32CubeMX配置創(chuàng)建兩個任務(wù),一個任務(wù)每秒鐘發(fā)送一次信號量,另一個等待信號量并控制LED的輸出狀態(tài)。Step1.打開STM32CubeMX,點擊“New Project”,選擇芯片型號,STM32F103RBTx。Step2.配置時鐘引腳。Step3.配置PA8和PD2為Output,并把用戶標(biāo)簽分別改為

2、LED0,LED1。7 / 7Step4.將系統(tǒng)時基源改為TIM4。Step5.使能FreeRTOS。Step6.配置時鐘樹。8M輸入時,通過PLL得到72M內(nèi)部時鐘。Step7.配置FreeRTOS。在Tasks and Queues選項卡中,默認(rèn)配置了一個名為defaultTask的任務(wù),其優(yōu)先級為普通,任務(wù)堆棧大小為128字,任務(wù)函數(shù)名為StartDefaultTask。雙擊藍(lán)色的地方,彈出對話框,將任務(wù)名修改為Periodic,將任務(wù)函數(shù)名修改為PeriodicTask。點擊Add按鈕,增加一個任務(wù)Handle,優(yōu)先級設(shè)置為Normal,函數(shù)名為HandleTask。在Timers a

3、nd Semaphores選項卡,點擊Binary Semaphores項右邊的“Add”按鈕,添加一個信號量,名稱改為bSem01。注:該步驟中,除了添加任務(wù)和信號量,其他的都使用默認(rèn)參數(shù)。Step8.生成代碼。等完成后直接打開工程。工程基本組織結(jié)構(gòu)如下圖,其中Application/User組中的文件是用戶可以修改的,而其他組中的文件一般不進(jìn)行修改。Step9.分析程序結(jié)構(gòu)。在進(jìn)入main函數(shù)之前,先定義了幾個變量,聲明了幾個函數(shù)。再看main函數(shù)。將main函數(shù)整理,刪除很多注釋之后,得到下圖所示內(nèi)容。其中第部分,是硬件配置;第部分,創(chuàng)建一個信號量和兩個任務(wù);第部分,啟動調(diào)度器。啟動調(diào)度

4、器后,程序就由FreeRTOS的調(diào)度器管理了,后面的while(1)是不會執(zhí)行到的。Step10.添加代碼。在main.c文件中,找到前面配置添加的兩個任務(wù)函數(shù),并在其中分別添加代碼。PeriodicTask的功能是,每1秒鐘發(fā)送一次信號量。HandleTask的功能的,等待信號量,然后翻轉(zhuǎn)LED0和LED1的輸出狀態(tài)。Step11.編譯下載運行。LED0和LED1分別閃爍,周期都是2秒。程序分析:1.分析語句:osSemaphoreDef(bSem01);和osThreadDef()類似,osSemaphoreDef()并不是一個函數(shù),而是一個宏。其定義在cmsis_os.h文件中,作用是定

5、義一個osSemaphoreDef_t結(jié)構(gòu)體。2.分析語句:bSem01Handle = osSemaphoreCreate(osSemaphore(bSem01), 1);同樣的,osSemaphore ()也是一個宏定義,在cmsis_os.h文件中可查到。該語句的作用就是創(chuàng)建一個信號量,最后一個參數(shù)=1時,創(chuàng)建的就是一個二值信號量。3.HandleTask任務(wù)在執(zhí)行osSemaphoreWait(bSem01Handle , osWaitForever);語句后,進(jìn)入阻塞狀態(tài),等待PeriodicTask任務(wù)釋放信號量。在實際運用中,二值信號量主要用于任務(wù)同步。如果把上面的Periodi

6、cTask任務(wù)換成硬件定時器的ISR函數(shù),那么HandleTask任務(wù)就相當(dāng)于定時器的延遲處理函數(shù)。這是RTOS種常用的方法。因為RTOS調(diào)度本身使用了較低優(yōu)先級的定時器中斷實現(xiàn),如果在硬件ISR中執(zhí)行過多的代碼,就會造成RTOS響應(yīng)受到很大影響。因此,在ISR中只發(fā)送信號量,然后在其延遲處理函數(shù)中實現(xiàn)真正的用戶功能。這本質(zhì)上就是,將任務(wù)函數(shù)和硬件中斷進(jìn)行同步。需要注意的一點是,在原生的FreeRTOS中,信號量的發(fā)送和獲取在ISR中要使用以FromISR結(jié)尾的特定函數(shù)。在STM32Cube生成的代碼中,ST的工程師已經(jīng)把接口進(jìn)行了統(tǒng)一,在相應(yīng)的函數(shù)中,通過查詢程序狀態(tài)寄存器判斷當(dāng)前是在ISR中還是在普通函數(shù)中。所以用戶在使用時,統(tǒng)一使用osSemaphoreWait()和osSemaphor

溫馨提示

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

評論

0/150

提交評論