找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1557|回复: 1
打印 上一主题 下一主题
收起左侧

[开源框架] 极简信号/状态机框架 NorthFrame

[复制链接]
跳转到指定楼层
楼主
ID:697946 发表于 2020-2-25 13:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
gitee地址:https://gitee.com/PISCES_X/NorthFrame
单片机开发中是否被满天飞的全局变量困扰?
是否在寻找一种层级间松耦合的信号传递方式?
是否希望优雅无负担地使用状态机思路进行开发?
调试打Log很麻烦,希望自动生成,最好还有测试脚本?

NF_Signal和NF_FSM 来帮你

用法1:代替全局变量,使用方便
  1.     NF_Signal_Set("flag_connect", 1);
  2.     NF_Signal_Set("blink_cnt", 3);

  3.     NF_SignalValue flag_connect = NF_Signal_Get("flag_connect");
复制代码

用法2:配合状态机使用
以下例程在VS2012环境中运行一个判断QE组合键的状态机
注:未来会更新使用状态图绘图软件自动生成状态机代码

  1.     #include "n_frame.h"

  2.     #include "windows.h"
  3.     #include "stdio.h"

  4.     #define IS_KEY_PRESS(_key) ((GetKeyState(_key) >= 0) ? NF_Bool_False : NF_Bool_True )

  5.     /* 信号产生者 */
  6.     void Test_Key_Process(void)
  7.     {
  8.         if ( IS_KEY_PRESS('Q') ){
  9.             NF_Signal_Set("key_q_press", 1);
  10.         }
  11.         else{
  12.             NF_Signal_Set("key_q_press", 0);
  13.         }

  14.         if ( IS_KEY_PRESS('E') ){
  15.             NF_Signal_Set("key_e_press", 1);
  16.         }
  17.         else{
  18.             NF_Signal_Set("key_e_press", 0);
  19.         }
  20.     }

  21.     /* 状态机对象 */
  22.     NF_FSM Test_FSM_QandE;

  23.     /* 状态机的三个状态处理函数 */
  24.     void Test_FSM_QandE_IDLE(NF_FSM* me, NF_SignalName name, NF_SignalValue val);
  25.     void Test_FSM_QandE_QDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val);
  26.     void Test_FSM_QandE_QEDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val);

  27.     /* IDLE状态处理函数 */
  28.     void Test_FSM_QandE_IDLE(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
  29.     {
  30.         if ( NF_FSM_NameIs(name, "key_q_press") )
  31.         {
  32.             if ( val == 1 )
  33.             {
  34.                 NF_FSM_TRAN(Test_FSM_QandE_QDOWN);
  35.                 printf("Test_FSM_QandE State Translate : IDLE --> QDOWN\n");
  36.             }
  37.         }
  38.     }

  39.     /* QDOWN状态处理函数 */
  40.     void Test_FSM_QandE_QDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
  41.     {
  42.         if ( NF_FSM_NameIs(name, "key_e_press") )
  43.         {
  44.             if ( val == 1 )
  45.             {
  46.                 NF_FSM_TRAN(Test_FSM_QandE_QEDOWN);
  47.                 printf("Test_FSM_QandE State Translate : QDOWN --> QEDOWN\n");
  48.             }
  49.         }
  50.         else if( NF_FSM_NameIs(name, "key_q_press") )
  51.         {
  52.             if ( val == 0 )
  53.             {
  54.                 NF_FSM_TRAN(Test_FSM_QandE_IDLE);
  55.                 printf("Test_FSM_QandE State Translate : QDOWN --> IDLE\n");
  56.             }
  57.         }
  58.     }

  59.     /* QEDOWN状态处理函数 */
  60.     void Test_FSM_QandE_QEDOWN(NF_FSM* me, NF_SignalName name, NF_SignalValue val)
  61.     {
  62.         if ( NF_FSM_NameIs(name, "key_e_press") )
  63.         {
  64.             if ( val == 0 )
  65.             {
  66.                 NF_FSM_TRAN(Test_FSM_QandE_QDOWN);
  67.                 printf("Test_FSM_QandE State Translate : QEDOWN --> QDOWN\n");
  68.             }
  69.         }
  70.         else if( NF_FSM_NameIs(name, "key_q_press") )
  71.         {
  72.             if ( val == 0 )
  73.             {
  74.                 NF_FSM_TRAN(Test_FSM_QandE_IDLE);
  75.                 printf("Test_FSM_QandE State Translate : QEDOWN --> IDLE\n");
  76.             }
  77.         }
  78.     }

  79.     int main(void)
  80.     {
  81.         /* 初始化状态机 */
  82.         NF_FSM_Translate(&Test_FSM_QandE, NF_FSM_State(Test_FSM_QandE_IDLE));

  83.         for (;;)
  84.         {
  85.             Test_Key_Process();
  86.             NF_FSM_CheckSignal(&Test_FSM_QandE, "key_q_press");
  87.             NF_FSM_CheckSignal(&Test_FSM_QandE, "key_e_press");
  88.         }
  89.     }
复制代码


NorthFrame 单片机极简信号/状态机框架   讨论QQ群:431600056(添加时注明"来自51hei",否则不予通过)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:258566 发表于 2020-2-25 15:59 | 只看该作者
封装的比较好,但是要说简单还是switch case简单。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表