上回說到我的任務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"); 就是取錢的這個動作!而櫃檯妹妹,就相當於是內核/調度器!
任務2也是個死循環,也是一直霸佔着櫃檯妹妹,做人要厚道一點,也先數一會錢吧!
(爲了方便顯示,我把調試信息改了一下)
這下1和2都出來了:
三、時間片調度
想一下,加入任務2也是個VIP呢?
想必也肯定是某一個被搶佔了櫃檯妹妹,那櫃檯妹妹有沒有主動權呢?先服務一下任務1,再服務一下任務2(難道是傳說中的3P大戰=_=!!),這個還是可以有的:
改一下代碼,便於顯示:
注意這裏的延時函數是自己寫的,裏面是一個死循環,這裏的m_delay(100)是延時100ms,而不是osDelay();
然後把時鐘頻率改爲100HZ,這樣,時間片就會變成10ms一個時間片:
這樣的話,時間片的時長就是10m了,看看結果:
可以是着把m_delay改成osDelay()看看效果,Task1 和Task2,幾乎是同時輸出的(目前市面上的串口調試工具可能看不到這樣的結果)
還可以把時間片修改爲其它值,看看效果!