以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. 中文乱码在java中URLEncoder.encode方法要调用两次解决

    中文乱码在java中URLEncoder.encode方法要调用两次解决 一.场景: 1.我在客户端要通过get方式调用服务器端的url,将中文参数做utf-8编码,需要在js中两次的进行编码,服务器 ...

  2. 正则表达式问题:如何理解/href\s*=\s*(?:"(?<1>[^"]*)"|(?<1>\S+))/(转载)

    ms-help://MS.VSCC/MS.MSDNVS.2052/jscript7/html/jsjsgrpregexpsyntax.htm 该文虽有解释, 但没有样例,对我这样的初学者来说很难理解 ...

  3. 基于Tablestore Tunnel的数据复制实战

    前言 数据复制主要指通过互联的网络在多台机器上保存相同数据的副本,通过数据复制方案,人们通常希望达到以下目的:1)使数据在地理位置上更接近用户,进而降低访问延迟:2)当部分组件出现故障时,系统依旧可以 ...

  4. 【NS2】NS2中802.11代码深入理解—packet传输的流程(转载)

    如何传送一个封包(How to transmit a packet?)首先,我们要看的第一个function是在mac-802_11.cc内的recv( ),程式会先判断目前呼叫recv( )这个pa ...

  5. [React Native]访问操作系统剪贴板 Clipboard

    我们之前学习了TextInput组件, 有时候我们需要在TextInput组件中复制或者粘贴一些文字. React Native为开发者提供了 Clipboard API,Clipboard 组件可以 ...

  6. Flask学习之三 web表单

    本部分Miguel Grinberg教程的翻译地址:http://www.pythondoc.com/flask-mega-tutorial/webforms.html 开源中国的:http://ww ...

  7. @noi.ac - 488@ cleaner

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 小Q计划在自己的新家中购置一台圆形的扫地机器人.小Q的家中有一个 ...

  8. poj 3384 Feng Shui (Half Plane Intersection)

    3384 -- Feng Shui 构造半平面交,然后求凸包上最远点对. 这题的题意是给出一个凸多边形区域,要求在其中放置两个半径为r的圆(不能超出凸多边形区域),要求求出两个圆心,使得多边形中没有被 ...

  9. get和post的区别?

    GET:一般用于信息获取,使用URL传递参数,对所发送信息的数量也有限制,一般在2000个字符 POST:一般用于 修改服务器上的资源,对所发送的信息没有限制. GET方式需要使用Request.Qu ...

  10. HBuider快捷键

    朋友推荐用Hbuilder编辑器,看了下Hbuilder官网和那视频,感觉牛逼哄哄的, 自己也就体验了一下,打开Hbuilder的快捷键列表,每个快捷键都体验了一下,以下展示出来的,每一个都是精华,每 ...