NorthFrame 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
NorthFrame 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
NorthFrame 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 AGPL
开发语言 C/C++
操作系统 跨平台
软件类型 开源软件
开源组织
地区 国产
投 递 者 青蓝pisces
适用人群 未知
收录时间 2020-02-25

软件简介

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");
	}
}
展开阅读全文

代码

的 Gitee 指数为
超过 的项目

BOM

器件型号 器件厂商 更多信息
{{o.mpn}} {{o.mfr}} 查看

评论

点击加入讨论🔥(1) 发布并加入讨论🔥
暂无内容
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
暂无内容
1 评论
25 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部