当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]大多数嵌入式系统本质上是被动的。他们用传感器测量环境的某些特性,并对变化作出反应。例如,它们显示某些东西,移动一个马达,或向另一个系统发送通知。一个反应系统最好由一个状态机来表示--一个系统总是在一个有限的和定义明确的可能状态集中。

大多数嵌入式系统本质上是被动的。他们用传感器测量环境的某些特性,并对变化作出反应。例如,它们显示某些东西,移动一个马达,或向另一个系统发送通知。一个反应系统最好由一个状态机来表示--一个系统总是在一个有限的和定义明确的可能状态集中。

手动编程有限状态机可以成为压倒性的任务,并产生错综复杂且难以维护的结果。图形化设计工具帮助您跟踪系统的所有可能状态和动作。本文将为您介绍一个状态机编程,重点是图形化设计工具。此外,您将学习如何将生成的平台无关代码与自定义硬件专用代码集成,以便与硬件进行交互--在本例中,这是一个Arduno板。

状态机是开发反应系统的理想范例。这些反应系统最重要的特点是,它们使用传感器和执行器与环境相互作用。传感器的例子是运动、亮度或温度传感器。常见的执行机构包括LED、显示器、阀门和电动机。这些系统的另一个重要特点是,它们有一个有限的可能状态集,而且它们总是在其中之一,使用状态机可以很容易地实现。

对于具有实际意义的状态机来说,可能最简单的例子是光开关控制,如图1所示。不出所料,两个进程中只有一个进程可以同时活动。当一个所谓的进程 过渡 已经带走了。在这个例子中,这种情况发生在 按按钮的 事件就会发生。

图1光开关控制的两种状态和过渡.(资料来源:项目组)

画出你的系统的所有状态可以帮助你提前计划,并清楚地看到你的系统在不同情况下的预期行为。然后,您可以使用该图表作为蓝图,以基础源代码和测试。然而,如果以后改变代码,就像通常情况下的情况一样,而图表没有改变,则两者都有分歧。如果有人试图根据现在已经过时的图表开发测试,那么他们就会失败。如果模型仅仅用于规范或文档,它就会成为一个巨大的问题。因此,图表不应该只是代码的蓝图,它应该是 成为 密码。

如果您已经绘制了图表,为什么要自己编写代码?所有需要的逻辑已经在图表中指定.将图表转换为等效的源代码,比如java或c,只是一个机械任务,可以由机器执行。使用图表作为唯一的真相源并自动生成代码,被称为模型驱动方法。然而,要利用这一原则,简单的绘图板是做不到的。

相反,你应该使用适当的建模工具绘制状态图(状态图)。用这种工具创建的图表很容易掌握。它们改善了软件开发人员和领域专家之间的沟通。此外,与纸张上的图表或绘图应用程序中的图表不同,建模工具对状态机是什么有正式的理解。这使他们(和你)能够模拟和测试他们的行为--甚至不编写一行代码。模型本身是独立于平台的,因此您可以从它们生成任何您喜欢的语言中的源代码。工具通常支持C,C++,Java,和比顿。

如果您仍然不确定模型驱动的软件开发是如何工作的,请不要担心--我们现在将通过实例来探索它。我们将使用标杆和代码生成来开发一个非常简单的自动化光,只需要一些输入和输出。

我们的例子:自动和动作激活灯

自动照明的任务相当简单:只有在黑暗的时候才应该有光,但是它不应该浪费能量,而实际上没有人在周围。为了实现这一点,大多数楼梯灯都是由定时器控制的。按下按钮,灯就会被激活,在一段时间后,它会自动关闭。然而,作为一个状态示例,这将是相当乏味的,因此本文通过加入一个由运动传感器驱动的附加模式,使其更加有趣。

光线应该有三种可能的操作方式:

· 永久地离开

· 有时间控制的关闭

· 自动带有运动传感器

