qp官网下载qpc,移植到stm32f103单片机,在正点原子战舰V3开发板上实验成功
qp搭建步骤重要提示:
#define RED_QUEUE_LEN 3
#define BLUE_QUEUE_LEN 3
#define TACKER_EVENT_POOL_LEN (RED_QUEUE_LEN + BLUE_QUEUE_LEN)
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]; //订阅列表
typedef struct LedEvtTag LedEvt; //定义事件结构
struct LedEvtTag{
QEvt super_;
uint16_t uiParaH;
uint16_t uiParaL;
};
//定义信号枚举
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
};
void PublishLedEvt(uint16_t uiSig, uint16_t uiParaH, uint16_t uiParaL) //发布事件函数
{
LedEvt* peTacker;
peTacker = Q_NEW(LedEvt, uiSig);
peTacker->uiParaH = uiParaH;
peTacker->uiParaL = uiParaL;
QF_publish_((QEvt*)peTacker);
}
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);
///////////////////////////////////////////////////
typedef struct RedActiveTag RedActive; //构建一个活动对象活动类型
struct RedActiveTag{
QActive super_;
volatile uint16_t RedLedStateNow;
uint16_t a;
uint16_t b;
};
extern RedActive RedLed;
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, (QEvt const *)0); //创立活动对象的线程并提醒 QF 开始管理活动对象
}
void RedLed_Ctor(RedActive* me)
{
QActive_ctor(&me;->super_, (QStateHandler)RedLed_Initial); //初始化状态机基础类(成员 super)
me->RedLedStateNow = 0;
}
2021-12-12 21:43:39
3.97MB
qp
stm32
1