資料介紹
描述
微軟的 Azure RTOS ThreadX 是開源的!我們想向您展示 ThreadX 的基礎知識,以便您可以開始在您的 Arduino 項目中使用這個工業級 RTOS。
預計時間:設置:5 分鐘;第 1 部分:5 分鐘;第 2 部分:30 分鐘;第 3 部分:15 分鐘
估計成本:配備ATSAMD21 或 ATSAMD51芯片的設備 $
介紹
本教程將向您展示如何在 Azure RTOS ThreadX for Arduino 中使用多線程。您將從經典的 Blink 示例開始,并將其轉換為 ThreadX 應用程序。
Azure RTOS:用于微控制器 (MCU) 上的嵌入式 IoT 應用程序的 Microsoft 開發套件。Azure RTOS不需要Azure即可運行。
Azure RTOS ThreadX:Azure RTOS 產品的一個組件。ThreadX是設計用于在 MCU 上運行的實時操作系統 (RTOS)。
Azure RTOS ThreadX for Arduino:Azure RTOS ThreadX 作為庫到 Arduino 的端口。請訪問GitHub 上的AzureRTOS-ThreadX-For-Arduino獲取源代碼。
涵蓋的內容
在本教程結束時,您應該了解以下內容:
術語:內核、線程、線程控制塊、優先級、搶占、搶占閾值
Actions :如何使用 ThreadX 實現單線程;如何使用 ThreadX 實現多線程
最終代碼:在GitHub 上查看完整的 ThreadX 多線程 Blink 代碼示例。
先決條件
- 安裝Arduino IDE 1.8.x。
- 擁有使用ATSAMD21 或 ATSAMD51芯片的設備。查看此已驗證板的列表。
以下是在 Windows 11、Arduino IDE 1.8.19、Arduino MKR WiFi 1010 和 Seeed Studio Wio 終端上運行的。
設置
預計時間: 5 分鐘
步驟 1.打開 Arduino IDE。
步驟 2.安裝 Azure RTOS Arduino 庫。
- 導航到工具 > 管理庫...
- 搜索“Azure RTOS” 。
- 安裝“Azure RTOS ThreadX” 。請務必安裝最新版本。

步驟 3.為您的設備安裝板包。(本示例使用 Arduino MKR WiFi 1010。)

