步驟1:什么是有限狀態(tài)機?
一個有限狀態(tài)機(簡稱FSM)是一臺機器(以抽象的方式)具有定義的有限數(shù)量的可能狀態(tài),一次只能激活一個狀態(tài)。狀態(tài)通過轉換連接。這些過渡有一個確定的方向,只能朝這個方向通過-可以將其視為一條單向街道。此外,過渡具有某些輸入和輸出。您可以將其視為要使用單向街道之前必須滿足的條件,并且在使用單向街道時會向外界發(fā)出信號–例如,您必須先付費才能使用使用街道,然后計算您的汽車。
在許多房屋中都發(fā)現(xiàn)了一個非?;镜腇SM示例:按一下按鈕即可激活樓梯間的燈。一定時間后,指示燈會自動關閉。您可以將此模型建模為具有兩種狀態(tài)的FSM:“亮”和“滅”。從一種狀態(tài)過渡到另一種狀態(tài),反之亦然,條件是在一個方向上按下按鈕,而在另一方向上經(jīng)過了一定的時間。我們可以在圖表(即狀態(tài)圖)中對此行為進行建模??匆幌聢D片1。
黑色實心圓圈標記著狀態(tài)機的入口點(一切都必須從某處開始)。因此,如果我們的機器開始運行,則指示燈熄滅。一直這樣,直到我們使用電燈開關–燈才亮起,并在30秒后熄滅。當指示燈已亮起時按按鈕不起作用,并且30秒鐘后指示燈熄滅。該FSM沒有任何輸出。從傳統(tǒng)的數(shù)學角度來看,“點亮”狀態(tài)與“打開”狀態(tài)等效,但是當我們真正開始對系統(tǒng)進行編程時,我們當然需要添加某種實際上可以完成某些工作的輸出,例如打開
此狀態(tài)機有效,但這是一個好的系統(tǒng)嗎? 30秒足夠長嗎?對于大多數(shù)人來說,可能是的,但是位于10樓的人們可能不喜歡我們的系統(tǒng)。他們可能需要30秒以上的時間,比方說他們需要40秒。但是他們需要等待30秒鐘過去,然后關閉燈以再次激活燈,然后他們可能在樓梯中間。因此,我們需要做的是允許在燈亮并且再次按下按鈕時重置計時器。為此,我們將需要對系統(tǒng)進行重新建模,將計時器的開始建模為轉換的輸出,并添加另一個轉換,如圖2所示。
在這里,您可以看到兩件事:
過渡完全可以進入到它來自的狀態(tài)
過渡可以有一個事件作為發(fā)生過渡的條件,例如以及分配的輸出。斜線左邊的信息是事件,右邊的信息是輸出。事件也被視為機器的輸入,這被稱為輸入-輸出-自動機。
步驟2:在Arduino上手動實現(xiàn)FSM
當我們想在Arduino上實現(xiàn)此行為時,代碼可能類似于以下要點。代碼沒有什么特別的,switch-case語句僅針對每種可能的狀態(tài)包含一個case,并在其中檢查是否滿足轉換條件。如果是這樣,狀態(tài)就會更改。
如您所見,代碼非常簡單。但是您能想象如果沒有2個州,而是10個或100個州,會發(fā)生什么情況?對于現(xiàn)實世界的FSM來說,這并不罕見。該代碼變得不可讀,并且可以達到數(shù)千行的長度。同樣,通常,我們希望以圖形方式計劃FSM,因為我們需要能夠盡快查看其實際功能。然后,我們仍然需要對實際的狀態(tài)機進行編碼,并且需要確保圖形設計和手寫代碼實際上可以完成相同的工作。這可能是一個巨大的問題。
考慮一下:對于我們的FSM所具有的每個狀態(tài),我們的代碼都需要一個“ case”語句,對于向其他狀態(tài)的每個轉換,我們都需要在其中包含一個if或case語句。如果我們有一個狀態(tài)機,每個狀態(tài)都可以到達其他每個狀態(tài)(最極端的情況),我們的代碼將以 n平方增長,其中 n 是狀態(tài)。因此,對于3個狀態(tài),我們將有3種情況,內部有3個ifs,因此代碼長度將與9成正比。當我們有10個狀態(tài)(不是很多)時,代碼長度將與100成正比,并且在20個州中,代碼已長四倍。該FSM的圖形表示將更容易掌握,并且如果我們不必處理所有這些switch case語句,那將很好。如果您熟悉描述模擬器原理圖的網(wǎng)表–我們也不想使用網(wǎng)表設計原理圖。那么,我們該怎么做呢?
步驟3:獲取YAKINDU Statechart工具
Yakindu SCT正是為此而設計的:對系統(tǒng)建模并從中生成代碼。建模工具比簡單的有限狀態(tài)機先進得多,因為它們基于Harel的狀態(tài)圖理論。它們通過一些其他概念擴展了常規(guī)自動機理論-例如,歷史狀態(tài),其中離開狀態(tài)圖可保存活動狀態(tài),因此您可以稍后再返回等等。對于‘Ible,我們將不需要這些額外的功能。
Yakindu SCT基于Eclipse(最常用的IDE之一)。因此,我們可以使用市場上所有的Eclipse插件,并擁有一個已知的環(huán)境。它是開源的,這意味著它是免費的!首先,請訪問statecharts.org,然后選擇“下載SCT”。您將需要輸入姓名,電子郵件地址和職業(yè)。下載該工具后,只需解壓縮它(右鍵單擊-》全部提取,或類似操作)。在里面,您會發(fā)現(xiàn)“ SCT”。啟動它。 (不,不需要真正的安裝。)
在安裝Yakindu SCT之后,您將具有對FSM進行建模的工具,但是我們將希望獲得在Arduino上運行的代碼。有一個出色的Eclipse插件可以做到這一點,您可以在http://www.baeyens.it/eclipse/上找到有關它的更多信息。它為您提供了Eclipse內部的完整Arduino工具鏈,因此您可以輕松使用Arduino IDE以及Eclipse的智能代碼管理和編碼助手。在SCT中,轉到幫助-》安裝新軟件。安裝向導打開。單擊向導右上角附近的添加。.. 按鈕。將打開一個對話框,要求您指定要從中安裝新軟件的更新存儲庫。在“名稱”字段中輸入一些文本。該文本原則上是任意的,但是您應該選擇一些使其更容易在其他更新存儲庫中標識此特定更新存儲庫的內容。輸入更新存儲庫的名稱和位置(http://eclipse.baeyens.it/update/V4/stable)之后,單擊“確定”。 Eclipse建立與更新存儲庫的網(wǎng)絡連接,向其詢問可用的軟件項,并在安裝向導中顯示它們。在這里,您只需接受“ Arduino”選項。再單擊幾次“下一步”并在以后接受許可協(xié)議,它將要求您重新啟動該工具。完成此操作后,插件將下載所有需要的庫,因此您無需從現(xiàn)有的Arduino項目復制它們。接下來,在Yakindu SCT安裝中安裝了Arduino工具?,F(xiàn)在是時候結合兩者的可能性了。
注意:如果您尚未安裝Windows,請同時安裝官方的Arduino IDE。它帶有必需的驅動程序。我不確定Mac上的情況。 Linux已經(jīng)包含驅動程序,因此不需要安裝Arduino IDE。
步驟4:開始創(chuàng)建狀態(tài)圖
我們現(xiàn)在將開始一起對狀態(tài)圖進行建模。首先,我們將創(chuàng)建一個新項目。您應該在SCT/Eclipse的歡迎頁面上。 轉到文件-》新建-》項目。.. ,然后在主菜單中選擇 Arduino-》新建Arduino Sketch 。將出現(xiàn)新Eclipse項目的常規(guī)向導。您必須給您的項目起一個名字。我們將其命名為ArduinoFSM。在下一個窗口中,您可以指定arduino連接到的端口。如果您不知道并且不知道如何查找,請忽略此?,F(xiàn)在,您可以單擊完成。
如果您改為選擇 New-》 Arduino Sketch ,則不會詢問您arduino的連接位置。然后,使用 Project-》 Properties 進行操作。如果您不知道如何確定Arduino的端口,此說明的最后一步將為您提供幫助。
如果在創(chuàng)建項目后未關閉歡迎屏幕,請關閉它您自己的,使用標簽中的X?,F(xiàn)在,您應該具有與左側“項目資源管理器”中的第一張圖片相似的圖片。
我們現(xiàn)在要創(chuàng)建一個名為“ model”的新文件夾。右鍵單擊您的項目,然后選擇新建-》文件夾。鍵入名稱,然后單擊“完成”。
右鍵單擊該新文件夾,再次轉到“新建”。根據(jù)您的安裝,您可能可以直接添加新的Statechart模型,或者可能必須使用Other,選擇Yakindu,然后選擇Statechart模型?,F(xiàn)在,您應該看到的是第二張圖片:一個進入狀態(tài)和一個名為 StateA 的通用第一狀態(tài)。
左側的文本框允許您聲明相關的事件和變量狀態(tài)圖,右邊的區(qū)域是圖形狀態(tài)圖編輯器。
我們將需要一個事件:按鈕。雙擊左側的文本框,然后在界面下插入文本
in event button
,然后聲明有一個名為“ button”的傳入事件。另外,在該文本框中雙擊單詞“ default”,并給狀態(tài)圖取一個更好的名稱-“ LightCtrl”怎么樣?現(xiàn)在,添加另一個狀態(tài):只需在右側面板中單擊 State ,然后在圖形狀態(tài)圖編輯器中的某個位置。雙擊這兩個州的名稱,并為其命名一個帶有黑色輸入狀態(tài)的名稱,熄滅,然后將新狀態(tài)點亮。現(xiàn)在,我們需要過渡:從面板中選擇過渡,單擊一個狀態(tài),保持并拖動到另一狀態(tài)。這應該構成過渡。它從您第一次單擊的狀態(tài)變?yōu)榈诙€狀態(tài)。通過單擊您現(xiàn)在拖動到第一個的狀態(tài)并拖動到另一個狀態(tài)來添加第二個過渡,這樣您就可以在兩個方向上進行過渡。現(xiàn)在,單擊過渡。將出現(xiàn)一個文本字段。在這里,您可以輸入要進行過渡的事件和輸出。在從關閉燈光到打開燈光的過渡上,鍵入按鈕,在另一個按鈕上,在5秒后鍵入 (比測試的30秒要快)?,F(xiàn)在,您應該擁有看起來像第三張圖片的東西!
現(xiàn)在就這些了。您有一個樓梯燈的工作模型!
步驟5:模擬狀態(tài)圖
Yakindu SCT的另一個不錯的功能是您可以模擬狀態(tài)圖而無需事先編寫任何代碼。您可以嘗試使用狀態(tài)機來實現(xiàn)您想要的狀態(tài)。
模擬狀態(tài)圖非常簡單。右鍵單擊Eclipse/SCT中的.sct文件,選擇運行方式,然后選擇狀態(tài)圖模擬。
將打開一個新透視圖。您應該能夠看到第一個狀態(tài)是紅色,這是活動狀態(tài)。 (看圖片)在右邊,應該打開了Simulation View。您可以通過在右下方的模擬視圖中單擊單詞 button 來模擬按鈕按下事件?;顒訝顟B(tài)應從“熄滅”更改為“點亮”。五秒鐘后,或單擊時間事件 Light_On_timer_event_0 后,活動狀態(tài)將更改回 Light Off 。太棒了!現(xiàn)在,讓我們檢查一下如何在Arduino上使用它。
步驟6:將系統(tǒng)帶入現(xiàn)實世界
好吧,我們點擊了一下,使用了圖形編輯器(通常與低級語言相關聯(lián)),讓這件事栩栩如生。首先,我們需要一個代碼生成器,將狀態(tài)圖轉換為C代碼。
右鍵單擊您的模型文件夾,然后選擇 New-》 Code Generator Model ,這非常簡單,盡管看起來一開始就像是黑魔法。在向導中單擊自己,然后將代碼生成器附加到之前創(chuàng)建的狀態(tài)圖。注意:在同一窗口中,頂部有一個選擇器,可以輕松查看。使用它選擇C代碼生成器而不是Java代碼生成器,然后選中狀態(tài)圖旁邊的復選框,然后單擊完成。正常情況下,生成器現(xiàn)在應該一直一直直接自動運行。檢查是否創(chuàng)建了兩個文件夾src和src-gen。如果不是這種情況,請轉到主菜單中的“項目”,然后檢查是否激活了“自動生成”。如果不是,請這樣做,然后右鍵單擊您的項目,然后選擇“生成項目”。進度條以及兩個提到的文件夾都應出現(xiàn)。進行任何更改后,還可以右鍵單擊生成器文件,然后選擇 Generate Code Artifacts 。
src-gen文件夾的內容非常有趣。文件 LightCtrl.c 包含狀態(tài)圖的實現(xiàn)。檢查時,您會發(fā)現(xiàn)一個函數(shù) LightCtrlIface_raise_button(LightCtrl *句柄)。您可以調用此函數(shù)來引發(fā)我們先前聲明的按鈕事件,例如,當您檢查硬件按鈕的引腳并看到其具有高電平時。然后是文件 LightCtrlRequired.h ,您需要在其中查看。它聲明您需要實現(xiàn)的功能。對于此狀態(tài)圖,只有兩個功能: lightCtrl_setTimer 和 lightCtrl_unsetTimer 。我們需要這些功能,因為狀態(tài)圖在5s之后使用了構造。這是一個非常方便的功能,但是我們的狀態(tài)圖代碼生成器不提供計時服務,因為它高度依賴于平臺–您的計算機與微型Arduino的計時器處理方式不同,而Mac和Linux上的計時器處理方式與Windows上的處理方式不同。
幸運的是,我將為您提供計時服務,因此您無需自己實現(xiàn)。在您的項目中,創(chuàng)建一個新文件夾,將其命名為 scutils ,用于 s tate c hart 實用程序功能。您可以隨意命名,也可以選擇不創(chuàng)建該文件夾,這只是組織問題。我們將在其中創(chuàng)建兩個文件,分別是 sc_timer_service.c 和 sc_timer_service.h 。從GitHub中復制
代碼:
sc_timer_service.h
sc_timer_service.c
使用YAKINDU SCT 2.7.0,在那里是一個新選項,可用于獲得此可指導的項目:
在SCT中,轉到“文件”-》“新建”-》“示例。..”,選擇“ YAKINDU Statechart示例”,然后單擊“下一步”。在新的示例向導中,單擊“下載”以獲取最新的示例集。從arduino類別中選擇“ Arduino的有限狀態(tài)機”,然后單擊“完成”。該項目將被復制到您的工作區(qū)中。右鍵單擊它,然后單擊“刷新”-可以肯定。
現(xiàn)在,我們可以開始在向導生成的* .ino文件中的Arduino代碼上工作。
除了 Arduino.h ,還包括 avr/sleep.h ,當然還有我們的狀態(tài)機和計時器服務: LightCtrl.h , LightCtrlRequired.h 和 sc_timer_service.h ?,F(xiàn)在,需要常規(guī)的Arduino東西:我們定義按鈕和LED的引腳,并將它們設置在設置功能內(這就是它的用途)。然后,我們需要定義狀態(tài)圖期望我們定義的函數(shù)-如前所述,- lightCtrl_setTimer 和 lightCtrl_unsetTimer 。在這里,我們只使用計時器服務,就完成了?,F(xiàn)在,我們應該思考一下當達到 Light On 狀態(tài)時實際上如何激活LED?;旧?,我們有三個選項:
我們可以檢查狀態(tài)機是否處于Light On狀態(tài),并根據(jù)該信息激活/禁用LED
我們可以進入狀態(tài)圖,并在到達狀態(tài)時設置一個變量,以便我們可以輪詢
我們可以添加一個操作來管理狀態(tài)圖在過渡時調用的光。
第一個解決方案確實很糟糕。我們將有關于狀態(tài)圖外部的邏輯。如果我們重命名我們的州,它將停止正常工作;但是這些名稱是平淡無奇的,與邏輯無關。可以使用變量,特別是在使用桌面應用程序時。我們可以每x毫秒左右與他們同步一次。在這里,我們要使用一個操作。在狀態(tài)圖的接口聲明中添加以下內容:
operation setLight(LightOn: boolean): void
這聲明了一個函數(shù),該函數(shù)接受布爾值作為參數(shù),但不返回任何值(無效)。這對您來說不是新手,只是這里的語法不同。請記住–狀態(tài)圖未綁定到特定語言,因此語法是通用的。此功能自動顯示在 LightCtrlRequired.h 中。如果沒有,請保存狀態(tài)圖,右鍵單擊您的項目并進行構建。
此處聲明的函數(shù)如下所示:
extern void lightCtrlIface_setLight(const LightCtrl* handle, const sc_boolean lightOn);
輸入?yún)?shù)句柄為類型的LightCtrl,它是狀態(tài)圖的引用者。如果您不熟悉C:星號表示所謂的指針,那么該變量包含statechart變量的地址。這對我們有幫助,因為我們可以對原始對象進行操作,而不必創(chuàng)建其副本。因此,讓我們實現(xiàn)此功能:
void lightCtrlIface_setLight(const LightCtrl* handle, const sc_boolean lightOn) {
if(lightOn)
digitalWrite(LED_PIN, HIGH);
else
digitalWrite(LED_PIN, LOW);
}
如您所見,此功能非常簡單-我們甚至不使用狀態(tài)圖的句柄,我們只在LED上寫HIGH如果操作的參數(shù)為true,則為pin;否則為LOW。
我們更改狀態(tài)圖本身,使其看起來像第一張圖片。
還記得第1步嗎?斜線左邊是過渡所需要的輸入,右邊是狀態(tài)機的輸出(如果進行了過渡)。此處的輸出是使用這些參數(shù)調用指定的操作。
#include “Arduino.h”
#include “avr/sleep.h”
#include “src-gen/LightCtrl.h”
#include “src-gen/LightCtrlRequired.h”
#include “scutil/sc_timer_service.h”
#define BUTTON_PIN 3
#define LED_PIN 6
#define MAX_TIMERS 20 //number of timers our timer service can use
#define CYCLE_PERIOD 10 //number of milliseconds that pass between each statechart cycle
static unsigned long cycle_count = 0L; //number of passed cycles
static unsigned long last_cycle_time = 0L; //timestamp of last cycle
static LightCtrl lightctrl;
static sc_timer_service_t timer_service;
static sc_timer_t timers[MAX_TIMERS];
//! callback implementation for the setting up time events
void lightCtrl_setTimer(LightCtrl* handle, const sc_eventid evid, const sc_integer time_ms, const sc_boolean periodic){
sc_timer_start(&timer_service, (void*) handle, evid, time_ms, periodic);
}
//! callback implementation for canceling time events.
void lightCtrl_unsetTimer(LightCtrl* handle, const sc_eventid evid) {
sc_timer_cancel(&timer_service, evid);
}
void lightCtrlIface_setLight(const LightCtrl* handle, const sc_boolean lightOn) {
if(lightOn)
digitalWrite(LED_PIN, HIGH);
else
digitalWrite(LED_PIN, LOW);
}
//The setup function is called once at startup of the sketch
void setup()
{
pinMode(BUTTON_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
sc_timer_service_init(
&timer_service,
timers,
MAX_TIMERS,
(sc_raise_time_event_fp) &lightCtrl_raiseTimeEvent
);
lightCtrl_init(&lightctrl); //initialize statechart
lightCtrl_enter(&lightctrl); //enter the statechart
}
// The loop function is called in an endless loop
void loop()
{
unsigned long current_millies = millis();
if(digitalRead(BUTTON_PIN))
lightCtrlIface_raise_button(&lightctrl);
if ( cycle_count == 0L || (current_millies 》= last_cycle_time + CYCLE_PERIOD) ) {
sc_timer_service_proceed(&timer_service, current_millies - last_cycle_time);
lightCtrl_runCycle(&lightctrl);
last_cycle_time = current_millies;
cycle_count++;
}
}
此外,請按行號在本要點中檢查代碼。
第1-6行包含如前所述的包含。
第8行和第9行定義了我們將要用于arduino的硬件引腳。
第11行和第12行定義了狀態(tài)圖可以使用多少個計時器,以及狀態(tài)圖的每個計算周期之間應經(jīng)過多少毫秒。
第15和16行聲明了一些變量,我們可以用它們來計數(shù)周期并管理最后一個周期的時間。
第17、19和21行聲明了使用狀態(tài)圖的重要變量:狀態(tài)圖本身,計時器服務和計時器數(shù)組。
第24行和第33行定義了狀態(tài)圖需要計時器使用的功能,第33行是設置前面討論過的LED的功能。
在第41行中,void setup()是Arduino的標準功能。它在啟動時被調用一次。我們用它來初始化東西–我們的LED和按鈕引腳配置了它們的方向(INPUT是標準的,為清楚起見,我們這樣做了),計時器服務被初始化,狀態(tài)圖被初始化并輸入。輸入意味著啟動狀態(tài)機,因此第一個狀態(tài)被激活-這是輸入狀態(tài)所指向的狀態(tài)。因此,在啟動時,指示燈熄滅。
在第59行中,跟隨著循環(huán)功能,Arduino一直在調用它。
在第61行中,我們使用millis()函數(shù)捕獲當前時間,該函數(shù)由Arduino庫定義。
在第63行中,我們檢查按鈕是否被按下,如果按下,則引發(fā)按鈕事件。
在第66行中,我們檢查自上次循環(huán)狀態(tài)圖以來是否已超過CYCLE_PERIOD毫秒。
這會給我們的arduino帶來一些負擔,這意味著我們可以可靠地將長達10毫秒的時間用于自己的功能。
在第68行中,我們告訴計時器服務自上次調用以來已經(jīng)過去了多少時間,在第70行中告訴statechart運行一個周期,在第72行中保存當前時間,并增加周期計數(shù)在第73行。
使用arduino插件,您現(xiàn)在可以將arduino與LED和連接到計算機的按鈕連接起來,并使用頂部工具欄中的按鈕將程序上傳到
電路如圖2和圖3所示。
LED通過大約200歐姆的電阻連接到數(shù)字引腳(6)。陰極連接到GND。
按鈕有四個引腳,請在按下按鈕時檢查其中哪些始終連接以及哪些連接。然后,將數(shù)字引腳(此處使用3)連接到一側,將下拉電阻連接到GND。這將使引腳停止處于“浮動”狀態(tài)(不確定狀態(tài)),并將其保持在0 V電壓。當按下按鈕并將另一側連接到VCC時,該側“更強”,因為它沒有電阻,并且電壓高達5伏–基本上是一個分壓器,其中一個電阻為0歐姆。請在此使用一個較高的電阻,因為它會限制通過按鈕的電流。最小值為1 kR。
如您所見,該程序的邏輯完全獨立于我們狀態(tài)圖的實際大小。狀態(tài)圖具有2個或20個狀態(tài)都沒有關系-當然,如果我們想做點什么,我們需要在這里和那里實現(xiàn)一個功能。但是void loop()內部的主要代碼總是很小,并且允許模塊化程序體系結構。我們只需要在代碼中處理從狀態(tài)圖到Arduino硬件的接口,自動生成的狀態(tài)圖將處理其內部邏輯。還記得我們討論過如何在再次按下按鈕時重置計時器嗎?現(xiàn)在,您可以使用“按鈕”作為保護事件,從“點亮”狀態(tài)添加到其自身的過渡,而無需在代碼中更改或添加一行。嘗試一下,然后開始對軟件進行建模,而不是編寫它!
步驟7:此外:查找您的Arduino端口
因此,您陷入困境,因為您無法弄清Arduino連接到哪個串行/USB端口。好的,您會在下面找到有關Windows和Linux的說明。
Windows
將arduino插入計算機,然后轉到“設備和打印機”(從開始菜單或系統(tǒng)控制面板)。如圖所示,您的arduino應該出現(xiàn)在這里-對我來說,端口為COM12。這可能會改變,例如,當您使用另一個USB端口時,重新啟動系統(tǒng)。..如果仍然無法解決問題,請檢查是否仍然正確。
Linux
使用您的arduino未連接,啟動終端。輸入 dmesg 并返回,這將為您提供冗長的文本輸出。插入您的arduino,然后再次輸入 dmesg 。最后應該是一些有關arduino的消息,包括一個端口-例如,/dev/USB0,/dev/ttyAMC3-可以理解。如果您插入arduino且LED不亮,并且 dmesg 在插入之前和之后都顯示完全相同的內容,則很可能是您的Arduino吐司了。
如果此方法不適合您,也可以在插入Arduino之前和之后嘗試 ls/dev/。這列出了所有可用的設備,并且在連接Arduino之后應該能夠看到一個新設備。
-
fsm
+關注
關注
0文章
35瀏覽量
12979 -
Arduino
+關注
關注
190文章
6498瀏覽量
192175
發(fā)布評論請先 登錄
請問如何在FX10上使用GPIF III狀態(tài)機 *.h 文件?
NVMe高速傳輸之擺脫XDMA設計之八:PCIe初始化狀態(tài)機設計
有可能在 FX3 GPIF2 中創(chuàng)建兩個獨立的狀態(tài)機嗎?
求助,關于srammaster.cydsn中狀態(tài)機的問題求解
如何在RAKsmart服務器上實現(xiàn)企業(yè)AI模型部署
如何在iMX8MM EVK上啟用紅外接收器?
如何快速入門PLD電路設計
Simulink中的狀態(tài)機建模方法 Simulink數(shù)據(jù)可視化與分析功能
基于狀態(tài)機和面向對象的思想設計按鍵檢測模塊

如何使用Arduino實現(xiàn)CAN總線通信
如何在MSP430?上實現(xiàn)內置振蕩器的高精度定時器

如何在采用 SOT563 封裝的 TPS56x242-7 上實現(xiàn)更良好的熱性能

如何在DRA821U上使用Linux實現(xiàn)快速引導

評論