日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QM法化简C语言程序,QM基础教程

發布時間:2024/10/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QM法化简C语言程序,QM基础教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

中文翻譯教程首發CSDN,轉載請標明出處:http://www.voidcn.com/article/p-qbuyghua-bpr.html

NOTE:本中文教程相對官方原版教程,刪減了Building Blinky on Windows/Linux 這章,讀者可以參考我的另外一篇博文《使用QM的外部工具功能編譯代碼》中gcc的例子,其次增加了Add Free Operation章

這個教程介紹了怎么使用QM建模,并實現一個簡單的、可以在嵌入式板子上閃爍一個LED的或者在桌面環境能夠下打印LED的狀態轉換的”Blinky”應用。

NOTE:這個教程是使用的是QP/C框架(version 5).在其它的QP框架下運行也是類似

Blinky on TivaC LaunchPad

Creating New Model

打開File->Model…菜單或者點擊在Edit Toolbar上的

按鈕。接下來將會打開New Model Dialog Box窗口:

New Model dialog

選擇model基于那個 QP framework type (“Frameworks” 面板)。這里可以選擇:qpc for QP/C?, qpcpp for QP/C++?, and qpn for QP-nano?。在這個教程中,你保留默認的qpc framewords type。

給model命名(“Name:” 框)。NOTE:.qm后綴名會自動添加。在這個教程中,重命名model為blinky。

選擇model文件存放的目錄(“Location:” 框)。你可以手動輸入目錄路徑,也可以點擊右側圖標選擇路徑。NOTE:model的路徑也是生成代碼的地方。所有成的目錄和文件都是相對于model文件目錄來說的。

點擊OK按鈕。

Adding Model Items

現在你可以開始添加items到一個新的model中。

Add a Package

第一個要添加的是Package。在UML中package是一個組結構,用于合并其他model items到一個higher-level單元。它一般用來將classes組合到一起,但package同樣可以持有free attributes,free operations,和其他的packages。

在 Model Explorer 窗口右擊blinky item,在彈出菜單中,選擇Add Package。

`

Add Package

在Property Editor窗口中修改package的名字為AOs(Active Objects),并選擇stereotype為components。

`

Package Properties

Add a Class

接下來添加一個class到新的package中,因為只有class可以擁有行為 (i.e.,State Machines).

在Model Explorer窗口下右擊AOs package并在彈出菜單中選擇Add Class

`

Add Class

在Property Editor窗口中修改class名字為Blinky,并且選擇superclass為qpc::QMActive.

Setting Superclass

NOTE:

在QM? 一個狀態機只可以和繼承QP state machine classes的class相關聯。所選擇的狀態機superclass決定狀態機實現策略.

Add a Time Event

通過添加一個Time Event,以便傳遞周期事件到目標的blinky狀態機中的blinking狀態。

在Model Explorer窗口下右擊Blinky類,并在彈出菜單中選擇Add Attribute

`

Adding Attribute

在Property Editor窗口中修改attribute的名字為timeEvt,類型為QTimeEvt,visibility選擇為private。

`

Attribute Properties

Add Free Operation (改動:新增)

增加一個Free Operation可以生成對應的普通函數,提供調用。

在Model Explorer窗口下右擊AOs Package

`

Add Free Operation

在Property Editor窗口中修改Operation的名字為Blinky_ctor,并選擇return type為void。添加如下代碼:

Blinky * const me = &l_blinky;

QMActive_ctor(&me->super, Q_STATE_CAST(&Blinky_initial));

QTimeEvt_ctorX(&me->timeEvt, &me->super, TIMEOUT_SIG, 0U);

`

Operation Properties

Note 1:

上面的代碼第二行的構造函數,應該和對應的類所選用的superclass一致

QMActive_ctor()對應qpc::QMActive

QActive_ctor()對應qpc::QActive

QMsm_ctor()對應qpc::QMsm

QHsm_ctor()對應qpc::QHsm

這幾個構造函數的參數都是一致的。

Note 2:

之所以使用Operation定義構造函數,而不是在對應的源文件中手動定義,其中一個原因可能是因為free Operation和class同在AOs下,修改class的superclass后,很容易就找到對應的構造函數進行修改。無需翻看源文件。

Add State Machine

在Model Explorer窗口下右擊Blinky類,并在彈出菜單中選擇Add Start Machine

`

Adding State Machine

Drawing State Machine Diagram

