QP状态机学习④——新版本QP注意点

无法运行的情况

今天按照之前的日志重新使用后发现出现无法启动的问题,观察后发现新版本的QP有了一些变化,略做记录

  • 滴答定时器中断发现无法进入

断点位置
当断点指向此处发现无法进中断,通过调查发现是新版本的会自动关闭中断有点类似操作系统的临界段的操作可能是为了防止出现中断嵌套的问题。
通过修改对应的Idle的钩子函数解决

void QV_onIdle(void) {
    // 可选:省电、LED 闪烁、空转处理等
    QF_INT_ENABLE();  // 必须允许中断
} 
  • 一直上报警告说NORETURN

将对应的错误函数进行修改之后解决

Q_NORETURN Q_onError(char const *module, int id) {
    (void)module;
    (void)id;

    // 可以闪灯、打印信息等

    // 必须死循环,不能 return
    QF_INT_DISABLE();
    for (;;) {
    }
}

其他并没有特别多的修改,现在将对应于QM的代码贴出。具体修改根据具体情况来

#include "qpc.h"
#include <main.h>
#include <stdio.h>
#include <stdlib.h> /* for exit() */

Q_DEFINE_THIS_FILE

extern void Board_Init(void) ;

enum { BSP_TICKS_PER_SEC = 1000 };

void BSP_LedOff(void) {
    // 添加操作代码
    printf("LED OFF\n");
}
void BSP_LedOn(void) {
    // 添加操作代码
    printf("LED ON\n");
}
Q_NORETURN Q_onError(char const *module, int id) {
    (void)module;
    (void)id;

    // 可以闪灯、打印信息等

    // 必须死循环,不能 return
    QF_INT_DISABLE();
    for (;;) {
    }
}

void QF_onStartup(void) {
    Board_Init();
     // NVIC_SetPriority(SysTick_IRQn, 0, 1); // 设置中断优先级
}
void QF_onCleanup(void) {}
void QF_onClockTick(void) {
    QF_TICK_X(0U, (void *)0);  /* perform the QF clock tick processing */
}
void QV_onIdle(void) {
    // 可选:省电、LED 闪烁、空转处理等
    QF_INT_ENABLE();  // 必须允许中断
}

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 StateMachine_Start() {
    /* 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}

对应的Board_Init就是如下初始化代码

void Board_Init(void)
{
	HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();

}
posted @ 2025-11-28 13:51  lzc56  阅读(1)  评论(0)    收藏  举报  来源