改变嵌软开发思维方式之:状态机 事件驱动框架
时间:2021-09-17 15:38:35
手机看文章
扫描二维码
随时随地手机看文章
[导读]关注「嵌入式大杂烩」,选择「星标公众号」一起进步!作者 | Alicedodo状态机是一种思想,事件驱动也是一种思想。状态机推文:干货|嵌入式之状态机编程改变嵌软开发思维方式之:状态机的三种实现方法本篇来一起学习事件驱动。事件驱动的概念生活中有很多事件驱动的例子,上自习瞒着老师偷...
关注「嵌入式大杂烩」,选择「星标公众号」一起进步!
事件驱动的概念
生活中有很多事件驱动的例子,上自习瞒着老师偷睡觉就是很生动的一个。
- 方案 A:倒头就睡,管你三七二十一,睡够了再说,要知道有时候老师可能一整晚上都不来的。
- 方案 B:间歇着睡,先定上闹钟, 5 分钟响一次,响了就醒,看看老师来没来,没来的话定上闹钟再睡,如此往复。
- 方案 C:睡之前让同桌给放哨,然后自己睡觉,什么也不用管,什么时候老师来了,就让同桌戳醒你。
事件驱动与单片机编程
在我们再回到单片机系统中来,看看事件驱动思想在单片机程序设计中的应用。当我还是一个单片机菜鸟的时候(当然,我至今也没有成为单片机高手),网络上的大虾们就谆谆教导:一个好的单片机程序是要分层的。曾经很长一段时间, 我对分层这个概念完全没有感觉。
- 什么是程序分层?
- 程序为什么要分层?
- 应该怎么给程序分层?
- 一个串口外设 Uart0,用来接收串口数据;
- 一个定时器外设 Tmr0,用来提供周期性定时中断;
- 一个外部中断管脚 Exi0,用来检测某种外部突发事件;
- 一个 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 ) /*是否有事件发生? */
{
if(u8FlgTmp 