在Property Editor窗口中右擊SM狀態機,并在彈出菜單中選擇Show Diagram(顯示圖表)。另外你可以雙擊SM狀態機執行默認動作:Show Diagram

`

Show State Machine Diagram

Add States

在Diagram Toolbox 點擊選中state工具,移動鼠標(不用按下左鍵)到diagram窗口合適的地方,這里選擇左上角。注意到現在鼠標的形狀發生了變化(如下圖)。按下鼠標左鍵放置state形狀,然后鼠標右鍵不要放松,往右下角拖動改變大小。釋放鼠標。

`

Adding the off State

在Property Editor窗口中修改state的名字為off,并增加entry動作BSP_ledOff();到這個狀態。

使用類似的方法添加第二個state。在Property Editor窗口中修改state的名字為on,并增加entry動作BSP_ledOn();到這個狀態。

`

Setting Properties of State ‘off’

Add Initial Transition

在Diagram Toolbox 點擊選中initial transition工具。移動鼠標(不用按下左鍵)到diagram窗口合適的地方。注意到現在鼠標的形狀發生了變化(如下圖)。按下鼠標左鍵,并拖動它(長按左鍵)到state的邊緣。注意鼠標形狀變化在接觸到邊緣后。釋放鼠標。

`

Adding the Initial Transition

在Property Editor窗口中給Initial Transition 增加動作QTimeEvt_armX(&me->timeEvt, BSP_TICKS_PER_SEC/2, BSP_TICKS_PER_SEC/2);

Note

在Initial Transition的動作代碼為起始BSP_TICKS_PER_SEC/2次clock ticks,和其后每次BSP_TICKS_PER_SEC/2次clock ticks投遞time event。

Add Transitions

在Diagram Toolbox 點擊選中transition工具。移動鼠標(不用按下左鍵)到diagram窗口合適的地方。注意到現在鼠標的形狀發生了變化(如下圖)。按下鼠標左鍵,并拖動它(長按左鍵)到state的邊緣。注意鼠標形狀變化在接觸到邊緣后。釋放鼠標。

`

Adding a Transition

在Property Editor窗口中修改這個transition的trigger為TIMEOUT。

使用類似的方法添加第二個transition并改變它的trigger為TIMEOUT。

`

Complete State Machine

Generating Code

相比于其他的圖形化狀態機工具,QM? 讓生成代碼”上下顛倒(upside down)”了.QM? 讓你確定生成代碼的結構,目錄名,文件名和進入文件里的每個元素(看物理設計)。你可以混合你自己的代碼到生成代碼中,并使用QM生成你覺得合適的,盡可能多或者盡可能少的總代碼。

Add Directory

首先需要創建一個目錄,這個目錄的設置決定了生成代碼相對于

·

Adding a Directory

在Model Explorer窗口下右擊Blinky model項,并在彈出菜單中選擇Add Directory。這將會是代碼生成的目錄。目錄的路徑參考于QM Model File并可以在Property Editor中編輯。在directory中填入”.”符號,代表了生成的代碼使用和QM Model File相同的目錄。

Add File

在directory里可以添加Files。在實際的項目中,通常會將代碼分成頭文件和源文件,并使用獨立的源文件作為板級支持包(BSP)和mian()。但為了簡單起見,這個教程在會在下面的步驟中,將會將他們都放到一個文件里:blinky.c里:

Adding a File

在Model Explorer窗口下右擊directory項,并在彈出菜單中選擇Add File。在這個文件創建后,你可以在Property Editor里編輯它的名字為blinky.c

Edit File (改動:手工代碼,增加ctor函數的生成)

你需要為QP?每個file-template提供一個前體(body),在其中你可以輸入自己的代碼以及代碼生成指令。下面的代碼將會演示最重要的兩個指令 $declare(AOs::Blinky)用于生成Blinky class的聲明;$define(AOs::Blinky) 用于生成Blinky class的定義和$define(AOs::Blinky_ctor)用于生成對應的構造函數。

#include "qp_port.h"

#include

#include

#define BSP_TICKS_PER_SEC 100

void BSP_ledOff(void) {

printf("LED OFF\r\n");

}

void BSP_ledOn(void) {

printf("LED ON\r\n");

}

void Q_onAssert(char const Q_ROM * const Q_ROM_VAR file, int line) {

fprintf(stderr, "Assertion failed in %s, line %d", file, line);

exit(0);

}

void QF_onStartup(void) {}

void QF_onCleanup(void) {}

void QF_onClockTick(void) {

QF_TICK((void *)0);

}

