十年工作經驗,主持設計多個爆款智能硬件,老司機帶你飛,快上車,麻煩點個關注。
今天狗哥開始正式跟大家一起學習FreeRTOS這一實時操作系統,這節課我們學習FreeRTOS最基本的任務控制。
任務概述 FreeRTOS中資源的分配是以任務為依托的,每個任務占用獨立的任務棧空間,獨占一部分資源,在CPU的調度下獨立運行,你可以想象是一個旅館,有好多獨立的空房間,房間裡面有電視、床、水、沙發等資源,可以多個人入住不同的房間,互不影響。
我們編寫軟件的時候是以任務為基本模塊單元的,這會極大的方便我們抽象任務,提高開發效率。舉個栗子,我們接到任務,要開發一個數據采集器,通過串口接收和發送命令,采集ADC數據。
那麼很自然的我們就想到,把需求抽象為兩大任務:串口任務和ADC任務。下面我們來看看如何創建任務。
創建任務
//定義串口任務優先級、任務棧空間
osThreadDef(UART_TASK, uart_task, osPriorityNormal, 0,configMINIMAL_STACK_SIZE);
//創建串口任務
Uart_ThreadHandle = osThreadCreate(osThread(UART_TASK), NULL);
這兩條語句就可以創建一個任務,是不是很簡單,我們來分析下各個參數
osThreadDef函數用來定義任務所需要的名稱,任務優先級,棧空間等信息。
1、任務名稱:自己定義,這裡我們定義為UART_TASK
2、任務函數:這裡我們定義為uart_task
3、任務優先級:這裡我們定義為normal的等級
4、線程實例個數:這個暫時用不到,置0
5、任務棧大小:我們按默認最小值
osThreadCreate這個函數用來創建線程空間,讓我們的任務運行,這個函數隻有兩個參數
1、定義的線程:我們上一個函數裡定義的線程,也就是UART_TASK
2、線程參數:暫時用不到,NULL
好了,這兩個函數寫好後,标識我們任務運行的線程空間已經構建好了,相當于房間開好了,接下來,就要寫我們具體的任務了。
一個典型的任務框架是這樣的
void uart_task(void const *arg)
{
for(;;)
{
//TODO:
printf("uart task running\n");
}
}
這裡的uart_task就是我們剛才定義線程空間時傳入的參數,也就是說這個線程空間是uart_task這個任務所獨占的。需要注意的是任務函數是永不返回的,任務之間的切換是由調度器來控制的。
啟動調度器
osKernelStart();
這個函數用來啟動調度器,調度器開啟後,整個系統就由調度器接手了,她來決定讓哪一個任務來運行,後面我們都會詳細講到。
總結 要啟動一個任務,首先要定義線程空間,然後要定義任務函數,寫自己的業務邏輯,啟動調度器,大功告成。
這個過程就像去住賓館,先要确定好自己住大床房還是标間,也就是定義線程空間;之後就要定義任務函數,也就是想好到房間裡是洗澡還是看電視,寫自己的業務邏輯;最後一步就是啟動調度器,到前台取房卡。
今天的作業:大家創建一個自己的任務并運行起來。
今天的課不知道狗哥講明白了沒有,有什麼建議大家盡管在評論區提出來,狗哥不斷改進。還有一點就是希望大家踴躍發言,下節課是繼續往下講還是希望繼續深入分析任務創建。沒啥講課經驗,盡可能的把自己的意思表達出來,有不足的地方還希望大家海涵,謝謝各位!
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!