当前位置:首页 > 公众号精选 > 嵌入式云IOT技术圈
[导读]点击上方「嵌入式云IOT技术圈」,选择「置顶公众号」第一时间查看嵌入式笔记!NorthFrame是基于非UML极简理念的状态机框架配合NF_FsmDesigner图形化开发工具,可无负担替代传统switch-case状态机开发1、NorthFrame的组件NF_FSM:极简非UM...

点击上方「嵌入式云IOT技术圈」,选择「置顶公众号」第一时间查看嵌入式笔记!

NorthFrame是基于非UML极简理念的状态机框架

配合NF_FsmDesigner图形化开发工具,可无负担替代传统switch-case状态机开发

1、NorthFrame的组件

  • NF_FSM :

    极简非UML状态机框架

  • NF_FsmDesigner :

    基于C# Winform开发的状态机图形化开发工具,可直接生成C代码

  • NF_Signal :

    用于代替全局变量的动态信号机制

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

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

2、NorthFrame图形化状态机开发

以下例程在VS2012环境中运行一个判断QE组合键的状态机:

Step1 : 使用NF_FsmDesigner工具设计绘制状态转换图,并保存为XML文件

Step2 : 点击生成代码,生成如下C语言代码

#include 
#include 

/* 转换执行的外部函数声明 */
extern void IDLE_TO_Q(void);
extern void Q_TO_QE(void);
extern void QE_TO_IDLE(void);
extern void QE_TO_Q(void);
extern void Q_TO_IDLE(void);

/* 状态处理函数声明 */
void FSM_QandE_IDLE(NF_FSM* me, NF_Event event);
void FSM_QandE_Q_DOWN(NF_FSM* me, NF_Event event);
void FSM_QandE_QE_DOWN(NF_FSM* me, NF_Event event);

/* 状态机对象 */
NF_FSM FSM_QandE = {
    FSM_QandE_IDLE
};

/* IDLE状态处理函数 */
void FSM_QandE_IDLE(NF_FSM* me, NF_Event event)
{

    if (NF_FSM_NameIs(event.Name, "Q_DOWN"))
    {
        IDLE_TO_Q();
        NF_FSM_TRAN(FSM_QandE_Q_DOWN);
        return ;
    }

    if (NF_FSM_NameIs(event.Name, "test"))
    {
        NF_FSM_TRAN(FSM_QandE_IDLE);
        return ;
    }
}

/* Q_DOWN状态处理函数 */
void FSM_QandE_Q_DOWN(NF_FSM* me, NF_Event event)
{

    if (NF_FSM_NameIs(event.Name, "E_DOWN"))
    {
        Q_TO_QE();
        NF_FSM_TRAN(FSM_QandE_QE_DOWN);
        return ;
    }

    if (NF_FSM_NameIs(event.Name, "Q_UP"))
    {
        Q_TO_IDLE();
        NF_FSM_TRAN(FSM_QandE_IDLE);
        return ;
    }
}

/* QE_DOWN状态处理函数 */
void FSM_QandE_QE_DOWN(NF_FSM* me, NF_Event event)
{

    if (NF_FSM_NameIs(event.Name, "Q_UP"))
    {
        QE_TO_IDLE();
        NF_FSM_TRAN(FSM_QandE_IDLE);
        return ;
    }

    if (NF_FSM_NameIs(event.Name, "E_UP"))
    {
        QE_TO_Q();
        NF_FSM_TRAN(FSM_QandE_Q_DOWN);
        return ;
    }
}
Step3 : 在main.c文件中实现按键处理,并发送事件给状态机

备注 : 后续版本会加入发布-订阅机制,目前仅支持直接派发

#include "n_frame.h"

#include "windows.h"
#include "stdio.h"

#include "fsm_qande.h"

#define KEY_VALUE(_key) ((GetKeyState(_key) >= 0) ? NF_Bool_False : NF_Bool_True )

/* 信号产生者 */
void Test_Key_Process(void)
{
 static NF_Bool last_q_val = NF_Bool_False;
 static NF_Bool last_e_val = NF_Bool_False;

 NF_Bool then_q_val;
 NF_Bool then_e_val;

 then_q_val = KEY_VALUE('Q');
 then_e_val = KEY_VALUE('E');

 /* Q键事件处理 */
 if ((last_q_val == NF_Bool_False) 
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

摘要:基于传统直角坐标机器人控制技术,以蓄电池极板连续生产线的码垛机器人为应用案例,根据设备需求、机器人控制原理和系统状态机的设计,介绍了一种通用的、灵活的、开发周期短的多轴直角坐标机器人控制方法。该机器人经过实践,验证...

关键字: 直角坐标机器人 状态机 控制系统

▼点击下方名片,关注公众号▼欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费资料。回复【加群】,限时免费进入知识共享群;回复【3D封装库】,常用元器件的3D封装库;回复【电容】,获取电容、元器件选型相关的内容...

关键字: 单片机 状态机 传感器中

在单片机裸机的编程方法中,状态机的方法是比较好的,经典的比如按键的检测判断等。其实,有很多地方可以使用这种思想,比如传感器的数据采集。因为单片机不可能一直等待着运行,那样的效率是很低的,通常都是结合fsmtimer的方式...

关键字: 单片机 状态机

关注、星标公众号,直达精彩内容来源:技术让梦想更伟大作者:ming_mei前言前些日子在微信上看到李肖遥的公众号,里面系统讲述了QP框架,我很有感触。我用QP框架很多年了,一开始是使用QM和QPC,到后来抛弃了QM,直接...

关键字: 单片机 状态机

星标「嵌入式大杂烩」,一起进步!来源:https://blog.csdn.net/qq_36969440/article/details/110387716状态机基本术语现态:是指当前所处的状态。条件:又称为“事件”,当...

关键字: 嵌入式 状态机 编程

关注、星标公众号,直达精彩内容来源:小鱼儿飞丫飞整理:技术让梦想更伟大|李肖遥前言:本框架实现的目的是在基于51单片机为控制芯片的产品内,因为51单片机的内存和堆栈比较有限,此框架比较简洁高效的。如果用于其他高性能的处理...

关键字: 状态机

来源:裸机思维作者:GorgonMeducer【说在前面的话】在前面的讲解中,我们介绍了如何使用状态图的方式来设计有限状态机、明确了状态图设计的“清晰”原则,并结合最简单和常用的switch状态机翻译模式详细说明了状态图...

关键字: 状态机

关注「嵌入式大杂烩」,选择「星标公众号」一起进步!来源:技术让梦想更伟大作者:李肖遥Blinky是自带的一个很简单的例子,也就是我们俗称的”HelloWorld!”,可以帮助我们了解QP。在这个blinky中,是以1HZ...

关键字: 状态机

来源:裸机思维作者:GorgonMeducer【说在前面的话】在前面的讲解中,我们介绍了如何使用状态图的方式来设计有限状态机、明确了状态图设计的“清晰”原则,并结合最简单和常用的switch状态机翻译模式详细说明了状态图...

关键字: 状态机

状态机的实现无非就是3个要素:状态、事件、响应。转换成具体的行为就3句话。发生了什么事?现在系统处在什么状态?在这样的状态下发生了这样的事,系统要干什么?用C语言实现状态机主要有3种方法:switch—case法、表格驱...

关键字: 状态机
关闭
关闭