• QP移植


      以STM32平台为例,该单片机的ARM Cortex-M系列内核正是被QP长期支持,所以QPARM Cortex-M系列内核上已经有长时间的应用验证。

      在配套书籍PSICC2中的例程为QP最原始的版本4.0.00(只有IAR例程,当然,可以修改汇编文件qk_port.s使适用于其他编译器),当前(2017/04/01)最新版本是5.8.2(直接支持gnuiararm的编译器),以下都是使用最新版本为例。(看过从4.0.005.8.2版本的Revision History,官方修复了不少bug)。

    qpc5.8.2文件夹与文件:

    qpc

    |     +-3rd_party        -与硬件相关,stm32f4stm32f7tmsmcu驱动程序,一般不需要移植,用我们以往常用的(包括CMSIS标准(ARM Cortex)、具体MCU型号相关的lib.c/.h

    |     +-source            -qp框架的源文件(src.c),直接复制移植

    |     +-include           -qp框架的头文件(src.h),直接复制移植

    |     +-ports              -存放着跟mcu内核、qp调度方式、编译器相关的接口函数,根据需要选择合适的文件夹

    |     |     +-arm7-9

    |     |     +-arm-cm    -例如选择我们公司常用的Cortex-M系列内核的MCU

    |     |     |     +-qk       -例如用抢占式qk内核的qp框架

    |     |     |     |     +-arm       -例如用keilARMCC编译器)建立工程

    |     |     |     |     +-iar

    |     |     |     |     +-...

    |     |     |     +-qv

    |     |     |     +-qxk

    |     |     +-msp430

    |     |     +-...

    |     +-examples  -官方例程:存放官方例程的应用层(状态机)、硬件抽象层(bsp.c),不需要移植,可以参考编写自己的程序。

    |     |     +-arm-cm  -Cortex-M系列MCU的例程

    |     |     |     +-game_efm32-slstk3401a -PSICC书籍讲述的飞行与射击游戏

    |     |     |     |     +-bsp.c  –硬件抽象函数,这个文件可以直接复制然后根据自己需求修改

    |     |     |     |     +-main.c –主函数,参考主函数建立自己的工程,包含qp框架初始化

    |     |     |     |     +-...    -参考其他状态机函数上手编写自己的状态机

    |     |     |     +-...其他功能例程

    |    |     +-...其他MCU例程

    移植完先尝试建立一个状态机,进行简单的状态切换、产生事件、事件派发、事件订阅/派发、事件处理、定时任务、延时任务等,可以测试出该框架有没有遗漏移植的文件。

    移植完成后使用中需要注意:

    1QS是非必要的,是一个调试器,打印信息需要占用一个串口。

    2Q_onAssert()是断言,在qp框架多处使用,也是用于辅助提示,当出现问题(例如队列溢出、内存池溢出、事件派发失败等)时断言会触发(官方例程是触发后进入while()循环,led闪烁,可以修改成我们需要的操作,例如打印错误信息),这个是调试中使用,产品上线需要关闭此功能。

    3qp框架的事件回收QF_gc()函数对事件回收时,不会清除事件对应事件内存块的内容,只是将该内存块的指针链接空闲块链表以便下次使用(全局的事件内存池,生存期是整个程序运行期),如果你创建的事件携带参数,但又并不是每次创建都对事件的参数完全重新填充,这样可能会造成垃圾数据重复使用。

    4QtimeEvt时间事件链表每一个时间事件唯一,例如发送一个时间事件A2s后处理任务B。如果2s未到达又想要创建一个时间事件A,此时会触发断言。可以修改QTimeEvt_armX()函数,常用有两种处理方式,以第一次创建的时间起点为准,以最后一次创建的为准。

    5、 用抢占式qk内核框架,如果高优先级的状态机存在处理时间较长、较频繁的任务,需要注意优先级低的状态机容易出现消息队列溢出、相应的事件内存池溢出,因为低优先级状态机被抢占,事件得不到响应。

    6、 看PSICC2书上提到的需要避免的错误

    7、 欢迎补充...

    三、学习资料与附件

    1、官网主页、下载页:https://state-machine.com/(完全开源,官方提供的资料相当完整)

    2、官方Revision Historyhttp://www.state-machine.com/qpc/blinky.html

    3http://www.cnblogs.com/hyper99/archive/2015/11/01/QP-zhiQF-yuan-li.html

    4AN_ARM-Cortex-M_Interrupt-Priorities.pdf(中断优先级!)、PSiCC2-CN.pdf(教材,中英文官方都有下)

  • 相关阅读:
    设计模式复习笔记08
    Docker Dockerfile 指令详解与实战案例
    Docker数据管理与挂载管理
    Docker简介与安装
    Xshell如何配置并远程连接Linux服务器详解
    如何VMware创建Linux虚拟机并设置虚拟机网络
    自动化运维工具Ansible之LNMP实践环境部署
    自动化运维工具Ansible之Roles角色详解
    自动化运维工具Ansible之Tests测验详解
    Ansible Jinja2 模板使用
  • 原文地址:https://www.cnblogs.com/Pual623548198/p/7053459.html
Copyright © 2020-2023  润新知