量子编程详解之一: QP-nano代码大餐之状态机函数详细注释

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

先把内容贴上来再说,下一步接着来

这个是量子编程的学习心得的第一篇

先是qepn.c

格式还弄不好

研究好了重发一篇

 

/*****************************************************************************
* Product: QEP-nano implemenation
* Last Updated for Version: 4.1.05
* Date of the Last Update:  Oct 27, 2010
*
*                    Q u a n t u m     L e a P s
*                    ---------------------------
*                    innovating embedded systems
*
* Copyright (C) 2002-2010 Quantum Leaps, LLC. All rights reserved.
*
* This software may be distributed and modified under the terms of the GNU
* General Public License version 2 (GPL) as published by the Free Software
* Foundation and appearing in the file GPL.TXT included in the packaging of
* this file. Please note that GPL Section 2[b] requires that all works based
* on this software must also be made publicly available under the terms of
* the GPL ("Copyleft").
*
* Alternatively, this software may be distributed and modified under the
* terms of Quantum Leaps commercial licenses, which expressly supersede
* the GPL and are specifically designed for licensees interested in
* retaining the proprietary status of their code.
*
* Contact information:
* Quantum Leaps Web site:  http://www.quantum-leaps.com
* e-mail:                  info@quantum-leaps.com
*****************************************************************************/
#include "qpn_port.h"                                       /* QP-nano port */


#ifndef Q_NHSM
Q_DEFINE_THIS_MODULE(qepn)
#endif


/**
* \file
* \ingroup qepn qfn
* QEP-nano implementation.
*/


/** empty signal for internal use only */
#define QEP_EMPTY_SIG_        0


/** maximum depth of state nesting (including the top level), must be >= 2 */
#define QEP_MAX_NEST_DEPTH_   5


/*..........................................................................*/
/*lint -e970 -e971 */      /* ignore MISRA rules 13 and 14 in this function */
char const Q_ROM * Q_ROM_VAR QP_getVersion(void) {
    static char const Q_ROM Q_ROM_VAR version[] = {
        ((QP_VERSION >> 12) & 0xF) + '0',
        '.',
        ((QP_VERSION >>  8) & 0xF) + '0',
        '.',
        ((QP_VERSION >>  4) & 0xF) + '0',
        (QP_VERSION         & 0xF) + '0',
        '\0'
    };
    return version;
}


