[導讀]關注「嵌入式大雜燴」,選擇「星標公眾號」一起進步!作者?|?Alicedodo狀態(tài)機是一種思想,事件驅動也是一種思想。狀態(tài)機推文:干貨|嵌入式之狀態(tài)機編程改變嵌軟開發(fā)思維方式之:狀態(tài)機的三種實現方法本篇來一起學習事件驅動。事件驅動的概念生活中有很多事件驅動的例子,上自習瞞著老師偷...
關注「嵌入式大雜燴」,選擇「星標公眾號」一起進步!
事件驅動的概念
生活中有很多事件驅動的例子,上自習瞞著老師偷睡覺就是很生動的一個。
- 方案 A:倒頭就睡,管你三七二十一,睡夠了再說,要知道有時候老師可能一整晚上都不來的。
- 方案 B:間歇著睡,先定上鬧鐘, 5 分鐘響一次,響了就醒,看看老師來沒來,沒來的話定上鬧鐘再睡,如此往復。
- 方案 C:睡之前讓同桌給放哨,然后自己睡覺,什么也不用管,什么時候老師來了,就讓同桌戳醒你。
事件驅動與單片機編程
在我們再回到單片機系統(tǒng)中來,看看事件驅動思想在單片機程序設計中的應用。當我還是一個單片機菜鳥的時候(當然,我至今也沒有成為單片機高手),網絡上的大蝦們就諄諄教導:一個好的單片機程序是要分層的。曾經很長一段時間, 我對分層這個概念完全沒有感覺。
- 什么是程序分層?
- 程序為什么要分層?
- 應該怎么給程序分層?
- 一個串口外設 Uart0,用來接收串口數據;
- 一個定時器外設 Tmr0,用來提供周期性定時中斷;
- 一個外部中斷管腳 Exi0,用來檢測某種外部突發(fā)事件;
- 一個 I/O 端口 Port0,連接獨立式鍵盤,管理方式為定時掃描法,掛載到 Tmr0 的 ISR;
#define FLG_UART 0x01
#define FLG_TMR 0x02
#define FLG_EXI 0x04
#define FLG_KEY 0x08
volatile INT8U g_u8EvntFlgGrp = 0; /*事件標志組*/
INT8U read_envt_flg_grp(void);
/***************************************
*FuncName : main
*Description : 主函數
*Arguments : void
*Return : void
*****************************************/
void main(void)
{
INT8U u8FlgTmp = 0;
sys_init();
while(1)
{
u8FlgTmp = read_envt_flg_grp(); /*讀取事件標志組*/
if(u8FlgTmp ) /*是否有事件發(fā)生? */
{
if(u8FlgTmp 




