本资源包包含了STM32微控制器上QMosaic有限状态机框架的移植代码和示例程序,适用于嵌入式系统开发人员进行高效的状态机设计。
为了在STM32F103单片机上使用正点原子战舰V3开发板成功移植QP(QP框架),需要按照以下步骤搭建:
定义队列长度:
```cpp
#define RED_QUEUE_LEN 3
#define BLUE_QUEUE_LEN 3
```
事件池大小为红色和蓝色队列的总和:
```cpp
#define TACKER_EVENT_POOL_LEN (RED_QUEUE_LEN + BLUE_QUEUE_LEN)
```
声明静态变量用于存储队列和事件池:
```cpp
static QEvt const * l_redQueueSto[RED_QUEUE_LEN]; // 红色事件队列
static QEvt const * l_blueQueueSto[BLUE_QUEUE_LEN]; // 蓝色事件队列
// 事件池,包含所有可能的信号和状态信息
static LedEvt LedEvtPoolSto[TACKER_EVENT_POOL_LEN];
// 订阅列表初始化
static QSubscrList SubSrcSto[MAX_PUB_SIG];
```
定义Led信号枚举:
```cpp
enum LedSignals{
START_SIG = Q_USER_SIG,
KEY0_SIG,
KEY1_SIG,
KEY2_SIG,
KEYUP_SIG,
ALL_OFF_SIG,
ONLY_BULE_SIG,
ONLY_RED_SIG,
ALL_ON_SIG,
MAX_PUB_SIG
};
```
定义Led事件结构:
```cpp
typedef struct LedEvtTag{
QEvt super_; // 超类指针,用于继承自QF框架中的基础类型
uint16_t uiParaH;
uint16_t uiParaL;
}LedEvt;
// 发布信号的函数
void PublishLedEvt(uint16_t uiSig, uint16_t uiParaH, uint16_t uiParaL)
{
LedEvt* peTacker = Q_NEW(LedEvt, uiSig);
peTacker->uiParaH = uiParaH;
peTacker->uiParaL = uiParaL;
QF_publish((QEvt*)peTacker); // 发布事件到QP框架
}
```
初始化步骤:
```cpp
// 初始化时间管理器、活动对象查找表和优先级集合
QF_init();
// 为订阅列表初始化内存池
QF_psInit(SubSrcSto, Q_DIM(SubSrcSto));
// 初始化事件池内存分配
QF_poolInit(LedEvtPoolSto,sizeof(LedEvtPoolSto),sizeof(LedEvtPoolSto[0]));
RedLed_Start(uiPrio++, l_redQueueSto, Q_DIM(l_redQueueSto), 0, 0); // 创建红色活动对象
BlueLed_Start(uiPrio++, l_blueQueueSto, Q_DIM(l_blueQueueSto), 0, 0);
```
定义红色LED的活动类型:
```cpp
typedef struct RedActiveTag{
QActive super_;
volatile uint16_t RedLedStateNow; // 红色LED当前状态
uint16_t a;
uint16_t b;
}RedActive;
extern RedActive RedLed; // 外部声明
// 初始化红色活动对象的实例化函数
void RedLed_Start(uint_fast8_t prio, QEvt const *qSto[], uint_fast16_t qLen, void *stkSto, uint_fast16_t stkSize)
{
RedLed_Ctor(&RedLed);
// 创建一个线程并开始管理活动对象
QActive_start((QActive*)&RedLed;, prio, qSto, qLen, stkSto, stkSize);
}
// 初始化红色LED的状态机基础类和初始状态
void RedLed_Ctor(RedActive* me)
{
QActive_ctor(&me->super_, (QStateHandler)RedLed_Initial);
// 设置当前状态为0,具体实现可以根据需要调整
me->RedLedStateNow = 0;
}
```
以上步骤确保了QP框架在STM32F103单片机上的正确初始化和事件发布。