打印

事件驱动系统QP学习笔记

[复制链接]
8040|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
原来在21ic上看到两个系统。一个是农民运动讲习所的,一个是凤舞天的实用单片机系统(MS3.20)。两个人还争论了一番。
我对两个人的系统还是不太满意,直到最后找到了这个 Practical UML Statecharts in C/C++, Second Edition: Event-Driven Programming for Embedded Systems。
因为他都是按照各种标准写的,例如UML的标准,MISA汽车标准,所以我决定学习这个。
QPC的简介:下面的英文就几句话,很牛,可以放到单片机上
QP/C is a very lightweight, open source, state machine work for modeling and coding UML state machines in C. Designed for real-time embedded systems, the QP/C work does everything you can expect from an RTOS, only more efficiently, plus many things an RTOS can't do at all.
The QP/C work is supported by the free graphical UML tool called QM (QP Modeler). QM provides intuitive diagramming environment and generates compact C code. QM is available for Windows and Linux.
QP/C consists of a universal UML-compliant event processor (QEP), a higly portable event-driven work (QF), and a tiny preemptive kernel (QK). Current versions of QP include: QP/C and QP/C++, which require about 4KB of code space (ROM) and a few hundred bytes of RAM, and the ultra-lightweight QP-nano, which requires only 1-2KB of ROM and just several bytes of RAM.




第一节: 如何安装
1.1 下载QPC
http://www.state-machine.com/downloads/index.php#QP
我下的是4.01的版本,安装到 C\QP,系统是win7/32
1.2 下载open-watcom-c-win32-1.9编译器
原来的书上使用TC++1.01编译的,可是下载的4.01代码是watcom编译的。原因是TC后来又不让免费用了,所以后来用了不要钱watcom。
安装到C:\tools\WATCOM。
这么安装的原因是:C:\QP\qpc\examples\80x86\dos\watcom\l\game下的make.bat文件中有
if "%WATCOM%"=="" set WATCOM=c:\tools\WATCOM
1.3 下载UltaEdit
我是不想在dos下编的,所以使用了UltraEdit的Dos命令菜单。
编译,成功了。
1.4 make.bat中的命令学习
好古老呀
1.4.1 echo off的含义
DOS在运行批处理时,会依次执行批处理中的每条命令,并且会在显示器上显示,如果你不想让它们显示,可以加一个“echo off”。当然,“echo off”也是命令,它本身也会显示,如果连这条也不显示,就在前面加个“@”。

相关帖子

沙发
snakeemail|  楼主 | 2012-7-1 18:34 | 只看该作者
本帖最后由 snakeemail 于 2012-7-1 18:35 编辑
#include "qp_port.h" 
#include "bsp.h"
#include "game.h"
问题1:上面的三个文件在C:\QP\qpc\include中,
可是main.c和make.bat都在C:\QP\qpc\examples\80x86\dos\watcom\l\game,
编译器是如何找到.h文件的呢? 似乎是使用windows的环境变量,让编译器知道位置,但是我在make.bat和环境变量中都没有找到?

使用特权

评论回复
板凳
漂亮阿姨| | 2012-7-2 20:41 | 只看该作者
关注

使用特权

评论回复
地板
snakeemail|  楼主 | 2012-7-2 22:50 | 只看该作者
本帖最后由 snakeemail 于 2012-7-2 22:58 编辑

第一章 学习笔记
typedef uint16_t QSignal;
typedef struct QEventTag {   
QSignal sig;                          /**< signal of the event instance */   
uint8_t poolId_;                      /**< pool ID (0 for static event) */   
uint8_t refCtr_;                                 /**< reference counter */
} QEvent;[att
achimg]114084[/attachimg]

新建位图图像.gif (174.6 KB )

新建位图图像.gif

使用特权

评论回复
5
snakeemail|  楼主 | 2012-7-2 23:00 | 只看该作者
本帖最后由 snakeemail 于 2012-7-8 11:45 编辑

第二章学习笔记
1 .VB实现的计算器,只能从它的网上下
2.一个实际状态机讲解

使用特权

评论回复
6
snakeemail|  楼主 | 2012-7-7 20:52 | 只看该作者
本帖最后由 snakeemail 于 2012-7-8 11:42 编辑

1.首先是初始化状态,在第1行的结尾,当前状态时s211
2.在第2行,输入事件G。按照UML状态图,首先s211状态试图处理该事件,结果s211没有描述如何处理,将事件G向上给到s21。s21知道怎么处理,s21触发状态转移,此时进入状态s1,s1初始化后进入s11,此时在s11状态等待
3.内部转移
在第3行,输入事件I,s11不能处理,s11上传事件I给s1,s1处理了时间I。
4.自转移
在第4行,s11收到事件A,,s1有一个靠A事件触发的自转移。s1发生自转移后,最后状态又回到s11.
5.状态机带扩展变量
5.1
在第5行,输入事件D,s11处理事件D,但是变量me->foo此时是0,s11就没有处理D想上报给s1。
s1事件发现me->foo是0,可以处理,s1将me->foo赋值为1。触发状态转移到s,s又转入s11。
5.2 在第6行,输入事件D,s11的guard条件满足,将me->foo赋值为0,状态转移到s1,然后又到s11.