一个按钮允许用户循环这些模式.两个LED显示当前选定的操作模式。

通过这些规范,您可以很容易地推导出状态机的基本结构,如图2所示:

图2自动和动作激活灯。

在这两者之间的变化 离开 , 计时器 和 自动动作 进程是由 事件-或者按下按钮,或者在计时器过期后。如果用户按一次按钮,计时器模式被激活,灯就会打开,30秒后自动关闭。如果用户在30秒运行完毕前再次按下按钮,则激活运动传感器模式。当运动传感器检测到某人(或某物)在移动时,如果需要的话,灯就会被打开30秒。每次检测到某一动作时,计时器都会重置.表明当前模式的两个发光二极管在进入或离开各自的状态时按需要被激活和停用。这样,整个控制器逻辑完全封装在状态机中,也称为自动机。

如果自动机是要运行在一个嵌入式系统,我们现在可以直接从图表生成C或C++代码。生成的代码包含来自模型的所有逻辑。只需要手动编写与实际硬件接口的代码。在这个例子中,这包括提高 按钮 当实际按钮按下时,控制实际的楼梯灯,控制状态LED。这种手动编程是需要的,因为生成的代码与目标平台无关。计时器也是如此--在不同的目标平台上,时间处理方式非常不同。

实现状态机有许多可能的方法.最常使用的方法是状态表、基于开关的案例构造或状态模式--通常在面向对象编程语言中使用。如果你想更深入地了解这个话题,你可以找到一个广泛的比较.在默认情况下,雅辛杜状态工具使用开关案例语句生成状态机代码。这确保了良好的性能,同时也保持了源代码的良好可读性。

生成的代码是如何工作的

如上所述,状态机代码是作为开关案例语句实现的。执行的主要部分将在 循环车 职能:

void Lightswitch::runCycle()

{

clearOutEvents();

for (stateConfVectorPosition = 0;

stateConfVectorPosition < maxOrthogonalStates;

stateConfVectorPosition++)

{

switch (stateConfVector[stateConfVectorPosition])

{

case lightswitch_Off :

{

lightswitch_Off_react(true);

break;

}

case lightswitch_Timer :

{

lightswitch_Timer_react(true);

break;

}

case lightswitch_Motion_Automatic_motion_Motion :

{

lightswitch_Motion_Automatic_motion_Motion_react(true);

break;

}

case lightswitch_Motion_Automatic_motion_No_Motion :

{

lightswitch_Motion_Automatic_motion_No_Motion_react(true);

break;

}

default:

break;

}

}

clearInEvents();

}

… 循环车 每当出现事件时,就会调用功能.它迭代所有正交的状态来做任何要做的事情。开关案例语句决定调用哪个函数来执行相应的状态反应。例如,离开状态有一个输入反应,将轻变量设置为假,只在进入状态时执行。它有一个向外和一个向外过渡。如果 按钮 事件发生后,进程将退出。这种行为在 lightswitch_Off_react 职能:

sc_boolean Lightswitch::lightswitch_Off_react(const sc_boolean try_transition) {

/* The reactions of state Off. */

sc_boolean did_transition = try_transition;

if (try_transition)

{

if (iface.button_raised)

{

exseq_lightswitch_Off();

enseq_lightswitch_Timer_default();

react();

} else

{

did_transition = false;

}

}

if ((did_transition) == (false))

{

did_transition = react();

}

return did_transition;

}

所以,假设说退出状态已经进入了。每次 循环车 函数被调用,它必须检查按钮事件是否被提升。在 lightswitch_Off_react 职能。如果 按钮 事件的确发生了,必须做两件事: 出口 当前状态的顺序和执行 加入 目标状态的顺序:

if (iface.button_raised)

{

exseq_lightswitch_Off();

enseq_lightswitch_Timer_default();

react();

}

关于一个Arduino联合国组织的实施

图3Arduino原理图。

