良许Linux教程网 干货合集 状态机 | 如何从零开始构建一个QM项目

状态机 | 如何从零开始构建一个QM项目

QM建模工具是一种强大的工具,它提供了交互式GUI模式和命令行模式两种操作方式。不管是在Windows、Linux还是MacOS操作系统上,都可以轻松运行QM。接下来,我将在Windows上演示。

要在Windows上运行QM,只需双击桌面上的快捷方式即可。你也可以通过将QM模型文件拖放到QM快捷方式上来启动QM。我们以一个简单的“闪烁”应用程序为例,来学习如何从零开始构建一个QM项目,并在桌面上运行并将结果打印到屏幕上。

现在,让我们一步一步地创建一个新模型。首先,打开QM并新建一个Model,如下图所示。在这里,我们选择默认的qpc框架类型,并选择自定义路径。模型模板选择None,这样我们可以从头开始构建模型。完成后,点击确定按钮。

image-20240127184117351
image-20240127184117351

添加模型项

现在,按照以下步骤可以将项目添加到新模型中。

添加包

添加的第一项是包,UML中的包是一种分组构造,它允许我们将其他模型项组合到更高级别的单元(包)中。程序包最常见的用途是将类分组在一起,但是程序包也可以包含自由属性,自由操作甚至其他程序包。

Model Explorer视图中,右键单击模型项目以获取特定于该项目的弹出菜单,然后选择Add Package,在Property Editor视图中更改名字如下图:

image-20240127184129777
image-20240127184129777

添加类

接下来,向新包中添加一个类,因为只有类才能具有行为(即状态机)。

Model Explorer视图中,右键单击AOs以获取特定于该项目的弹出菜单,然后选择Add Class,在Property Editor视图中更改名字如下图:

image-20240127184132753
image-20240127184132753

添加时间事件

接下来添加时间事件属性,该属性将周期性触发“Blinky”状态机中的闪烁。

Model Explorer视图中,右键单击Blinky:QActive以获取特定于该项目的弹出菜单,然后选择Add Attribute,在Property Editor视图中更改配置如下图:

image-20240127184135420
image-20240127184135420

添加状态机

Model Explorer视图中,右键单击Blinky:QActive以获取特定于该项目的弹出菜单,然后选择Add State Machine,双击SM,如下图:

image-20240127184138326
image-20240127184138326

绘制状态机图

添加状态

在图工具箱中,单击状态工具,将鼠标移动到图表窗口,在其中放置状态形状的左上角。单击鼠标并将其拖动到状态形状的右下角,释放鼠标。举个例子如下:

image-20240127184141314
image-20240127184141314

Property Editor中,将状态名称更改为off,然后将entry添加到此状态BSP_ledOff();,添加第二个状态就变为onBSP_ledOn();。

添加初始转换状态

640
640

之后在Property Editor中添加

QTimeEvt_armX(&me->timeEvt, BSP_TICKS_PER_SEC/2, BSP_TICKS_PER_SEC/2);

添加转换状态

640 (1)
640 (1)

以与之前类似的方式,添加第二个过渡并将其触发器也更改为TIMEOUT,最终效果如下

image-20240127184222239
image-20240127184222239

生成代码

与基于状态机的大多数其他图形工具相比,QM将代码生成“颠倒”了,通过QM,可以确定生成的代码结构,目录名,文件名以及每个文件中包含的元素,也可以将自己的代码与生成的代码混合,并使用QM生成尽可能多或更少的整体代码。

添加目录

首先创建一个目录,该目录将确定磁盘上生成的文件相对于QM模型文件的位置。

Model Explorer视图中,右键单击模型项,然后在弹出菜单中选择Add directory,这是将在其中生成代码的目录。与QM模型文件的目录路径相关联的可以在属性编辑器中进行编辑,代码将在与模型相同的目录中生成。

image-20240127184225029
image-20240127184225029

添加文件

640 (2)
640 (2)

向目录添加源文件和头文件,这是我们的常规操作。

编辑文件及编译工程

在QM中,我们可以键入自己的代码以及代码生成指令,把下面一段代码复制到文件中。

#include "qpc.h"
#include 
#include  /* for exit() */
 
Q_DEFINE_THIS_FILE
 
enum { BSP_TICKS_PER_SEC = 100 };
 
void BSP_ledOff(void) {
    printf("LED OFF\n");
}
void BSP_ledOn(void) {
    printf("LED ON\n");
}
void Q_onAssert(char const * const module, int loc) {
    fprintf(stderr, "Assertion failed in %s:%d", module, loc);
    exit(-1);
}
void QF_onStartup(void) {}
void QF_onCleanup(void) {}
void QF_onClockTick(void) {
    QF_TICK_X(0U, (void *)0);  /* perform the QF clock tick processing */
}
 
enum BlinkySignals {
    TIMEOUT_SIG = Q_USER_SIG,
    MAX_SIG
};
 
/*============== ask QM to declare the Blinky class ================*/
$declare${AOs::Blinky}
 
static Blinky l_blinky;
QActive * const AO_Blinky = &l_blinky.super;
 
static void Blinky_ctor(void) {
    Blinky *me = (Blinky *)AO_Blinky;
    QActive_ctor(&me->super, Q_STATE_CAST(&Blinky_initial));
    QTimeEvt_ctorX(&me->timeEvt, &me->super, TIMEOUT_SIG, 0U);
}
 
int main() {
    /* statically allocate event queue buffer for the Blinky AO */
    static QEvt const *blinky_queueSto[10];
 
    QF_init(); /* initialize the framework */
 
    Blinky_ctor(); /* explicitly call the "constructor" */
    QACTIVE_START(AO_Blinky,
                  1U, /* priority */
                  blinky_queueSto, Q_DIM(blinky_queueSto),
                  (void *)0, 0U, /* no stack */
                  (QEvt *)0);    /* no initialization event */
    return QF_run(); /* run the QF application */
}
 
/*================ ask QM to define the Blinky class ================*/
$define${AOs::Blinky}

当然也可以像生成任何其他手写代码一样构建生成的代码,然后开始编译代码如下图所示。

640 (3)
640 (3)

下载调试工程

如果将blinky.c文件设计为在Windows或Linux之类的桌面操作系统上运行,则由于printf()语句,因此在开头编码了板级支持软件包(BSP)功能。这是如何在Windows命令提示符下生成blinky.exe可执行文件的方法:

640 (4)
640 (4)

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部