第 1 部分:運行 Arduino Blink 示例
在本節中,我們將運行傳統的 Blink 示例以確認設備設置正確。
預計時間: 5 分鐘
步驟 1.打開 Blink 示例。
- 導航到文件 > 示例 > 01.Basics 。
- 選擇“閃爍” 。
第 2 步。連接您的設備。
- 將您的設備插入您的 PC。
- 導航到工具 > 板:... > Arduino SAMD 板(32 位 ARM Cortex-M0+)
- 選擇“Arduino MKR WiFi 1010” 。
- 導航到工具 > 端口。
- 選擇“<與設備關聯的端口>” 。
步驟 3.運行示例。
- 在左上角,選擇“上傳”圖標。驗證將首先自動進行。
- 觀察 LED 每 1 秒閃爍一次。
深潛
代碼
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
到底是怎么回事?
Arduino 利用了兩個核心功能:setup()
和loop()
. 一旦setup()
完成,loop()
就會在內部啟動并運行程序的其余部分。因為不存在 RTOS,所以這段代碼可以被認為是裸機編程。
有關更多信息,請參閱完整的 Arduino Blink示例。
第 2 部分:通過 ThreadX 轉換 Blink 示例
在本節中,我們將使用 ThreadX 將裸機 Blink 示例轉換為單線程 RTOS 版本。
預計時間: 30 分鐘
步驟 1.保存示例。
- 導航到文件 > 另存為。
- 將草圖另存為'Blink_ThreadX' 。
步驟 2. (1) 在文件頂部附近添加 Azure RTOS ThreadX 庫頭文件。tx_api.h
將它放在評論之后,但在setup()
功能之前。
/* (1) Add the Azure RTOS ThreadX library header file. */
#include
到底是怎么回事?
tx_api.h
是您在 Arduino 中使用 ThreadX 時唯一需要包含的頭文件。tx
是 ThreadX 的縮寫。API 中的所有函數都以tx
. 所有常量和數據類型都以TX
.
步驟 3. (2) 將內核入口函數添加tx_kernel_enter()
到setup()
.
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
/* (2) Add the kernel entry function. */
tx_kernel_enter();
}
到底是怎么回事?
內核是 RTOS 的核心組件。將其視為項目的首席協調員或物流總監。通過“進入”內核,RTOS 內核可以開始運行和管理您的嵌入式應用程序。
該程序永遠不會從tx_kernel_enter()
. 結果,應用程序將不會返回setup()
,loop()
也不會被調用。
重要提示:“對 tx_kernel_enter() 的調用不會返回,因此不要在其后進行任何處理。”
有關. _ _tx_kernel_enter()
Step 4. (3) 添加線程棧內存和線程控制塊。將其放置在文件頂部附近之后#include
和之前setup()
。
/* (3) Add the thread stack memory and thread control block. */
#define THREAD_STACK_SIZE 512
TX_THREAD thread_0;
UCHAR thread_0_stack[THREAD_STACK_SIZE];
到底是怎么回事?
線程是進程(即正在運行的應用程序)內的特定執行路徑。線程與其他線程共享內存空間,但有自己分配的堆棧空間。我們將此堆棧大小定義為THREAD_STACK_SIZE
字節并使用數組thread_0_stack
來分配內存。有關線程堆棧區域的更多信息,請參閱Microsoft Learn 的 ThreadX 第 3 章:ThreadX 的功能組件。
線程控制塊包含線程的特定數據。TX_THREAD
是線程控制塊的 ThreadX 數據類型。有關. _ _TX_THREAD
重要提示:“ThreadX 不使用術語任務。相反,使用更具描述性和現代性的名稱線程。” 有關任務與線程的更多信息,請參閱Microsoft Learn 的 ThreadX 第 1 章:ThreadX 簡介。
Step 5. (4) 定義線程的入口函數thread_0_entry()
。將函數定義放在thread_0_stack
數組之后和之前setup()
。
/* (4) Define the thread's entry function. */
void thread_0_entry(ULONG thread_input)
{
(VOID)thread_input;
while(1)
{
/* Add thread logic to execute here. */
}
}
到底是怎么回事?
線程的入口函數由內核調用,包含線程執行邏輯。通常,此函數將包含一個無限循環(即while(1)
),它將在整個運行程序中執行。此函數的名稱由用戶確定。
步驟 6. (5) 將 LED 閃爍邏輯從loop()
線程的入口函數中移出。替換delay(1000)
為tx_thread_sleep(TX_TIMER_TICKS_PER_SECOND)
。
void thread_0_entry(ULONG thread_input)
{
(VOID)thread_input;
while(1)
{
/* (5) Move the LED blink logic into the thread's entry function. */
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on
tx_thread_sleep(TX_TIMER_TICKS_PER_SECOND); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off
tx_thread_sleep(TX_TIMER_TICKS_PER_SECOND); // wait for a second
}
}
// the loop function runs over and over again forever
void loop() {
/* (5) Move the LED blink logic into the thread's entry function. */
/* This will never be called. */
}
到底是怎么回事?
因為loop()
將不再被調用,所以必須將閃爍邏輯移到新線程中。該delay()
函數有局限性,因為我們稍后要暫停線程以允許其他線程執行,我們將使用 ThreadX 的tx_thread_sleep()
函數來代替。此函數將計時器滴答作為其參數,而不是毫秒。
Step 7. (6) 添加應用程序的環境設置功能tx_application_define()
。將此函數放置在 之后thread_0_entry()
和之前setup()
。
/* (6) Add the application's environment setup function. */
void tx_application_define(void *first_unused_memory)
{
(VOID)first_unused_memory;
/* Put system definition stuff in here, e.g. thread creates and other assorted
create information. */
}
到底是怎么回事?
內核入口函數tx_kernel_enter()
將調用該函數tx_application_define()
來設置應用程序環境和系統資源。用戶有責任使用為 RTOS 環境創建系統資源的邏輯來實現此功能。
有關. _ _tx_application_define()
第 8 步。(7) 使用 . 創建線程tx_thread_create()
。將此函數調用添加到tx_application_define()
.
void tx_application_define(void *first_unused_memory)
{
(VOID)first_unused_memory;
/* Put system definition stuff in here, e.g. thread creates and other assorted
create information. */
/* (7) Create the thread. */
tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0,
thread_0_stack, THREAD_STACK_SIZE,
1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
}
到底是怎么回事?
tx_thread_create()
創建具有指定參數的線程。此示例中使用的參數反映以下內容:
-
&thread_0
: 指向定義的線程控制塊的指針。(見步驟 4。) -
"thread_0"
: 線程名稱(即,指向名稱的指針)。 -
thread_0_entry
:用戶自定義線程入口函數。(見步驟 5。) -
0
: 線程的入口輸入。我們沒有利用這個論點。 -
thread_0_stack
: 指向線程堆棧開始的指針。(見步驟 4。) -
THREAD_STACK_SIZE
:線程堆棧的大小(以字節為單位)。(見步驟 4。) -
1
: 線程的優先級。 -
1
:線程的搶占閾值。 -
TX_NO_TIME_SLICE
: 時間片被禁用。 -
TX_AUTO_START
: 線程自動啟動。
線程的優先級有助于線程調度程序確定接下來要執行的線程。一些線程可能對執行更為關鍵,因此相對于其他線程被賦予更高的優先級。ThreadX 有 32 個默認優先級,從 0 到 31,0 為最高優先級,31 為最低優先級。
搶占是指停止現有線程的執行,以便可以運行更高優先級。調度程序控制這一點,當中斷線程完成時,執行返回到暫停的線程。
搶占閾值是 ThreadX 獨有的。只有高于此閾值的優先級才能搶占線程。
有關線程執行、線程優先級、線程調度和線程搶占的更多信息,請參閱Microsoft Learn 的 ThreadX 第 3 章:ThreadX 的功能組件。
步驟 9.使用 Azure RTOS ThreadX 運行 Blink 示例。
按照第 2 步。連接您的設備和第 3 步。運行第 1 部分中的示例:運行 Arduino Blink 示例。
深潛
代碼
/* (1) Add the Azure RTOS ThreadX library header file. */
#include
/* (3) Add the thread stack memory and thread control block. */
#define THREAD_STACK_SIZE 512
TX_THREAD thread_0;
UCHAR thread_0_stack[THREAD_STACK_SIZE];
/* (4) Define the thread's entry function. */
void thread_0_entry(ULONG thread_input)
{
(VOID)thread_input;
while(1)
{
/* (5) Move the LED blink logic into the thread's entry function. */
digitalWrite(LED_BUILTIN, HIGH); /* Turn the LED on. */
tx_thread_sleep(TX_TIMER_TICKS_PER_SECOND); /* Wait for a second. */
digitalWrite(LED_BUILTIN, LOW); /* turn the LED off. */
tx_thread_sleep(TX_TIMER_TICKS_PER_SECOND); /* wait for a second. */
}
}
/* (6) Add the application's environment setup function. */
void tx_application_define(void *first_unused_memory)
{
(VOID)first_unused_memory;
/* Put system definition stuff in here, e.g. thread creates and other assorted
create information. */
/* (7) Create the thread. */
tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0,
thread_0_stack, THREAD_STACK_SIZE,
1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
}
/* The setup function runs once when you press reset or power the board. */
void setup()
{
/* Initialize digital pin LED_BUILTIN as an output. */
pinMode(LED_BUILTIN, OUTPUT);
/* (2) Add the kernel entry function. */
tx_kernel_enter();
}
void loop()
{
/* (5) Move the LED blink logic into the thread's entry function. */
/* This will never be called. */
}
注意:Arduino Blink 格式和單行樣式注釋//
已轉換為 ThreadX 格式和多行樣式/* */
。
到底是怎么回事?
setup()
上面的代碼演示了如何用Azure RTOS ThreadX替換 Arduino 裸機單線程方法。loop()
之前的裸機代碼流程是:
-
setup()
->loop()
-> 無限循環閃爍邏輯。
ThreadX 新的代碼流程是:
-
setup()
->tx_kernel_enter()
->tx_application_define()
->thread_0_entry()
-> 無限循環 Blink 邏輯。
盡管這種方法仍然保持相同的單線程功能,但現在可以根據需要添加額外的線程。第 3 部分將演示如何執行此操作。
第 3 部分:通過 ThreadX 將多線程應用到 Blink 示例
在本節中,我們將使用單線程 ThreadX Blink 代碼創建一個多線程版本,該版本也可以讀取串行輸入。
預計時間: 15 分鐘
步驟 1.保存示例。
- 導航到文件 > 另存為。
- 將草圖另存為'Blink_SerialRead_ThreadX' 。
步驟 2. (8) 添加線程堆棧內存和線程控制塊以再增加一個線程。
/* (3)(8) Add the thread stack memory and thread control block. */
#define THREAD_STACK_SIZE 512
TX_THREAD thread_0;
TX_THREAD thread_1;
UCHAR thread_0_stack[THREAD_STACK_SIZE];
UCHAR thread_1_stack[THREAD_STACK_SIZE];
到底是怎么回事?
此操作模仿第 2 部分:第 4 步。對于要添加的每個線程,您需要分配其堆棧內存并聲明其線程控制塊。 TX_THREAD
Step 3. (9) 定義新線程的入口函數thread_1_entry()
。將函數定義放在 之后thread_0_entry()
和之前tx_application_define()
。
/* (9) Define the thread's entry function. */
void thread_1_entry(ULONG thread_input)
{
(VOID)thread_input;
while(1)
{
/* Add thread logic to execute here. */
}
}
到底是怎么回事?
此操作模仿第 2 部分:第 5 步。每個線程都需要一個用戶定義的入口函數來執行線程邏輯。
Step 4. (10) 將串行讀取邏輯添加到線程的入口函數中。
void thread_1_entry(ULONG thread_input)
{
(VOID)thread_input;
/* (10) Add serial read logic to the thread's entry function. */
Serial.begin(115200);
while(1)
{
if (Serial.available() > 0)
{
char byte_read = Serial.read();
Serial.print(byte_read);
}
}
}
到底是怎么回事?
串行讀取邏輯從串行輸入接收字節并將它們打印到串行監視器。請注意,此邏輯放在 中while(1)
,但串行初始化Serial.begin()
函數沒有。因為初始化只需要發生一次,所以放在前面while(1)
。或者,它可以放在setup()
之前tx_kernel_enter()
。
第 5 步。(11) 使用 . 創建新線程tx_thread_create()
。在tx_application_define()
創建thread_0
.
void tx_application_define(void *first_unused_memory)
{
(VOID)first_unused_memory;
/* Put system definition stuff in here, e.g. thread creates and other assorted
create information. */
/* (7)(11) Create the thread. */
tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0,
thread_0_stack, THREAD_STACK_SIZE,
1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
tx_thread_create(&thread_1, "thread 1", thread_1_entry, 0,
thread_1_stack, THREAD_STACK_SIZE,
4, 4, TX_NO_TIME_SLICE, TX_AUTO_START);
}
到底是怎么回事?
此操作模仿第 2部分:第8步。 在所使用的論點中發現了差異。注意命名如何改變以反映: thread_1
-
&thread_1
: 指向定義的線程控制塊的指針。 -
"thread_1"
: 線程名稱(即,指向名稱的指針)。 -
thread_1_entry
:用戶自定義線程入口函數。 -
thread_1_stack
: 指向線程堆棧開始的指針。
另一個改變的參數集是優先級和搶占閾值:
-
4
: 線程的優先級。 -
4
:線程的搶占閾值。
因為4的優先級低于1 ,thread_0
所以將首先執行,并且只有在它掛起時(tx_thread_sleep()
),調度程序才會執行行中的下一個線程(thread_1
)。一旦thread_0
完成暫停,調度程序將搶占thread_1
并返回執行thread_0
。
保持不變的論點是:
-
0
: 線程的入口輸入。 -
THREAD_STACK_SIZE
:線程堆棧的大小(以字節為單位)。 -
TX_NO_TIME_SLICE
: 時間片被禁用。 -
TX_AUTO_START
: 線程自動啟動。
步驟 6.使用 Azure RTOS ThreadX 運行多線程 Blink 示例。
- 按照第 2 步。連接您的設備和第 3 步。運行第 1 部分中的示例:運行 Arduino Blink 示例。
- 觀察 LED 每 1 秒閃爍一次。
- 導航到工具 > SerialMonitor 。
- 輸入你好閃爍!進入串行輸入線。