图3显示了一个ArduinoUNO实现的示意图。实际的楼梯灯是象征着机上的LED,以保持电路简单。这两个显示模式的发光二极管连接到针9和10,运动传感器到针7。如果需要,这些密码可以更改。按钮必须连接到销2或销3,因为只有这些才能触发中断。LED系列的电阻为220欧,按钮连接到22kc拉下电阻。

该软件由两个核心组件组成:由状态生成的C++代码和用于连接非平板独立状态机逻辑和硬件的手写胶水代码。

代码生成器根据模型中定义的事件和变量创建状态机的接口:空升-按钮();空升-运动();SCOOLOL-光();SCOST;SCOL-运动();CXOOL-运动();SXOOL-内();球形进入();

对于接口状态机,必须定义特定状态机类型的对象,这里:光开关。这个对象代表实际的状态机,可以用编程方式与实际的状态机进行交互。例如:

光开关;

Lightswitch lightswitch;

int main(){

lightswitch.init();

lightswitch.enter();

lightswitch.raise_button();

}

有了这个简单的实现,光开关状态机将被初始化,输入,按钮事件将被提升。当然,这不是办法。目标是连接硬件(在这种情况下,阿尔杜伊诺与连接的LED,传感器和按钮)到状态机。为此,我们将在一个非常简单的输入过程输出模式中使用状态机。这是一个简单的循环:

· 检查硬件和传感器是否有变化

· 把这些信息转移到进程机器的输入中

· 让状态机处理这些输入

· 检查状态机的输出并对其作出反应。

最初,计时器用当前时间刷新。在阿杜伊诺号上,我们使用 米利斯 函数,以获得系统启动以来所经过的毫秒数。如果需要,计时器将触发状态机中的时间事件。

long now = millis();

if(now - time_ms > 0) {

timerInterface->proceed(now - time_ms);

time_ms = millis();

}

基于其他输入,如按钮按或运动检测,我们可以提高状态机的"在"事件。这里,我们不必担心状态机当前的模式--生成的状态机代码封装了所有的逻辑。我们只是提出事件,然后让进程机器决定它是否要对它作出反应。

// handle button press from ISR

if(buttonPressed) {

lightswitch.raise_button();

buttonPressed = false;

}

// read out motion sensor

if(digitalRead(7)) {

lightswitch.raise_motion();

}

在处理了所有"内"事件之后,状态机已经正确地设置了布尔变量。我们可以用它们来控制"楼梯灯"和指示灯。

// set light

digitalWrite(13, lightswitch.get_light());

// set mode LEDs

digitalWrite(9, lightswitch.get_led_timer());

digitalWrite(10, lightswitch.get_led_motion());

最后,我们将把阿杜伊诺放到睡眠模式中,如果它是在 离开 为了省点体力。如果用户按下这个按钮,它的中断服务例程将被调用,并且Arduno再次醒来。请注意更新 米利斯 在睡眠状态下没有更新。依靠软件计时器 米利斯 因此在睡眠状态下不会更新。在这个例子中,没有计时器运行 离开 状态是活跃的,所以我们可以安然入睡。

// if in Off-state, go to sleep (wake up by ISR)

if(lightswitch.isStateActive(Lightswitch::lightswitch_Off)) {

enterSleep();

}

闪烁的阿杜伊诺是完成了通常的阿杜伊诺。为此,我们导入了将状态机作为库的项目,并只手动编写上面的ArduinnoIDI中所示的与Arduino相关的代码。

结论

这个例子清楚地显示了在软件开发中使用模型的优点,比如说使用标杆。主要优势是:

· 状态机是正式的,可以执行.

· 进程记录是图形化的,易于理解。

· 设备的执行逻辑和相关硬件相关代码完全脱钩。

· 解除硬件和设备逻辑的连接提高了可移植性,减少了更改或进一步版本所需的努力。

· 它们可以分开开发。

这个例子可以扩展,并提供一个完美的游乐场进行状态机的实验。

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

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