* 内容簡述:
本例程作業系統采用ucos2.86a版本, 建立了5個任務
任務名 優先級
APP_TASK_START_PRIO 2 主任務
Task_Com1_PRIO 4 COM1通信任務
Task_Led1_PRIO 7 LED1 閃爍任務
Task_Led2_PRIO 8 LED2 閃爍任務
Task_Led3_PRIO 9 LED3 閃爍任務
當然還包含了系統任務:
OS_TaskIdle 空閑任務-----------------優先級最低
OS_TaskStat 統計運作時間的任務-------優先級次低
1、主任務建立:
這個采用老版本的任務建立函數,第一個參數通俗的說法就是該任務對應的函數,如下:
<a></a>
當主任務建立之後,程式就轉到該函數處,調用 App_TaskCreate();建立其他任務,然後進入死循環,我們會發現:這裡的主任務在建立其他任務後就沒啥作用的,這時可以調用相應的函數将主任務給殺死,這裡沒有這樣做,隻是讓主任務進入循環。
2、其他任務建立:
這裡是建立四個子任務第一個是序列槽通信的任務,一會再說,下面三個是LED閃爍任務,這裡舉Task_Led1說明:
可見LED閃爍任務其實就是一個無限循環,讓燈的電平每隔一定時間高、每隔一定時間低來呈現閃爍的效果。那麼,他是怎樣實作任務切換的呢?這就是作業系統的功能了,作業系統根據每個任務的優先級,在每個子任務執行到一定時期查詢目前挂起任務的優先級來選擇優先級最高的進行執行。下面是在app_cfg.h中對這些任務優先級的聲明:
可見主任務的優先級最高,序列槽通信的優先級其次,LED閃爍的優先級趨于中等,依次為7、8、9,
這裡重點講一下序列槽通信的任務:這裡采用消息郵箱進行消息傳遞,在建立其他任務App_TaskCreate(void)的開始就首先建立序列槽的消息郵箱:Com1_MBOX=OSMboxCreate((void *) 0);然後在序列槽通信的任務中進入循環後就一直等待消息郵箱的資訊(第8行),如果沒有消息過來就一直等待,在此期間其他任務可以進行,一旦有消息發送過來,由于序列槽通信的優先級較高,就能很快響應,根據收到的消息msg來重新設定led閃爍的頻率。這裡因為序列槽接收要用到中斷,是以下面就說說序列槽通信的接收中斷部分。
這裡接收序列槽資料,當發現是完整的幀時,就調用OSMboxPost(Com1_MBOX,(void *)&msg);發送一個郵箱消息,進而那邊的序列槽任務從挂起到喚醒,執行相應的過程。
3、硬體初始化部分
說了這麼多,竟然忘了說硬體初始化的部分啦!這裡包括系統時鐘設定、引腳使能、中斷使能...放在bsp.c檔案裡,在main函數開始直接調用BSP_Init();就可以。
void RCC_Configuration(void)
void GPIO_Configuration(void)
void NVIC_Configuration(void)
void USART_Config(USART_TypeDef* USARTx,u32 baud)
PS:相關連結
本文轉自beautifulzzzz部落格園部落格,原文連結:http://www.cnblogs.com/zjutlitao/p/3917638.html,如需轉載請自行聯系原作者