E-WALKER 发表于 2014-2-6 18:21:51

RAW OS 基于STM32F4 实现QP!

在公司这一个人闷了7天后,今天终于见到活人了,比较开心,所以出去逛了4个小时

此次目标,两军会师,将QP移植到RAW OS上。

流程安排:


移植官网DEMO:
先在RAW OS 官网下载事件触发系统。
该工程与RAW OS 文件有关的如下,(UART不算),我们需要移植的只是bomb.c & .h。



移植到我们的工程后,注意2点
1:systick中断服务程序增加 idle_tick_isr();函数
2:以idle_run();开始RAW OS.

其他的就是一些小改动了,读者自己研究研究可以解决的 :)

bomb中的函数
static RAW_U16 Bomb4_initial(Bomb4 *me, STATE_EVENT*e) {
    (void)e;
    me->timeout = INIT_TIMEOUT;
    return STM_TRAN(&Bomb4_timing);
}

我为了方便测试,让状态机首先进入的是timing状态。


OK,状态机首先进入了STM_ENTRY,但这并不能证明状态机成功运行了,只能证明程序移植的没有错误。
所以,接下来的一幕告诉我,嗯,可行。


进入了STM_TIMEOUT :)


对比QP代码与RAW状态机代码的不同:
根据我之前研究QP的经验,有两个东西是非常重要的:
1.状态机的注册
2.事件的注册
QP中状态机的注册用的是                QActive_ctor
而根据事件的不同,注册事件的函数也有所不同,比如时间触发的事件注册函数为QTimeEvt_ctorX
可以发现与状态机注册对应的函数是FSM_CONSTRUCTOR。
现在就只有一个问题了,事件注册函数是?
楼主琢磨了有一个多小时,得出答案:不需要为事件注册。


修改至可运行代码:这个整整折腾一个多小时,我们要做的就是欺骗QM编译出来的代码:对它说:我们这个其实是QP,不是RAW OS


比较关键的定义
#define QEvt STATE_EVENT
#define QState   RAW_U16
#define QActive ACTIVE_EVENT_STRUCT
#define Q_TRAN   STM_TRAN
#define Q_ENTRY_SIG STM_ENTRY_SIG




这张图片用于证明在RAW OS 成功跑起QM代码,代码由QM生成,不需要任何修改即可在RAW OS运行(只要花上几个小时移植)



E-WALKER 发表于 2014-2-6 18:25:36

目前只是实现其功能,而具体到一些细节,肯定还有很多要磨合的地方,如果有值得注意的地方,楼主会在就与该地方,于坛子发出帖子阐述经验.

vcgood 发表于 2014-2-7 16:09:50

太好了,那开始学习raw-os了的。

lulu爱 发表于 2014-2-7 18:23:42

qm工具固然是很方便的,不过代码也是很直观的,基本画出uml状态机图,后面就是很机械的套路了。
页: [1]
查看完整版本: RAW OS 基于STM32F4 实现QP!