【本帖內容】RT-thread學習之線程間的同步
RT-thread學習之RTT 的與眾不同RT-thread學習之object對象管理機制
RT-thread學習之Thread線程機制及應用
RT-thread學習之設備層框架設計淺析
繼續(xù)我們的學習之路,前面講了線程相關的應用方面的一些概念,其實OS的核心就是依靠線程來實現(xiàn)的,但是線程只是os底層實現(xiàn)的基本單位,一個應用往往需要很多的線程協(xié)調工作,這里就涉及到多線程間通信的問題。在原有的裸機時代,是沒有什么線程概念的,但是往往可以將線程類比函數(shù)的概念,實際上本質上并無太大差別,只是對于函數(shù)的控制往往都很弱,你只能控制它開始,然后等待它自行走完一個周期,然后才去干別的活,當你需要對函數(shù)進行控制時,你的第一考慮是中斷,其實這部分所實現(xiàn)的功能就和os對線程的管理就很像了,但是你用中斷以后,如果有其它函數(shù)需要搶占執(zhí)行呢,這時候你會說,嵌套中斷嘛,的確可以通過嵌套中斷的方式來實現(xiàn)對于中斷級的搶占,而且從這一方面來講它和os就更像了,但是要注意一點問題,中斷時舒服前臺操作的,而函數(shù)才是后臺的服務,那么問題來了,你能把所有的功能都放進前臺實現(xiàn)嗎?答案肯定是不能前臺中斷有幾個條件決定了這樣做不可行,其一中斷入口的條件判斷是特定的,比如定時中斷,外部觸發(fā)中斷,串口中斷,都是發(fā)生在特定條件下才能進入,其二中斷的數(shù)量是有限的,你有100個函數(shù)功能要執(zhí)行,但不一定有一百個中斷給你用,其三,涉及到系統(tǒng)棧的問題了,中斷搶占函數(shù)執(zhí)行,中斷搶占中斷執(zhí)行,這些臨時場景的保存,只有一個地,那就是系統(tǒng)棧,默認大小是0x400,不論發(fā)生何種搶占問題都會消耗系統(tǒng)棧的開銷,一旦發(fā)生中斷嵌套或函數(shù)嵌套調用,那么多大的系統(tǒng)棧才夠用呢,單片機本身RAM就金貴,棧定義大了,應用級就不夠用,定義小了又容易發(fā)生中斷溢出,os則從另一個角度嘗試解決這個問題,依然會導致RAM開銷比傳統(tǒng)裸機的大,但相對于溢出問題得到了有效的控制,總體來講還是一個不錯的選擇。扯了很多,好像又有點偏了,接下來還是進入正題講下線程間同步的問題。
/* 消息機制
* 消息采用32位緩沖存儲,每次消息產(chǎn)生都按位配置。
* 按位檢測消息,同時復位此消息位。
* 循環(huán)等待檢測消息緩沖。
*
*/
static int g_signal = 0;
//判斷消息
int judge_msg_signal(int i)
{
if((g_signal >> i) & 0x01) //檢測到消息
{
g_signal &= ~(0x01<
return i;
}
else
{
return 0;
}
}
/*
* 設置事件
*/
void set_msg_signal(int msg)
{
if(msg > MSG_COUNT)
return;
g_signal |= (0x01<
/*
* 事件接收機制,遍歷整個事件,找到有效事件
* 通過return返回事件,每次只能處理一個事件
*/
int wait_msg_signal(void)
{
int temp = 0, i;
for(i = MSG_COUNT; i>0; i--)
{
if(judge_msg_signal(i) == i)
{
temp = i;
return temp;
}
}
return temp;
}
【本帖內容】RT-thread學習之線程間的同步
RT-thread學習之RTT 的與眾不同