在作業系統中,執行緒切換是很重要的乙個環節。如果沒有執行緒的切換,我們如何才能實現多執行緒的併發執行呢?既然要實現切換,那麼一方面,我們需要對原來的暫存器進行儲存,另外一方面我們還要壓入新堆疊的暫存器,這樣才能實現執行緒切換的效果。在x86下面,因為切換執行緒的ip位址是固定的,所以切換所需要的暫存器也是固定的,一般來說儲存eax、ebx、ecx、edx、esi、edi、ebp和esp即可。比如說,像這樣,
void swap(uint32* prev, uint32* next)
上面說的都是對已經執行的執行緒進行切換。那麼剛剛建立的執行緒怎麼進行切換呢?乙個不錯的方法就是**出棧的處理流程。把初始狀態的暫存器放在堆疊裡面,模仿執行緒的出棧過程,設定好執行緒的初始暫存器數值即可。比如說,像這樣,
void signal_handler(int m)
printf("count = %d\n", count++);
data = (uint32*)malloc(stack_length);
unit = stack_length >> 2;
if(null == data)
return;
memset(data, 0, stack_length);
data[unit -1] = (uint32) hello;
data[unit -2] = 0;
data[unit -3] = 0;
data[unit -4] = 0;
data[unit -5] = 0;
data[unit -6] = 0;
data[unit -7] = 0;
data[unit -8] = 0;
data[unit -9] = 0;
data[unit -10] = (uint32) &data[unit - 9];
new = (uint32) &data[unit -10];
swap(&old, &new);
free(data);
}
最後,我們給出乙份完整的**。在程式收到第乙個signal的時候,我們發現**不僅申請了記憶體,還初始化成了堆疊的格式,完美地解決了堆疊切換的問題。當然在hello處理結束後,**又恢復成了原來的格式,而且記憶體正常釋放,一切就像沒有發生過一樣。試想,如果每一次處理的都是乙個function和stack,那基本上就可以模仿執行緒的執行過程了。
#include #include #include #include #include #define uint32 unsigned int
#define stack_length 1024
static struct itimerval oldtv;
uint32 old = 0;
uint32 new = 0;
uint32 count = 0;
void set_timer()
void swap(uint32* prev, uint32* next)
void hello()
void signal_handler(int m)
printf("count = %d\n", count++);
data = (uint32*)malloc(stack_length);
unit = stack_length >> 2;
if(null == data)
return;
memset(data, 0, stack_length);
data[unit -1] = (uint32) hello;
data[unit -2] = 0;
data[unit -3] = 0;
data[unit -4] = 0;
data[unit -5] = 0;
data[unit -6] = 0;
data[unit -7] = 0;
data[unit -8] = 0;
data[unit -9] = 0;
data[unit -10] = (uint32) &data[unit - 9];
new = (uint32) &data[unit -10];
swap(&old, &new);
free(data);
}int main()
嵌入式作業系統核心原理和開發(中斷)
在我個人看來,中斷是cpu最重要的特色。從某種意義上來說,沒有中斷就沒有嵌入式作業系統。一旦你明白了中斷的真正含義,你對作業系統的了解就算真正入門了。什麼是中斷呢?我們可以看看微控制器下面是怎麼做的。include sbit led p1 6 unsigned int led enable 0 vo...
嵌入式作業系統核心原理和開發(開篇)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!作業系統是很多人每天必須打交道的東西,因為在你開啟電腦的一剎那,隨著bios自檢結束,你的windows系統已經開始執行了。如果問大家作業系統是什麼?可能有的人會說作業系統就是windows,就是那些可以放大 縮小 移動的視窗。對曾經是計算機專業的...
linux 嵌入式作業系統核心原理和開發總結
01 嵌入式作業系統核心原理和開發 優先順序的修改 02 嵌入式作業系統核心原理和開發 改進的鍊錶記憶體分配演算法 03 嵌入式作業系統核心原理和開發 等值block記憶體池設計 04 嵌入式作業系統核心原理和開發 執行緒狀態 05 嵌入式作業系統核心原理和開發 實時系統中的定時器 06 嵌入式作業...