關於STM32的裸機多任務多線程心得

多任務多線程

多任務"並行處理"

首先我們來理解一下並行處理,初學者寫程序通常是順序執行,當我們逐漸想成爲“專業”人士的時候順序執行 的程序已經不能滿足我們了,所以就需要多任務多線程系統,市面上標準的一些操作系統比如ucos,freeRTOS這些操作系統需要的學習週期長,範圍廣。在網上看到了一本書"單片機編程魔法師之高級裸編思想"在沒學會ucos的階段學習用這種思想過度感覺非常nice!
單片機是支持多任務同時並行地運行在一個系統中,在具體介紹之前先看一看單片機的硬件結構
在這裏插入圖片描述
這個圖中我們可以看出,單片機的運行是在ALU的主導下進行的;而定時器指是一個定時裝置,它在定時計數期間是無需ALU干預的,完全獨立運行;串口的通訊單元對數據的接收與發送也是完全獨立完成的,並不需要ALU干預。很顯然這三個任務是並行處理,切互不干涉,只有在定時器或串口產生中斷時纔會到代碼中臨時運行一段程序,已向單片機的主體運行過程交付一下結果,以便進行彙總處理。

微操作系統

簡單一點來說就是一個while(1)但是while中我們採用多任務多線程的方式管理。首先我們要知道任務有生死,生死是一個過程所以具有壽命。
一個任務的線程:假設一個任務的執行代碼有50步,通常編程只會一次執行完畢,但是我們現在需要想想,因爲我們會嫌這個任務總佔用着ALU的時間而影響其他任務的執行效果,所以就可以對任務進行劃分,把它分爲5份,每份10步,這樣我們每次執行其中的一個程序片–每次正在運行的程序片我們稱爲線程。
在這裏插入圖片描述
這個圖很完美的解釋了線程的運行原理。
具體線程的實現:

typedef struct{
	u8 isTask_Living;
	u8 Thread_Process;
}myTask;
void Task(void)
{
	if(Task.isTask_Living)
	{
	Task.isTask_Living = !myThread3(&Task3,&Task3.Thread_Process);
	}
}
/*初始化任務變量*/
void InitTask4(myTask4 *Task)
{
	Task->isTask_Living=1;
	Task->Thread_Process=0;
}

/*功能:任務線程
**參數:myTask:Task任務類型
**	  :Process:unsigned char*類型,線程指針
**返回值:CHAR類型,線程結束,或未結束
*/
static int myThread(myTask *Task,unsigned char *Process)
{
	int ret=0;
	switch(*Process)
	{
		case 0:
		//程序片1
		break;
		case 1:
		//程序片2
		break;
		case 2:
		//程序編3
		break;
		default:break;
	}
	(*Process)++;
	if(*Process>3)
	{
		ret = -1;
		*Process = 0;
	}
	return ret;
}

void TaskCommunication(void)
{
	if(Task.isTask_Living)
	{
	Task.isTask_Living = !myThread(&Task4,&Task4.Thread_Process);
	}
}

在這裏插入圖片描述
在這裏插入圖片描述
真正多任務處理的過程:
在這裏插入圖片描述
仔細理解圖上的內容對寫多任務程序的結構很有好處。
加油吧騷年們!

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