多任務多線程
多任務"並行處理"
首先我們來理解一下並行處理,初學者寫程序通常是順序執行,當我們逐漸想成爲“專業”人士的時候順序執行 的程序已經不能滿足我們了,所以就需要多任務多線程系統,市面上標準的一些操作系統比如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);
}
}
真正多任務處理的過程:
仔細理解圖上的內容對寫多任務程序的結構很有好處。
加油吧騷年們!