純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語言執行緒程式設計
- C 語言版執行緒池執行緒
- Java 執行緒和作業系統的執行緒有啥區別?Java執行緒作業系統
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- 作業系統-執行緒作業系統執行緒
- 執行緒池的原理與C語言實現執行緒C語言
- 執行緒和執行緒池執行緒
- C#多執行緒程式設計實戰1.1建立執行緒C#執行緒程式設計
- C#多執行緒程式設計-基元執行緒同步構造C#執行緒程式設計
- 執行緒池中的最大執行緒數、核心執行緒數和佇列大小的合理設定執行緒佇列
- go語言多執行緒入門筆記-執行緒同步Go執行緒筆記
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- 作業系統-執行緒和程式的區別作業系統執行緒
- 作業系統_程式和執行緒的區別作業系統執行緒
- Python系統程式設計之執行緒Python程式設計執行緒
- 作業系統:多執行緒作業系統執行緒
- c#基礎,單執行緒,跨執行緒訪問和執行緒帶引數C#執行緒
- 併發程式設計之多執行緒執行緒安全程式設計執行緒
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- C#多執行緒(6):執行緒通知C#執行緒
- [短文速讀 -5] 多執行緒程式設計引子:程式、執行緒、執行緒安全執行緒程式設計
- e/易語言 加執行緒執行緒
- 多執行緒和多執行緒同步執行緒
- 保障執行緒安全的設計執行緒
- 程式執行緒篇——執行緒切換(下)執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 【linux】系統程式設計-5-執行緒Linux程式設計執行緒
- 【java】【多執行緒】獲取和設定執行緒名字、獲取執行緒物件(3)Java執行緒物件
- 理解作業系統之程式和執行緒作業系統執行緒
- 【作業系統】1.程序和執行緒作業系統執行緒
- Java併發 之 執行緒池系列 (1) 讓多執行緒不再坑爹的執行緒池Java執行緒
- Java面試題:執行緒池內“鬧情緒”的執行緒,怎麼辦?Java面試題執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- Node.js 的單執行緒事件驅動模型和內建的執行緒池模型Node.js執行緒事件模型
- Java 多執行緒基礎(八)執行緒讓步Java執行緒
- 作業系統中的執行緒種類作業系統執行緒
- 《Go 語言程式設計》讀書筆記 (七) Goroutine 與系統執行緒的區別Go程式設計筆記執行緒
- 執行緒池如何觀測?這個方案讓你對執行緒池的執行情況瞭如指掌!執行緒