FreeRTOS系列(二) 我的“1”出來了

上回說到我的任務1不見了,只有任務2,這次要找它出來!

上篇鏈接:https://blog.csdn.net/so_cracy/article/details/80246414

找出來的方式有很多種,先說說搶佔式調度(CubeMx默認設置是這個)

一、搶佔式調度

還是先來看看osThreadDef的定義:


上一章我們大概清楚了第一個參數 name 的作用,os_thread_def_##name 是聲明瞭一個變量,#name是把這麼宏參數變爲字符串,用作任務的名稱!

第二個參數 thread 就是任務的具體函數了

第三個參數 priority 看註釋知道是任務的優先級,通過默認函數的第三個參數 osPriorityNormal,跳轉到定義:


可以看到,osPriorityNormal 實際上就是0,看註釋也可以知道,數值越大,優先級也越高(如果不知道優先級是什麼東西,那就先去看看優先級吧),注意了

FreeRTOS中,數值越大,優先級也越高,FreeRTOS總是運行優先級最高的任務(搶佔式)

優先級的設定就相當於普通會員和VIP會員,不用想都知道是先服務VIP會員再服務普通會員,可以猜想一下,如果任務1的優先級比任務2的高,是不是說任務1就會比任務2先執行呢?把任務1弄成VIP會員,來實驗一下就知道了



結果顯示,任務1真的出來了,果然會員是很有用的,但是任務2卻不見了,這又是爲何?

二、任務狀態

嵌入式操作系統中,每一個任務都是有狀態的,FreeRTOS 的運行支持以下四種狀態

Running—運行態
Ready—就緒態
Blocked—阻塞態
Suspended—掛起態

運行態就是說任務現在正在運行,就緒態是指任務可以運行了,但是還沒開始運行,就比如在銀行排隊取錢一樣,你已經準備好取錢了,但是前面有人也在取錢,你得排隊!那麼有沒有不排隊的方法?有,VIP會員!哈哈!後面再說!

就緒態就是再排隊取錢的人,運行態就是正在取錢的人,代碼裏的 printf("StartDefaultTask1 \r\n"); 就是取錢的這個動作!而櫃檯妹妹,就相當於是內核/調度器!


任務1由於是一個死循環,就相當於是一直都在取錢,一直霸佔着櫃檯妹妹,那麼櫃檯妹妹就永遠都服務不到後面的人了!所以任務2就打印不出來了,怎麼解救櫃檯妹妹,讓她服務我們呢?有幾種方法,我們先說高尚一點的做法,任務1主動讓出櫃檯妹妹:

不是取錢嗎?取了一筆錢,那我先數一會錢吧,櫃檯妹妹先借給你們用用唄!
osDelay(100)實際就是把任務的狀態切換到阻塞態,讓出CPU佔用,讓CPU服務其它任務。但是有借有還,我數完錢了,我又會把櫃檯妹妹搶回來的,爲什麼我可以搶?因爲我是VIP(優先級較高)。

任務2也是個死循環,也是一直霸佔着櫃檯妹妹,做人要厚道一點,也先數一會錢吧!

(爲了方便顯示,我把調試信息改了一下)

這下1和2都出來了:


三、時間片調度

想一下,加入任務2也是個VIP呢?


想必也肯定是某一個被搶佔了櫃檯妹妹,那櫃檯妹妹有沒有主動權呢?先服務一下任務1,再服務一下任務2(難道是傳說中的3P大戰=_=!!),這個還是可以有的:

改一下代碼,便於顯示:


注意這裏的延時函數是自己寫的,裏面是一個死循環,這裏的m_delay(100)是延時100ms,而不是osDelay();

然後把時鐘頻率改爲100HZ,這樣,時間片就會變成10ms一個時間片:


這樣的話,時間片的時長就是10m了,看看結果:


可以是着把m_delay改成osDelay()看看效果,Task1 和Task2,幾乎是同時輸出的(目前市面上的串口調試工具可能看不到這樣的結果)

還可以把時間片修改爲其它值,看看效果!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章