7. 在第7行,输入事件C,最后状态转移到s211.8.在层次状态机中,同样的状态转移却会导致不同的退出动作
8.1
在第8行输入事件E,s211状态向上报,s状态处理该事件,最后状态为s11
8.2
在第9行输入事件E,s11向上报,s状态处理该事件,最后状态为s11

11.在内部状态转移时,演示guard条件。见11行和12行

使用特权

评论回复
7
camconli| | 2012-7-25 16:24 | 只看该作者
这个很早就有了,08年我就开始一直在用这个平台开发系统,对点阵界面开发特别方便

使用特权

评论回复
8
snakeemail|  楼主 | 2012-7-28 17:46 | 只看该作者
7# camconli 同志能否帮我补充一下,我刚学。中文版的书买了,看不大明白。后来打出第2版的英文来看。

使用特权

评论回复
9
snakeemail|  楼主 | 2012-7-28 17:48 | 只看该作者
本帖最后由 snakeemail 于 2012-7-28 19:44 编辑

一.QEP Event processor的主要特性
1.完全支持分层状态嵌套
2.HSM(分层状态机)需要600字节,而FSM(有限状态机)只需要120个字节
3.其它的好处不写了
二.QEP结构

typedef struct QEventTag {
    QSignal sig;                          /**< signal of the event instance */
    uint8_t poolId_;                      /**< pool ID (0 for static event) */
    uint8_t refCtr_;                                 /**< reference counter */
} QEvent;
typedef struct CalcEvtTag {
    QEvent super;                                    /* derives from QEvent */
    uint8_t key_code;                                    /* code of the key */
} CalcEvt;
新版本的QEvent结构和书上讲的不一样,优化过了。不过可以看出得到了一个新结构,带一个新扩展变量key_code.

4.4 分层状态处理函数

使用特权

评论回复
10
chenbb8| | 2012-8-14 16:42 | 只看该作者
不清楚为什么这么好的书,第二版没有翻译的:(

使用特权

评论回复
11
camconli| | 2012-8-15 08:53 | 只看该作者
7# camconli 同志能否帮我补充一下,我刚学。中文版的书买了,看不大明白。后来打出第2版的英文来看。
snakeemail 发表于 2012-7-28 17:46
中文的可能翻译问题导致你有些不太明白,看英文的好了,并且现在有第二版了
在实际应用中,对于控制系统,那你用官方的qm来画uml图,图画好基本上工作量就完成了60%了。
对于界面开发的话,也可以用qm来画图,但是对于有对话框弹出又消失的这种,由于qp不支持动态状态机,因此可以通过自己修改源码,主要修改qep的分发消息函数来实现自己需要的功能。

使用特权

评论回复
12
laosizhender| | 2014-7-3 00:14 | 只看该作者
好东西,可惜身边没有用的

使用特权

评论回复
13
dongshan| | 2014-7-4 21:46 | 只看该作者
laosizhender 发表于 2014-7-3 00:14
好东西,可惜身边没有用的

哈哈,我一个复杂的项目上用过。主控芯片是kinetis

使用特权

评论回复
14
laosizhender| | 2014-7-6 22:49 | 只看该作者
dongshan 发表于 2014-7-4 21:46
哈哈,我一个复杂的项目上用过。主控芯片是kinetis

这几天正在照着应用笔记弄,想先有个直观的认识;
请教一下,关于官方文档 Getting Started with QP_nano 中的环境变量设置问题;
文档中的图表如下:
Environment variable                Example setting (adjust to your system)
QPN                                       C:\qp\qpn
QTOOLS                                 C:\tools\qtools
PATH                                     …;%QTOOLS%\bin (append to the PATH)

我想问的是,假如我的QTOOLS安装在  D:\tools 下; 那么我的PATH应该如何设置?

D:\tools\qtools\bin      ??

使用特权

评论回复
15
dongshan| | 2014-7-9 07:46 | 只看该作者
laosizhender 发表于 2014-7-6 22:49
这几天正在照着应用笔记弄,想先有个直观的认识;
请教一下,关于官方文档 Getting Started with QP_nano ...

你这个问题与QP没有关系吧。
照你描述的看,就是那么操作。

使用特权

评论回复
16
yangwei820715| | 2015-9-1 12:38 | 只看该作者
大家好,我是大连宏海新能源有限公司的,现在需要一名精通QP/C++的工程师做一外包项目,钱不是问题,有意向的联系我。电话13962234576

使用特权

评论回复
17
shauew| | 2015-11-12 17:21 | 只看该作者
收藏

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:提供500W线性 交流电源。0~300VAC,45~500Hz 提供10KW,0-330V直流电源,具体见http://blog.21ic.com/user1/3639/archives/2012/88528.html

547

主题

1910

帖子

8

粉丝