有哪几种形态的状态机:
1、人可以是一个状态机,人有各种状态,晚上要睡觉,白天要工作、上学,也要吃饭,每个时刻都有不同的状态。但人这个状态如何在程序中体现呢?可以设计为一个while(1)顺序执行的方式,每个时刻都有执行的操作,睡觉->起床->上午工作->中午吃饭->下午工作->晚上加班.....,if (早上) else if (中午).........这是标准的面向过程的执行方式,一天就是一个过程,不适合阅读,维护成本高,有没有面向对象的方式去执行呢?当然有,以一个人为对象,人一天需要吃饭睡觉加班,人就是个状态机。
2、在RTOS中,根据任务划分功能,每个任务都有停止态、挂起态、就绪态、运行态这几种状态,每个任务有需要抢占时间片执行对应的逻辑,每个任务都是一个状态机,抢占时间片去跑自己的逻辑。RTOS涵盖了状态机的实现。
状态机的好处:
1、最主要:减少代码的冗余和潜在的错误,传统的if else和switch case结构可能会因为状态的增多而导致无法维护。
2、状态机可以理解为一个对象的多个行为,面向对象结构化的处理方式,可以使系统的行为更加直观理解。
示例:
当前有N个功能模块一同控制后端亮度大小,如光感(随着光照变化而变化),如人眼保护(当人靠近时背光亮度降低至原来一半),如拍照模式(一组单独的亮度值供手机拍照使用),如UI背光调节进度条(可以实现0-10档位的亮度调节)......每个功能模块都能对背光进行控制,多模块共同作用的场景此时立马想到的有两种思路。第一种思考为加入互斥锁,但互斥锁的加入仅是为了防止多模块共同作用导致的单模块响应异常,并不能保证同一时间仅有一个功能模块作用。此时可选择加入RTOS状态机的形式,将各功能模块划分为各背光节点,根据重要程度进行优先级的划分,同一时刻仅有一个背光节点作用,即处于运行态,其他未作用的背光节点处于就绪态或挂起态中的一种,处于就绪态且优先级最高的背光节点就切换至运行态。
之前在老东家时给老项目加入RTOS系统,当时将原处于while(1)循环中的模块进行了划分,本来是一个个函数体,将他们照搬成一个个的RTOS Task,除了代码简洁程度上有提升外,感觉相较于while(1)裸机也没啥提升啊!在老东家一直不理解RTOS的真正使用,当时有一种为了技术而加入的意思。
自动来新单位后,直到被N对1的逻辑操控彻底折磨一遍后(见本文示例部分),痛定思痛加入状态机思想,代码编写后期感觉越来越有了RTOS的感觉,才恍然大悟!这不就是RTOS的好处吗??可以解决N对1场景下1的不可控问题。
另外,延伸一下,若代码量比较庞大,也可以通过RTOS的形式划分出各个任务,然后将各任务划分给不同的开发者实现,实现模块化开发。