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

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

qpc5.8.2文件夹与文件:

qpc\

|     +-3rd_party\        -与硬件相关,stm32f4、stm32f7、tms等mcu驱动程序,一般不需要移植,用我们以往常用的(包括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\       -例如用keil(ARMCC编译器)建立工程

|     |     |     |     +-iar\

|     |     |     |     +-...\

|     |     |     +-qv\

|     |     |     +-qxk\

|     |     +-msp430\

|     |     +-...\

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

7、 欢迎补充...

三、学习资料与附件

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

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

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

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

QP移植的更多相关文章

  1. QM UML状态机建模实例之移植 cortex-m0

    ---恢复内容开始--- 在上一期“Blinky for cortex-m0”中我们介绍了如何在QM中建立一个工程和生成代码,如何使生成的代码在我们的工程师运行起来,为此这一期要介绍如何将QP-NAN ...

  2. 基于STM32的uCGUI移植和优化

    基于STM32的uCGUI移植和优化 首先在开始这个说明之前,要简要说明下具体的环境: 编译工具:MDK4.20 开发板:安富莱v2版开发板 调试器:JLink  v8盗版 移植篇 相信大家有移植经验 ...

  3. MVVM框架从WPF移植到UWP遇到的问题和解决方法

    MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...

  4. IIC驱动移植在linux3.14.78上的实现和在linux2.6.29上实现对比(deep dive)

    首先说明下为什么写这篇文章,网上有许多博客也是介绍I2C驱动在linux上移植的实现,但是笔者认为他们相当一部分没有分清所写的驱动时的驱动模型,是基于device tree, 还是基于传统的Platf ...

  5. Linux主机上使用交叉编译移植u-boot到树莓派

    0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...

  6. STM32F429 LCD程序移植

    STM32F429自带LCD驱动器,这一具有功能给我等纠结于屏幕驱动的程序员带来了很大的福音.有经验的读者一定有过这样的经历,用FSMC驱动带由控制器的屏幕时候,一旦驱动芯片更换,则需要重新针对此驱动 ...

  7. 将MPM雪模拟移植到Maya

    同事实现了一个迪士尼的MPM雪模拟论文,我将其移植到Maya中 论文题目是 A material point method for snow simulation 代码在这里: https://git ...

  8. ucos实时操作系统学习笔记——操作系统在STM32的移植

    使用ucos实时操作系统是在上学的时候,导师科研项目中.那时候就是网上找到操作系统移植教程以及应用教程依葫芦画瓢,功能实现也就罢了,没有很深入的去研究过这个东西.后来工作了,闲来无聊就研究了一下这个只 ...

  9. DM9000驱动移植在mini2440(linux2.6.29)和FS4412(linux3.14.78)上的实现(deep dive)篇一

    关于dm9000的驱动移植分为两篇,第一篇在mini2440上实现,基于linux2.6.29,也成功在在6410上移植了一遍,和2440非常类似,第二篇在fs4412(Cortex A9)上实现,基 ...

随机推荐

  1. hdu2577 dp

    也可以字符串搞.dp思路还是很清晰的.dp[][0]表示未锁定,dp[][1]表示锁定键. #include<stdio.h> #include<string.h> #defi ...

  2. Nacos 发布 1.0.0 GA 版本,可大规模投入到生产环境

    经过 3 个 RC 版本的社区体验之后,Nacos 正式发布 1.0.0 GA 版本,在架构.功能和 API 设计上进行了全方位的重构和升级. 1.0.0 版本的发布标志着 Nacos 已经可以大规模 ...

  3. android 数据存储----android短信发送器之文件的读写(手机+SD卡)

    本文实践知识点有有三: 1.布局文件,android布局有相对布局,线性布局,绝对布局,表格布局,标签布局等.各个布局能够嵌套的.本文的布局文件就是线性布局的嵌套 <LinearLayout x ...

  4. Xcode编译报错:< Apple Mach-O Linker Warning > clang: error: no such file or directory: 'xxxx'

    Xcode编译报错概述: clang: error: no such file or directory: 'CoreGraphics' 一般原因是链接库内容导入丢失,这种的排查下target - B ...

  5. Android 在图片的指定位置添加标记

    这些天,项目里加了一个功能效果,场景是: 假如有一个家居图片,图片里,有各样的家居用品: 桌子,毛巾,花瓶等等,需要在指定的商品处添加标记,方便用户直接看到商品,点击该标记,可以进入到商品详情页 .实 ...

  6. behavior planning——15.cost function design weightTweaking

    Designing cost functions is difficult and getting them all to cooperate to produce reasionable vehic ...

  7. poj 2442 Sequence (Priority Queue)

    2442 -- Sequence 真郁闷,明明方法是对的,为什么我的代码老是那么的慢._(:з」∠)_ 这题要想考虑两列的情况,然后逐列拓展. 代码如下: #include <cstdio> ...

  8. html选择题

    1.下面关于css样式和html样式的不同之处说法正确的是(A) A.html样式只影响应用它的文本和使用所选html样式创建的文本 B.css样式只可以设置文字字体样式        不仅仅能够设置 ...

  9. JavaScript中判断整数的方法

    一.使用取余运算符判断 任何整数都会被1整除,即余数是0.利用这个规则来判断是否是整数. 1 2 3 4 5 function isInteger(obj) {     return obj%1 == ...

  10. 2019-10-30-C#-dotnet-core-局域网组播方法

    title author date CreateTime categories C# dotnet core 局域网组播方法 lindexi 2019-10-30 9:0:48 +0800 2019- ...