NorthFrame

单片机极简信号/状态机框架
授权协议 AGPL
开发语言 C/C++
所属分类 其他开源、 嵌入式操作系统
软件类型 开源软件
地区 国产
投 递 者 孔阳平
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

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:配合状态机使用

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

#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");
	}
}
 相关资料
  • 问题内容: 我目前正在学习Java,并且想知道如何以OO方式控制状态。我实现了一个Pong应用程序。如果我想要多个状态,例如游戏性和菜单状态,并且这些状态中的每个状态都必须执行启动,停止和运行,我将如何实现此目标以及如何在这些状态之间进行切换。 我知道我可以简单地添加一个大的switch语句,但是实现这一点的最佳方法是什么? 我希望能够在游戏状态下切换到菜单状态,反之亦然。 问题答案: 您可以使用

  • 主要内容:实例,实例,实例,实例,实例,实例关键词:状态机,售卖机 有限状态机(Finite-State Machine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。状态机不仅是一种电路的描述工具,而且也是一种思想方法,在电路设计的系统级和 RTL 级有着广泛的应用。 状态机类型 Verilog 中状态机主要用于同步时序逻辑的设计,能够在有限个状态之间按一定要求和规律切换时序电路的状态。状态的切换方

  • 我想把GUI实现为一个状态机。我认为这样做有一些好处,也有一些缺点,但这不是这个问题的主题。 在读了一些关于这方面的文章后,我发现了几种用C语言建模状态机的方法,我坚持使用2,但我不知道哪种方法更适合GUI建模。 > 用以下方法将状态机表示为状态列表:

  • 概述 Javascript Finite State Machine函数库 参考链接 概述 有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物。 简单说,它有三个特征: 状态总数(state)是有限的。 任一时刻,只处在一种状态之中。 某种条件下,会从一种状态转变(transition)到另一种状态。 它对JavaScript的意义在于,很多对象可

  • 智能状态机是一个前端复杂对象优雅编程模型。 npm包中包含库和浏览器扩展 目的:更加自动和简洁的实现状态的迁移。 原理:通过装饰器,对异步函数进行包装,使得调用异步函数可以自动修改状态,并且自动实现异步调用过程中的中间状态 功能: 自动生成状态机 自动实现状态迁移 自动派发事件 可视化状态变化历史 可视化状态机图 使用例子: import { FSM, ChangeState } from 'af

  • 本文向大家介绍Python Web框架Flask信号机制(signals)介绍,包括了Python Web框架Flask信号机制(signals)介绍的使用技巧和注意事项,需要的朋友参考一下 信号(signals) Flask信号(signals, or event hooking)允许特定的发送端通知订阅者发生了什么(既然知道发生了什么,那我们可以知道接下来该做什么了)。 Flask提供了一些信

  • 本文向大家介绍android实现手机与单片机蓝牙模块通信,包括了android实现手机与单片机蓝牙模块通信的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了android实现手机与单片机蓝牙模块通信的具体代码,供大家参考,具体内容如下 我是参考原博客的内容去写的,由于原博客写的不全,少了关键的几个类,然后我就凭借自己扎实的功底补出来了,现在蓝牙工作正常,能发能收!在看这边文章之前你要先

  • 问题内容: 您是否可以与我(和社区)分享的人对Python状态机的设计技巧? 目前,我将基于以下方面来选择引擎: 但是我敢肯定,在利用Python的动态特性(例如动态调度)的同时,有很多解决方法。 我追求的是针对“引擎”的设计技术,该技术接收与基于机器“状态”的事件和“事件”相对的“事件”和“事件”。 问题答案: 我真的不明白这个问题。该 国设计模式是相当清楚的。。 这是非常常见的样板,可用于Ja