OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2432|回复: 1

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

[复制链接]

4

主题

67

帖子

0

精华

版主

Rank: 7Rank: 7Rank: 7

积分
212
金钱
212
注册时间
2015-8-5
在线时间
49 小时
发表于 2020-2-25 13:34:56 | 显示全部楼层 |阅读模式
本帖最后由 独孤帅 于 2020-2-25 13:46 编辑

NorthFrame 单片机极简信号/状态机框架         讨论QQ群:431600056

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组合键的状态机
注:未来会更新使用状态图绘图软件自动生成状态机代码
QandE_FSM.jpg
  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. }
复制代码

开源QQ群:431600056
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2020-2-25 15:29:11 | 显示全部楼层
一分耕耘一分收获。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-25 22:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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