- 選擇“發送” 。

深潛
代碼
/* (1) Add the Azure RTOS ThreadX library header file. */
#include
/* (3)(8) Add the thread stack memory and thread control block. */
#define THREAD_STACK_SIZE 512
TX_THREAD thread_0;
TX_THREAD thread_1;
UCHAR thread_0_stack[THREAD_STACK_SIZE];
UCHAR thread_1_stack[THREAD_STACK_SIZE];
/* (4) Define the thread's entry function. */
void thread_0_entry(ULONG thread_input)
{
(VOID)thread_input;
while(1)
{
/* (5) Move the LED blink logic into the thread's entry function. */
digitalWrite(LED_BUILTIN, HIGH); /* Turn the LED on. */
tx_thread_sleep(TX_TIMER_TICKS_PER_SECOND); /* Wait for a second. */
digitalWrite(LED_BUILTIN, LOW); /* Turn the LED off. */
tx_thread_sleep(TX_TIMER_TICKS_PER_SECOND); /* Wait for a second. */
}
}
/* (9) Define the thread's entry function. */
void thread_1_entry(ULONG thread_input)
{
(VOID)thread_input;
/* (10) Add serial read logic to the thread's entry function. */
Serial.begin(115200);
while(1)
{
if (Serial.available() > 0)
{
char byte_read = Serial.read();
Serial.print(byte_read);
}
}
}
/* (6) Add the application's environment setup function. */
void tx_application_define(void *first_unused_memory)
{
(VOID)first_unused_memory;
/* Put system definition stuff in here, e.g. thread creates and other assorted
create information. */
/* (7)(11) Create the thread. */
tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0,
thread_0_stack, THREAD_STACK_SIZE,
1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
tx_thread_create(&thread_1, "thread 1", thread_1_entry, 0,
thread_1_stack, THREAD_STACK_SIZE,
4, 4, TX_NO_TIME_SLICE, TX_AUTO_START);
}
/* The setup function runs once when you press reset or power the board. */
void setup()
{
/* Initialize digital pin LED_BUILTIN as an output. */
pinMode(LED_BUILTIN, OUTPUT);
/* (2) Add the kernel entry function. */
tx_kernel_enter();
}
void loop()
{
/* (5) Move the LED blink logic into the thread's entry function. */
/* This will never be called. */
}
注意:Arduino Blink 格式和單行樣式注釋//
已轉換為 ThreadX 格式和多行樣式/* */
。
到底是怎么回事?
上面的代碼演示了如何使用 Azure RTOS ThreadX 向 Arduino 應用程序添加額外的線程。一個線程使 LED 閃爍,而另一個線程接收串行輸入并將其打印到串行監視器。線程對于同時且彼此獨立地執行不同的任務非常有幫助。
盡管本教程中沒有演示,但線程也可以通過同步和相互通信。當程序需要隨時接收傳入數據但也需要對其進行處理時,這可能很有用。這兩個任務可以分成兩個線程。
我們希望在未來的 Azure RTOS ThreadX for Arduino 教程中介紹這些和其他概念。敬請關注!
?
- 適用于Arduino的Adafruit NeoPixel Shield
- 適用于Arduino YUN、UNO和Nano的DIN導軌安裝
- 適用于PC的ARDUINO控制游戲手柄(有線)
- 適用于Azure Sphere的WS2812B LED燈帶驅動器
- 適用于ESP32的AWS IoT Arduino庫
- 適用于Arduino Uno板的簡單計時器
- DB459_適用于 STM32Cube 的 STM32L4 系列和 STM32L4+ 系列 Azure? RTOS 軟件擴展
- DB4594_STM32F7 系列用于 STM32Cube 的 Azure? RTOS 軟件擴展
- 適用于PC和Android的Arduino游戲控制器
- 首款適用于Arduino的藍牙家庭自動化擴展板
- ThreadX(三)------線程thread
- Azure RTOS NetX Duo嵌入式TCP/IP網絡堆棧 13次下載
- 高性能嵌入式堆棧Azure PTOS USBX概述 10次下載
- 嵌入式RTOS ThreadX 用戶指南手冊ver.4.0c 34次下載
- 適用于Microsoft_Azure的NetApp_ONTAP_ 0次下載
- 適用于內窺鏡鏡頭模組的環氧樹脂封裝膠 94次閱讀
- RTOS中的線程、進程和協程詳解 2033次閱讀
- 使用MM32F3270基于Azure RTOS定時器組的應用 1751次閱讀
- 使用MM32F3270基于Azure RTOS動態內存管理的應用 992次閱讀
- 使用MM32F3270基于Azure RTOS信號量的應用 1071次閱讀
- 如何將ThreadX移植到STM32平臺 1804次閱讀
- RTOS多線程必須要MMU才行? 2478次閱讀
- 如何使用Tracealyzer的流模式來跟蹤ThreadX應用 1471次閱讀
- Azure Kinect Senser DK套件簡介 3845次閱讀
- 如何編寫適用于Go項目的Makefile 2241次閱讀
- 基于一種適用于SSL產品的LED控制電路設計 1194次閱讀
- 主打嵌入式應用的中高階RTOS 5687次閱讀
- 適用于TI處理器的可擴展Linux和TI RTOS解決方案 5556次閱讀
- 淺談Arduino和樹莓派的區別 2.1w次閱讀
- 適用于RS232串口的溫度檢測電路 2732次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論