QP移植

  以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(教材,中英文官方都有下)

时间: 2024-12-20 01:06:27

QP移植的相关文章

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

---恢复内容开始--- 在上一期“Blinky for cortex-m0”中我们介绍了如何在QM中建立一个工程和生成代码,如何使生成的代码在我们的工程师运行起来,为此这一期要介绍如何将QP-NANO(qpn5.4.2)移植到CORTEX-M0中.移植前的准备工作:1.StateMachines板一块,使用其中的Systick滴答定时器2.下载工具一个(我们使用Jlink)3.下载官方qpn5.4.2代码  下面简单介绍下如何下载官方qpn5.4.2代码首先直接到QP官网http://www.

【Windows10 IoT开发系列】API 移植工具

原文:[Windows10 IoT开发系列]API 移植工具 Windows 10 IoT Core 中是否提供你的当前 Win32 应用程序或库所依赖的 API? 如果不提供,是否存在可使用的等效 API? 此工具可以为你回答这些问题,并协助你将你的当前 Win32 应用程序和库迁移到 Windows IoT Core. Windows 10 IoT 核心版 API 移植工具可在 ms-iot/iot-utilities github 存储库中找到.下载存储库 zip 并将 IoTAPIPor

LEDAPS1.3.0版本移植到windows平台----HuCsm云掩膜模块

这个是2012年左右放在百度空间的,谁知百度空间关闭...转移到博客园. 最近项目用到3.1.2版本的LEDAPS,新版本的使用情况会在后续文章中慢慢丰富. HuCsm是将LEDAPS项目中的TM/ETM+大气校正流程系列算法中的云掩膜模块由linux系统移植到windows下的产物,代码本身改动不大,使用接口不变. 包含文件: HuCsm.exe hd423m.dll hm423m.dll 编译程序需要包含的静态库有: gctp.lib hdfeos.lib hd423m.lib hm423m

学习者移植NES

http://blog.csdn.net/zerokkqq/article/details/52964249 http://bbs.eeworld.com.cn/thread-415692-1-1.html 上面这个是我移植参考他人的文件.手把手教你移植XXX,多牛逼. 作为承前启后的一件事,你要搞清楚接下来要做什么.别傻了,我们不可能知道之后每一个细节会怎样,所以这里的搞清楚也不是面面俱到,记得,不要总是急着一口气完成任务,之后我们的道路应该是一步一个脚印 1.我总是三分钟热度,希望这次不要断

基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九-2)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

基于tiny4412的Linux内核移植 -- PWM子系统学习(八)

作者信息 作者: 彭东林 邮箱:[email protected] QQ:405728433 平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4

Cocos移植到Android的一些问题-SQLite3数据库移植问题

首选我们讨论一下SQLite3数据库移植问题.我们在第14章节介绍了在Win32平台使用SQLite3数据库,我们介绍了两种配置环境的方法:一种是使用Cocos2d-x提供的SQLite3库配置,另一种是从SQLite官网下载源代码拷贝的工程中.第一种方法配置起来比较麻烦,关键是Cocos2d-x提供的SQLite3库只是Win32没有其它平台的,目录结构如下所示.<游戏工程目录>\cocos2d\external\sqlite3│  Android.mk│├─include│      sq

ARM板ok6410移植qt4.84+opencv2.4.9初步成功

先上图,有图有真相,当课题重新回归到嵌入式搭载的老问题上时,我还一度各种担心,发现最新的A9板4412能用Android了,还想着偷懒买块现成的只做最顶层开发就好,结果找遍工业相机厂家没见到有提供Android驱动的,一了解才明白,Android驱动是基于linux驱动的貌似,于是乎,又尝试着回归到移植opencv到嵌入式linux的老路上来. 想当初,零linux基础的我对着借来的6410各种被蹂躏,历时1个月仅仅是搭建了能用板子自带的qt4.7.1库编写界面程序而已.那次各种编译错误,各种零

1.将cocos2d-x项目移植到Linux环境下,将cocos2d-x项目移植到手机上

 1.将cocos2d-x相关的软件包拷贝到Linux下. 2 对上面的安装包进行解压 3 执行cocos2dx-2.2.3/install-deps-linux.sh(执行这个命令需要有网络) 4 安装QT,命令:sudoapt-get install qt-sdk 5 在cocos2dx-2.2.3目录下,执行./make-all-linux-project.sh 6 要让64位的linux能运行32位的adb,aapt工具,需要安装以下软件 sudo apt-get install g