NorthFrame- 单片机极简信号/状态机框架

网友投稿 1080 2022-10-26

NorthFrame- 单片机极简信号/状态机框架

NorthFrame- 单片机极简信号/状态机框架

NorthFrame,单片机极简信号/状态机框架。

单片机开发中是否被满天飞的全局变量困扰?是否在寻找一种层级间松耦合的信号传递方式?是否希望优雅无负担地使用状态机思路进行开发?

NF_Signal 和 NF_FSM 来帮你。

用法1:代替全局变量,使用方便

NF_Signal_Set("flag_connect", 1);NF_Signal_Set("blink_cnt", 3);NF_SignalValue flag_connect = NF_Signal_Get("flag_connect");

用法2:配合状态机使用

#include "n_frame.h"#include "windows.h"#include "stdio.h"#define IS_KEY_PRESS(_key) ((GetKeyState(_key) >= 0) ? NF_Bool_False : NF_Bool_True )/* 信号产生者 */void Test_Key_Process(void){ if ( IS_KEY_PRESS('Q') ){ NF_Signal_Set("key_q_press", 1); } else{ NF_Signal_Set("key_q_press", 0); } if ( IS_KEY_PRESS('E') ){ NF_Signal_Set("key_e_press", 1); } else{ NF_Signal_Set("key_e_press", 0); }}/* 状态机对象 */NF_FSM Test_FSM_QandE;/* 状态机的三个状态处理函数 */void Test_FSM_QandE_IDLE(NF_FSM* me, NF_SignalName name, NF_SignalValue val);void Test_FSM_QandE_QDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val);void Test_FSM_QandE_QEDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val);/* IDLE状态处理函数 */void Test_FSM_QandE_IDLE(NF_FSM* me, NF_SignalName name, NF_SignalValue val){ if ( NF_FSM_NameIs(name, "key_q_press") ) { if ( val == 1 ) { NF_FSM_TRAN(Test_FSM_QandE_QDOWN); printf("Test_FSM_QandE State Translate : IDLE --> QDOWN\n"); } }}/* QDOWN状态处理函数 */void Test_FSM_QandE_QDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val){ if ( NF_FSM_NameIs(name, "key_e_press") ) { if ( val == 1 ) { NF_FSM_TRAN(Test_FSM_QandE_QEDOWN); printf("Test_FSM_QandE State Translate : QDOWN --> QEDOWN\n"); } } else if( NF_FSM_NameIs(name, "key_q_press") ) { if ( val == 0 ) { NF_FSM_TRAN(Test_FSM_QandE_IDLE); printf("Test_FSM_QandE State Translate : QDOWN --> IDLE\n"); } }}/* QEDOWN状态处理函数 */void Test_FSM_QandE_QEDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val){ if ( NF_FSM_NameIs(name, "key_e_press") ) { if ( val == 0 ) { NF_FSM_TRAN(Test_FSM_QandE_QDOWN); printf("Test_FSM_QandE State Translate : QEDOWN --> QDOWN\n"); } } else if( NF_FSM_NameIs(name, "key_q_press") ) { if ( val == 0 ) { NF_FSM_TRAN(Test_FSM_QandE_IDLE); printf("Test_FSM_QandE State Translate : QEDOWN --> IDLE\n"); } }}int main(void){ /* 初始化状态机 */ NF_FSM_Translate(&Test_FSM_QandE, NF_FSM_State(Test_FSM_QandE_IDLE)); for (;;) { Test_Key_Process(); NF_FSM_CheckSignal(&Test_FSM_QandE, "key_q_press"); NF_FSM_CheckSignal(&Test_FSM_QandE, "key_e_press"); }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Videoflow是用于视频流处理的Python框架
下一篇:【深入浅出JVM】——类加载过程
相关文章

 发表评论

暂时没有评论,来抢沙发吧~