純C語言設計的執行緒,讓微控制器不用作業系統的情況下,支援執行緒和事件
C語言專案中用到的一些技巧,寫出來與大家分享。
情形一
碰到過這樣的需求:
1) 檢測到某種事件時,讓1號燈閃爍三次(亮100ms,滅200ms),再關掉燈;
2) 2號燈是執行指示燈,需要亮一秒,滅一秒,一直重複下去;
如何實現呢?
如果有作業系統,開多個執行緒去做,程式碼寫起來會非常完美。
但如果不用作業系統,只有一個執行緒,該怎麼辦呢?
情形二
硬體資源必須互斥訪問:
多個任務使用同一個串列埠傳送資料。
這裡需要考慮的是:
1) 串列埠傳送完一幀資料後,需要空閒幾毫秒時間才能開啟下一次傳送。否則,會造成接收方粘包,給接收方解包帶來麻煩。甚至有些協議強制要求空閒時間。
2) 如果A任務正在傳送中,B任務插進來傳送,會導致嚴重問題。
如果大家有遇到過上述兩個情形,以下的參考程式碼,會是不錯的解決方案:
#include <stdint.h>
#define EVENT0 (1UL<<0)
#define EVENT1 (1UL<<1)
uint32_t __EVENTS__ = 0;
uint32_t SysTimeMS;//系統時間,單位毫秒.
static void PollThread(void){
#define __abs(x) ((x)>0 ? (x):(-x))
#define Thread_Begin() do{ static unsigned int __lc; switch(__lc){ case 0:
#define Thread_Switch() __lc = 0
#define Thread_WaitUntil(cond) __lc = __LINE__; case __LINE__: if(!(cond)) goto __out
#define Thread_msSleep(t) do{\
static int msDelay;\
msDelay = SysTimeMS;\
Thread_WaitUntil(__abs(SysTimeMS - msDelay)>(t));\
}while(0)
#define Thread_End() }__out:}while(0)
Thread_Begin();
//最多支援32個事件.
if ( __EVENTS__ & EVENT0 ){
/*
todo:處理0#事件.
例如串列埠傳送任務,傳送完畢後延時,防止粘包。
*/
__EVENTS__ = (__EVENTS__ ^ EVENT0);//返回未處理的事件.
Thread_msSleep(10);
Thread_Switch();//切換任務.
}
if ( __EVENTS__ & EVENT1 ){
//迴圈10次,每次等待3ms.
static int i;
for(i=0; i<10; i++){
/*
todo:處理1#事件.
例如模擬IIC輸出時,需要翻轉IO口,並延時.
例如模擬串列埠輸出時,需要翻轉IO口,並延時.
例如讀模擬串列埠輸入時,需要讀IO口,可能需要延時.
*/
//不阻塞延時3ms.
Thread_msSleep(3);
}
__EVENTS__ = (__EVENTS__ ^ EVENT1);//返回未處理的事件.
Thread_Switch();//切換任務.
}
Thread_End();
}
void main(void){
//提交事件
__EVENTS__ |= (EVENT0|EVENT1);
//響應事件
while(1){
if(__EVENTS__)
PollThread();
}
}
相關文章
- C語言 之 多執行緒程式設計C語言執行緒程式設計
- Java 執行緒和作業系統的執行緒有啥區別?Java執行緒作業系統
- C 語言版執行緒池執行緒
- C#多執行緒程式設計(1):執行緒的啟動C#執行緒程式設計
- 作業系統-執行緒作業系統執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- c#執行緒-執行緒同步C#執行緒
- python多執行緒程式設計1— python對多執行緒的支援Python執行緒程式設計
- 執行緒轉儲:命名你的執行緒和檢視系統(轉)執行緒
- 執行緒和執行緒池執行緒
- C#中的執行緒(三)多執行緒C#執行緒
- Android的執行緒和執行緒池Android執行緒
- 多執行緒-程式和執行緒的概述執行緒
- boost中asio網路庫多執行緒併發處理實現,以及asio在多執行緒模型中執行緒的排程情況和執行緒安全。執行緒模型
- 執行緒池的原理與C語言實現執行緒C語言
- 作業系統-執行緒和程式的區別作業系統執行緒
- 作業系統_程式和執行緒的區別作業系統執行緒
- C#多執行緒程式設計實戰1.1建立執行緒C#執行緒程式設計
- C#多執行緒程式設計-基元執行緒同步構造C#執行緒程式設計
- go語言多執行緒入門筆記-執行緒同步Go執行緒筆記
- 執行緒池中的最大執行緒數、核心執行緒數和佇列大小的合理設定執行緒佇列
- 作業系統:多執行緒作業系統執行緒
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- 多執行緒程式設計,處理多執行緒的併發問題(執行緒池)執行緒程式設計
- 多執行緒-執行緒組的概述和使用執行緒
- 多執行緒-執行緒池的概述和使用執行緒
- 程式設計思想之多執行緒與多程式(1):以作業系統的角度述說執行緒與程式程式設計執行緒作業系統
- Java面試題:執行緒池內“鬧情緒”的執行緒,怎麼辦?Java面試題執行緒
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- c#基礎,單執行緒,跨執行緒訪問和執行緒帶引數C#執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- C#多執行緒(6):執行緒通知C#執行緒
- VC多執行緒 C++ 多執行緒執行緒C++
- 程式設計思想之多執行緒與多程式(4):C++ 中的多執行緒程式設計執行緒C++
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- e/易語言 加執行緒執行緒
- 理解作業系統之程式和執行緒作業系統執行緒
- 【作業系統】1.程序和執行緒作業系統執行緒