#ifndef Q_NFSM
/*..........................................................................*/
void QFsm_init(QFsm *me) {
    (void)(*me->state)(me);      /* execute the top-most initial transition */


    Q_SIG(me) = (QSignal)Q_ENTRY_SIG;
    (void)(*me->state)(me);                             /* enter the target */
}
/*..........................................................................*/
#ifndef QK_PREEMPTIVE
void QFsm_dispatch(QFsm *me) {
#else
void QFsm_dispatch(QFsm *me) Q_REENTRANT {
#endif
    QStateHandler s = me->state;


    if ((*s)(me) == Q_RET_TRAN) {                      /* transition taken? */
        Q_SIG(me) = (QSignal)Q_EXIT_SIG;
        (void)(*s)(me);                                  /* exit the source */


        Q_SIG(me) = (QSignal)Q_ENTRY_SIG;
        (void)(*me->state)(me);                         /* enter the target */
    }
}
#endif                                                            /* Q_NFSM */


#ifndef Q_NHSM
/*..........................................................................*/
QState QHsm_top(QHsm *me) {
    (void)me;             /* supress the "unused argument" compiler warning */
    return Q_IGNORED();                 /* the top state ignores all events */
}
/*..........................................................................*/
void QHsm_init(QHsm *me) {
    QStateHandler t;


/* 初始化状态机时必须转换到一个明确的状态 */
    Q_ALLEGE((*me->state)(me) == Q_RET_TRAN);/* initial tran. must be taken */


/*从顶层状态开始,执行递归的进入操作
* 此时me->state已经为初始化后的目标状态
*/


    t = (QStateHandler)&QHsm_top;         /* an HSM starts in the top state */
    do {                              /* drill into the target hierarchy... */
        QStateHandler path[QEP_MAX_NEST_DEPTH_];
        int8_t ip = (int8_t)0;


/*利用QEP_EMPTY_SIG_信号,从目标状态回溯到顶状态,
* QEP_EMPTY_SIG_信号除把状态转换到超状态,不做任何操作
* 保存回溯的路径到ip数组中,保存为逆序
* 即第一个数组元素为目标状态,上层状态其后
* 顶层状态并不包括在路径中
*/
        path[0] = me->state;
        Q_SIG(me) = (QSignal)QEP_EMPTY_SIG_;
        (void)(*me->state)(me);
        while (me->state != t) {
            ++ip;
            path[ip] = me->state;
            (void)(*me->state)(me);
        }


/* 回到目标状态 */
        me->state = path[0];


/* 确保深度在预定内 */
                                            /* entry path must not overflow */
        Q_ASSERT(ip < (int8_t)QEP_MAX_NEST_DEPTH_);


/* 从进入路径执行Q_ENTRY_SIG信号事件 */
        Q_SIG(me) = (QSignal)Q_ENTRY_SIG;
        do {        /* retrace the entry path in reverse (correct) order... */
            (void)(*path[ip])(me);                        /* enter path[ip] */
            --ip;
        } while (ip >= (int8_t)0);


/* 在目标状态上执行初始化 */
        t = path[0];
        Q_SIG(
QP: 一种替代前后台和RTOS的程序框架 QP(量子平台)是一个基于活动对象和层次式状态机的开源实时嵌入式框架(real-time embedded frameworks)和运行环境。一种优秀的可以代替前后台和RTOS的实时运行框架 阅读详情

相关推荐

QPnano代码解析

void QF_init(uint_fast8_t maxActive) { QActive *a; uint_fast8_t p; uint_fast8_t n; /** @pre the number of active objects must be in range */ Q_REQUIRE_ID(100, ((uint_fast8_t)1 < maxActive) && (maxActiv.

C_ROOKIES的专栏 1134

嵌入式框架QP_nano的51单片机移植与应用.pdf

嵌入式框架QP_nano的51单片机移植与应用.pdf

QM UML状态机建模实例之Blinky for cortex-m0

QP由QuantumLeaps公司开发异于传统顺序式系统(前后台架构即main+ISR)和传统多任务系统(操作系统)的事件驱动型状态机框架,实现了在C语言下的面向对象编程,该框架支持有限状态机FSM和层次式状态机HSM,对于开发者使用该框架的开发步骤如下: 1.理解整个项目需求 2.划分出具有行为的活动对象并且将系统的资源分配到各个活动对象中,降低对象间的耦合,整理出各个活动对象间的事件交换

燕雀窥鸿的博客 3653

QP-nano 是一种超轻量级的开源实时嵌入式框架 (RTEF),用于构建现代嵌入式 软件作为异步、事件驱动的活动对象系统

QP-nano 是一种超轻量级的开源实时嵌入式框架 (RTEF),用于构建现代嵌入式 软件作为异步、事件驱动的活动对象系统。

qpn:QP-nano实时嵌入式框架针对基于活动对象(角色)和分层状态机的嵌入式系统的RTOS

注意:如果您的公司有禁止产品中使用开放源代码的政策,则所有QP框架都可以进行,在这种情况下,您无需使用任何开放源代码许可证,也不会违反您的政策。 什么是新的? 注意QP-nano已停止积极的开发和支持,不建议用于新设计。 此QP-nano存储库是为现有用户群保留的。 文献资料 此特定版本的QP-nano的脱机HTML文档位于文件夹html /中。 要查看脱机文档,请在Web浏览器中打开文件html / index.html。 最新版本的QP-nano的在线HTML文档位于: : 关于QP-nano QP-nano(Quantum Platform Nano)是一种超轻量级的开源用于将现代嵌入式软件构建为异步的,事件驱动的(角色)系统。 框架是由 , 和框架组成的更大家族的成员,这些框架均受到严格的质量控制,详尽的文档记录和。 更安全的并发模型 框架系列基于 ( actor )设计模式,该模式固有地支持并自动实施以下并行编程最佳实践: 使数据隔离并绑定到活动对象的线程。 线程应该隐藏(封装)它们的私有数据和其他资源,并且不要与系统的其余部分共享它们。 通过事件对象在活动对象

56、QP-nano:极致精简的嵌入式开发框架

QP-nano是一款专为低端8位和16位微控制器设计的轻量级事件驱动嵌入式开发框架,具有极致精简的特性,适用于资源受限的嵌入式系统。它支持分层状态嵌套、多活动对象管理,并提供灵活的事件参数配置和低功耗架构。本文通过“Fly ‘n’ Shoot”游戏示例详细介绍了其核心功能和开发实现,并总结了其优势、应用场景及未来发展方向。

tech5的博客 389

QP-nano: 构建最小嵌入式应用程序的秘密

本文将深入探讨QP-nano框架如何实现极小的嵌入式系统应用。通过分析QP-nano的源代码结构、中断服务例程、活动对象的实现,以及如何构建针对特定硬件平台的应用程序,本文将揭示QP-nano背后的设计哲学和实现策略,为嵌入式系统开发者提供实用的见解。

weixin_29997223的博客 630

深入理解量子框架--QP RTOS V5.6.5

本文还有配套的精品资源,点击获取 简介:QP RTOS是一个高效、轻量级的实时操作系统,它为嵌入式系统开发提供了多个组件,包括QP/C、QP/C++、QP/nano、Qtools和QM。QP/C与QP/C++提供了事件驱动编程模型,QP/nano适合资源受限环境,Qtools和QM支持开发和调试。QP RTOS V5.6.5版本包含性能优化、内存管理、错误处理增强和对新硬件...

weixin_28895791的博客 954

软件追踪与QP-nano的微控制器应用

本章介绍了QP-nano,这是一个为低功耗8位和16位单片微控制器(MCU)设计的事件驱动基础设施,特别适用于需要占用空间小、成本敏感的应用场景。QP-nano具备层次状态机支持、确定性的线程安全事件队列、低功耗架构等特点,并能够与外部工具如MATLAB集成,实现复杂的数据过滤和压缩。通过软件追踪技术,开发者可以在实时环境中监控应用程序的行为,发现并记录系统中潜在的错误。

weixin_30415591的博客 388

QP框架在物联网终端中的降本秘籍:如何用2KB内存跑通传感器数据采集+无线通信

本文探讨了QP框架在物联网终端中的高效应用,特别是在2KB内存限制下实现传感器数据采集和无线通信的降本方案。通过事件驱动架构和层次式状态机的组合,QP-nano显著降低了内存占用和功耗,为资源受限设备提供了优化解决方案。

5b6n7m8的博客 409

QP-nano结构分析

QP-nanoQP的一个裁剪版本,是一个通用的、可移植的、超轻量级的事件驱动型框架。适用于像8051、PIC、AVR、MSP430、68HC01/11/12、R8C/Tiny等资源受限的8位和16位MCU。其一个QP-nano应用可以放入到只有100字节的RAM和2K字节ROM的系统中。 适用的应用范围是电机控制,照明控制,电容触摸,遥控、RFID、温度调节器、小家电控制、玩具、电源、电池充电...

weixin_30767921的博客 649

QP-nano:实现超轻量级事件驱动架构

本章深入探讨了QP-nano,一种专为低端8位和16位微控制器设计的超轻量级事件驱动基础设施。通过“飞行射击”游戏的QP-nano版本实例,展现了其关键特性,如事件队列的直接传递、固定大小的事件处理以及低功耗架构。同时,章节通过比较QP-nano与完整版QP的不同,强调了其在极端有限的RAM下所作出的适应性设计,例如不支持任意大小参数的事件和对固定大小事件的支持。本章还详细解释了QP-nano程序的结构,包括QP-nano端口的定义、活动对象控制块的配置以及应用程序启动过程。

weixin_36369848的博客 776

量子框架--QP RTOS V5.6.5

量子框架--QP RTOS 包括QP/C, QP/C++, QP/nano, Qtools, QM

QP 事件

所谓的事件 可以简单的理解就是消息。 一般写程序的都会用上消息队列,这个就是异步处理,因为MCU实际就一个核心,一般都是循环的程序。 主要主频快,轮询处理的速度快,就可以满足大部分的程序设计要求,目前看了很多的状态机,或者单片机都是这么干。 所以消息队列是很重要的一个功能。 在QPn中和传统的用法差不多,直接发送消息也就是数据到 缓冲中,比如按下 消息为0x0a,外部触发硬件按下被单片机检查处理后发送消息0x0A到缓冲中。 在QPc中就稍微提升了一点,他其实发送的也是数据,但是这个数据是 消息的地

C_ROOKIES的专栏 1678

QP-nano内核:如何实现最小化实时系统

本文深入探讨了QP-nano实时框架中的内核机制,特别是“香草”内核与抢占式QK-nano内核的实现与区别。文章详细解析了QP-nano中中断处理、任务调度、空闲处理等关键概念,并提供了实际应用中的编程指导。

weixin_42309599的博客 847

56、QP-nano:极致精简的事件驱动框架解析

QP-nano 是一款专为低端 8 位和 16 位微控制器设计的超轻量级事件驱动框架,以极小的资源占用提供高效的事件处理能力。本文详细解析了 QP-nano 的核心特性、在“Fly ‘n’ Shoot”游戏中的实现方式,并与完整版 QP 进行了对比,突出了其在资源受限环境下的独特优势。通过具体示例和配置说明,展示了 QP-nano 在嵌入式系统开发中的应用方法和适用场景。

butter的博客 225

58、QP-nano 技术详解:从代码结构到状态机实现

本文详细解析了 QP-nano 实时框架的核心特性与实现机制,涵盖其代码结构、中断锁定策略、状态机实现、活动对象管理以及系统时钟滴答处理等内容。QP-nano 是一个轻量级的嵌入式实时框架,适用于多种硬件平台,支持分层状态机、事件驱动模型以及多任务调度。文章还提供了应用建议、开发流程、性能优化方案以及常见问题解答,帮助开发者更好地理解和使用 QP-nano 进行高效嵌入式系统开发。

butter的博客 208

深入理解QP-nano内核与抢占式调度

本文深入探讨了QP-nano内核的微小尺寸和抢占式调度机制。从头文件定义到函数实现,从优先级管理到中断处理,详细解析了QP-nano的核心特点和工作机制。特别强调了QP-nano在嵌入式系统中的应用,以及如何通过宏定义和函数调用来优化性能。

weixin_35094083的博客 397
下一篇: IEC62439PRP滑动下拉窗口丢包算法详解
lyqdy1
博客等级 码龄18年 6粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值