enum BlinkySignals {

TIMEOUT_SIG = Q_USER_SIG,

MAX_SIG

};

/*************** ask QM to declare the Blinky class ******************/

$declare(AOs::Blinky)

static Blinky l_blinky;

QActive * const AO_Blinky = &l_blinky.super;

/*************** ask QM to define the Blinky_ctor operation *********/

$define(AOs::Blinky_ctor)

/*************** ask QM to define the Blinky class ******************/

$define(AOs::Blinky)

int main() {

static QEvt const *blinky_queueSto[10];

Blinky_ctor();

QF_init();

QActive_start(AO_Blinky, 1U,

blinky_queueSto, Q_DIM(blinky_queueSto),

(void *)0, 1024U, (QEvt *)0);

return QF_run();

}

`

Creating a Fully-Qualified Item Name by Drag-n-Drop

Opening blinky.c File and Pasting the Code

Generate Code

點擊工具條中的Generate Code按鍵,生成代碼。

Code Generation

這時QM已經在blinky.qm這個QM Model File相同的目錄下生成了代碼。可以使用一個代碼編輯器對代碼進行查看。

Building the Project (改動:刪除)

總結

以上是生活随笔為你收集整理的QM法化简C语言程序,QM基础教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 人妖被c到高潮欧美gay | 色就是色欧美色图 | 蜜桃久久一区二区三区 | 国产一区二区三区18 | 欧美黄色大片免费看 | 久久免费少妇高潮99精品 | 国产精品三级电影 | 欧美一本 | 中文字幕日韩av | www.精品国产| 免费簧片在线观看 | 伊人久久国产精品 | 欧美老女人性视频 | 国产资源在线播放 | 丰满大乳露双乳呻吟 | 亚洲一区二区免费看 | 日本在线不卡一区 | 国产视频一区二区三区在线播放 | 一区精品二区国产 | 黄频在线 | a级片一区二区 | 国产免费av网址 | 欧美熟妇另类久久久久久不卡 | 亚洲人成电影网 | 1024在线视频| 日本大乳奶做爰 | 日韩在线三区 | 成人在线免费高清视频 | 国精品无码一区二区三区 | 日韩porn | 亚洲成人中文字幕在线 | 91福利视频导航 | 91香焦视频 | 国产精品国产精品国产专区蜜臀ah | 婷婷亚洲综合五月天小说 | 久久一区二区精品 | 变态视屏| 综合久久五月 | jzzijzzij亚洲成熟少妇18 欧美www在线观看 | 日韩av福利 | 日本大尺度床戏揉捏胸 | 色欲av无码精品一区 | 久久久久人妻一区 | 99成人在线观看 | 91麻豆产精品久久久久久 | 小嫩女直喷白浆 | 久久久久久久伊人 | 亚洲自拍天堂 | 国产特黄毛片 | 亚洲精品成人区在线观看 | 日少妇视频 | 妺妺窝人体色WWW精品 | 一本黄色片| 性xxxxx大片免费视频 | 欧美激情免费看 | 毛片日本| 一级黄色在线播放 | 日本人妻不卡一区二区三区中文字幕 | 99re在线视频播放 | 国产一区二区三区四区精 | 欧美 日韩 人妻 高清 中文 | 一区二区三区在线 | 欧美激情在线观看 | 欧美日韩国产成人精品 | 国产成年无码久久久久毛片 | 日韩精品免费电影 | 黄色一级片在线播放 | 四虎看黄| 天天干网址 | 亚洲精品免费电影 | 国产精品国产三级国产aⅴ下载 | 国产污污在线观看 | 国产精品99无码一区二区 | 91插插插插插插插插 | 日韩av中文字幕在线播放 | 黄色成人毛片 | 日本一区二区免费看 | 国产在线导航 | juliaannxxxxx高清 黄页网站在线播放 | 成人深夜小视频 | 日韩欧美高清dvd碟片 | 亚洲天堂av片 | 精品一区二区三区视频在线观看 | 最新国产精品自拍 | 国产精品永久免费视频 | 亚洲精品久久久久久国产精华液 | 国产视频手机在线播放 | 久久亚洲精少妇毛片午夜无码 | 99热首页 | h亚洲| 国产精品91久久久 | 麻豆视频软件 | 4444亚洲人成无码网在线观看 | 天天爽天天爽夜夜爽毛片 | 国产精彩视频在线 | 国产伦精品一区二区三区高清版 | 超碰在线网址 | 男女无遮挡免费视频 | av大帝在线 |