資料介紹
描述
微軟的 Azure RTOS ThreadX 是開源的!我們想向您展示 ThreadX 的基礎(chǔ)知識(shí),以便您可以開始在您的 Arduino 項(xiàng)目中使用這個(gè)工業(yè)級(jí) RTOS。
預(yù)計(jì)時(shí)間:設(shè)置:5 分鐘;第 1 部分:5 分鐘;第 2 部分:30 分鐘;第 3 部分:15 分鐘
估計(jì)成本:配備ATSAMD21 或 ATSAMD51芯片的設(shè)備 $
介紹
本教程將向您展示如何在 Azure RTOS ThreadX for Arduino 中使用多線程。您將從經(jīng)典的 Blink 示例開始,并將其轉(zhuǎn)換為 ThreadX 應(yīng)用程序。
Azure RTOS:用于微控制器 (MCU) 上的嵌入式 IoT 應(yīng)用程序的 Microsoft 開發(fā)套件。Azure RTOS不需要Azure即可運(yùn)行。
Azure RTOS ThreadX:Azure RTOS 產(chǎn)品的一個(gè)組件。ThreadX是設(shè)計(jì)用于在 MCU 上運(yùn)行的實(shí)時(shí)操作系統(tǒng) (RTOS)。
Azure RTOS ThreadX for Arduino:Azure RTOS ThreadX 作為庫到 Arduino 的端口。請(qǐng)?jiān)L問GitHub 上的AzureRTOS-ThreadX-For-Arduino獲取源代碼。
涵蓋的內(nèi)容
在本教程結(jié)束時(shí),您應(yīng)該了解以下內(nèi)容:
術(shù)語:內(nèi)核、線程、線程控制塊、優(yōu)先級(jí)、搶占、搶占閾值
Actions :如何使用 ThreadX 實(shí)現(xiàn)單線程;如何使用 ThreadX 實(shí)現(xiàn)多線程
最終代碼:在GitHub 上查看完整的 ThreadX 多線程 Blink 代碼示例。
先決條件
- 安裝Arduino IDE 1.8.x。
- 擁有使用ATSAMD21 或 ATSAMD51芯片的設(shè)備。查看此已驗(yàn)證板的列表。
以下是在 Windows 11、Arduino IDE 1.8.19、Arduino MKR WiFi 1010 和 Seeed Studio Wio 終端上運(yùn)行的。
設(shè)置
預(yù)計(jì)時(shí)間: 5 分鐘
步驟 1.打開 Arduino IDE。
步驟 2.安裝 Azure RTOS Arduino 庫。
- 導(dǎo)航到工具 > 管理庫...
- 搜索“Azure RTOS” 。
- 安裝“Azure RTOS ThreadX” 。請(qǐng)務(wù)必安裝最新版本。
步驟 3.為您的設(shè)備安裝板包。(本示例使用 Arduino MKR WiFi 1010。)
- 導(dǎo)航到工具 > 板:... > 板管理器...
- 搜索“MKR WiFi 1010” 。
- 安裝“Arduino SAMD 板(32 位 ARM Cortex-M0+)” 。請(qǐng)務(wù)必安裝最新版本。
第 1 部分:運(yùn)行 Arduino Blink 示例
在本節(jié)中,我們將運(yùn)行傳統(tǒng)的 Blink 示例以確認(rèn)設(shè)備設(shè)置正確。
預(yù)計(jì)時(shí)間: 5 分鐘
步驟 1.打開 Blink 示例。
- 導(dǎo)航到文件 > 示例 > 01.Basics 。
- 選擇“閃爍” 。
第 2 步。連接您的設(shè)備。
- 將您的設(shè)備插入您的 PC。
- 導(dǎo)航到工具 > 板:... > Arduino SAMD 板(32 位 ARM Cortex-M0+)
- 選擇“Arduino MKR WiFi 1010” 。
- 導(dǎo)航到工具 > 端口。
- 選擇“<與設(shè)備關(guān)聯(lián)的端口>” 。
步驟 3.運(yùn)行示例。
- 在左上角,選擇“上傳”圖標(biāo)。驗(yàn)證將首先自動(dòng)進(jìn)行。
- 觀察 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 利用了兩個(gè)核心功能:setup()
和loop()
. 一旦setup()
完成,loop()
就會(huì)在內(nèi)部啟動(dòng)并運(yùn)行程序的其余部分。因?yàn)椴淮嬖?RTOS,所以這段代碼可以被認(rèn)為是裸機(jī)編程。
有關(guān)更多信息,請(qǐng)參閱完整的 Arduino Blink示例。
第 2 部分:通過 ThreadX 轉(zhuǎn)換 Blink 示例
在本節(jié)中,我們將使用 ThreadX 將裸機(jī) Blink 示例轉(zhuǎn)換為單線程 RTOS 版本。
預(yù)計(jì)時(shí)間: 30 分鐘
步驟 1.保存示例。
- 導(dǎo)航到文件 > 另存為。
- 將草圖另存為'Blink_ThreadX' 。
步驟 2. (1) 在文件頂部附近添加 Azure RTOS ThreadX 庫頭文件。tx_api.h
將它放在評(píng)論之后,但在setup()
功能之前。
/* (1) Add the Azure RTOS ThreadX library header file. */
#include
到底是怎么回事?
tx_api.h
是您在 Arduino 中使用 ThreadX 時(shí)唯一需要包含的頭文件。tx
是 ThreadX 的縮寫。API 中的所有函數(shù)都以tx
. 所有常量和數(shù)據(jù)類型都以TX
.
步驟 3. (2) 將內(nèi)核入口函數(shù)添加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();
}
到底是怎么回事?
內(nèi)核是 RTOS 的核心組件。將其視為項(xiàng)目的首席協(xié)調(diào)員或物流總監(jiān)。通過“進(jìn)入”內(nèi)核,RTOS 內(nèi)核可以開始運(yùn)行和管理您的嵌入式應(yīng)用程序。
該程序永遠(yuǎn)不會(huì)從tx_kernel_enter()
. 結(jié)果,應(yīng)用程序?qū)⒉粫?huì)返回setup()
,loop()
也不會(huì)被調(diào)用。
重要提示:“對(duì) tx_kernel_enter() 的調(diào)用不會(huì)返回,因此不要在其后進(jìn)行任何處理。”
有關(guān). _ _tx_kernel_enter()
Step 4. (3) 添加線程棧內(nèi)存和線程控制塊。將其放置在文件頂部附近之后#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];
到底是怎么回事?
線程是進(jìn)程(即正在運(yùn)行的應(yīng)用程序)內(nèi)的特定執(zhí)行路徑。線程與其他線程共享內(nèi)存空間,但有自己分配的堆棧空間。我們將此堆棧大小定義為THREAD_STACK_SIZE
字節(jié)并使用數(shù)組thread_0_stack
來分配內(nèi)存。有關(guān)線程堆棧區(qū)域的更多信息,請(qǐng)參閱Microsoft Learn 的 ThreadX 第 3 章:ThreadX 的功能組件。
線程控制塊包含線程的特定數(shù)據(jù)。TX_THREAD
是線程控制塊的 ThreadX 數(shù)據(jù)類型。有關(guān). _ _TX_THREAD
重要提示:“ThreadX 不使用術(shù)語任務(wù)。相反,使用更具描述性和現(xiàn)代性的名稱線程?!?有關(guān)任務(wù)與線程的更多信息,請(qǐng)參閱Microsoft Learn 的 ThreadX 第 1 章:ThreadX 簡(jiǎn)介。
Step 5. (4) 定義線程的入口函數(shù)thread_0_entry()
。將函數(shù)定義放在thread_0_stack
數(shù)組之后和之前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. */
}
}
到底是怎么回事?
線程的入口函數(shù)由內(nèi)核調(diào)用,包含線程執(zhí)行邏輯。通常,此函數(shù)將包含一個(gè)無限循環(huán)(即while(1)
),它將在整個(gè)運(yùn)行程序中執(zhí)行。此函數(shù)的名稱由用戶確定。
步驟 6. (5) 將 LED 閃爍邏輯從loop()
線程的入口函數(shù)中移出。替換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. */
}
到底是怎么回事?
因?yàn)?/font>loop()
將不再被調(diào)用,所以必須將閃爍邏輯移到新線程中。該delay()
函數(shù)有局限性,因?yàn)槲覀兩院笠獣和>€程以允許其他線程執(zhí)行,我們將使用 ThreadX 的tx_thread_sleep()
函數(shù)來代替。此函數(shù)將計(jì)時(shí)器滴答作為其參數(shù),而不是毫秒。
Step 7. (6) 添加應(yīng)用程序的環(huán)境設(shè)置功能tx_application_define()
。將此函數(shù)放置在 之后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. */
}
到底是怎么回事?
內(nèi)核入口函數(shù)tx_kernel_enter()
將調(diào)用該函數(shù)tx_application_define()
來設(shè)置應(yīng)用程序環(huán)境和系統(tǒng)資源。用戶有責(zé)任使用為 RTOS 環(huán)境創(chuàng)建系統(tǒng)資源的邏輯來實(shí)現(xiàn)此功能。
有關(guān). _ _tx_application_define()
第 8 步。(7) 使用 . 創(chuàng)建線程tx_thread_create()
。將此函數(shù)調(diào)用添加到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()
創(chuàng)建具有指定參數(shù)的線程。此示例中使用的參數(shù)反映以下內(nèi)容:
-
&thread_0
: 指向定義的線程控制塊的指針。(見步驟 4。) -
"thread_0"
: 線程名稱(即,指向名稱的指針)。 -
thread_0_entry
:用戶自定義線程入口函數(shù)。(見步驟 5。) -
0
: 線程的入口輸入。我們沒有利用這個(gè)論點(diǎn)。 -
thread_0_stack
: 指向線程堆棧開始的指針。(見步驟 4。) -
THREAD_STACK_SIZE
:線程堆棧的大小(以字節(jié)為單位)。(見步驟 4。) -
1
: 線程的優(yōu)先級(jí)。 -
1
:線程的搶占閾值。 -
TX_NO_TIME_SLICE
: 時(shí)間片被禁用。 -
TX_AUTO_START
: 線程自動(dòng)啟動(dòng)。
線程的優(yōu)先級(jí)有助于線程調(diào)度程序確定接下來要執(zhí)行的線程。一些線程可能對(duì)執(zhí)行更為關(guān)鍵,因此相對(duì)于其他線程被賦予更高的優(yōu)先級(jí)。ThreadX 有 32 個(gè)默認(rèn)優(yōu)先級(jí),從 0 到 31,0 為最高優(yōu)先級(jí),31 為最低優(yōu)先級(jí)。
搶占是指停止現(xiàn)有線程的執(zhí)行,以便可以運(yùn)行更高優(yōu)先級(jí)。調(diào)度程序控制這一點(diǎn),當(dāng)中斷線程完成時(shí),執(zhí)行返回到暫停的線程。
搶占閾值是 ThreadX 獨(dú)有的。只有高于此閾值的優(yōu)先級(jí)才能搶占線程。
有關(guān)線程執(zhí)行、線程優(yōu)先級(jí)、線程調(diào)度和線程搶占的更多信息,請(qǐng)參閱Microsoft Learn 的 ThreadX 第 3 章:ThreadX 的功能組件。
步驟 9.使用 Azure RTOS ThreadX 運(yùn)行 Blink 示例。
按照第 2 步。連接您的設(shè)備和第 3 步。運(yùn)行第 1 部分中的示例:運(yùn)行 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 格式和單行樣式注釋//
已轉(zhuǎn)換為 ThreadX 格式和多行樣式/* */
。
到底是怎么回事?
setup()
上面的代碼演示了如何用Azure RTOS ThreadX替換 Arduino 裸機(jī)單線程方法。loop()
之前的裸機(jī)代碼流程是:
-
setup()
->loop()
-> 無限循環(huán)閃爍邏輯。
ThreadX 新的代碼流程是:
-
setup()
->tx_kernel_enter()
->tx_application_define()
->thread_0_entry()
-> 無限循環(huán) Blink 邏輯。
盡管這種方法仍然保持相同的單線程功能,但現(xiàn)在可以根據(jù)需要添加額外的線程。第 3 部分將演示如何執(zhí)行此操作。
第 3 部分:通過 ThreadX 將多線程應(yīng)用到 Blink 示例
在本節(jié)中,我們將使用單線程 ThreadX Blink 代碼創(chuàng)建一個(gè)多線程版本,該版本也可以讀取串行輸入。
預(yù)計(jì)時(shí)間: 15 分鐘
步驟 1.保存示例。
- 導(dǎo)航到文件 > 另存為。
- 將草圖另存為'Blink_SerialRead_ThreadX' 。
步驟 2. (8) 添加線程堆棧內(nèi)存和線程控制塊以再增加一個(gè)線程。
/* (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 步。對(duì)于要添加的每個(gè)線程,您需要分配其堆棧內(nèi)存并聲明其線程控制塊。 TX_THREAD
Step 3. (9) 定義新線程的入口函數(shù)thread_1_entry()
。將函數(shù)定義放在 之后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 步。每個(gè)線程都需要一個(gè)用戶定義的入口函數(shù)來執(zhí)行線程邏輯。
Step 4. (10) 將串行讀取邏輯添加到線程的入口函數(shù)中。
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);
}
}
}
到底是怎么回事?
串行讀取邏輯從串行輸入接收字節(jié)并將它們打印到串行監(jiān)視器。請(qǐng)注意,此邏輯放在 中while(1)
,但串行初始化Serial.begin()
函數(shù)沒有。因?yàn)槌跏蓟恍枰l(fā)生一次,所以放在前面while(1)
。或者,它可以放在setup()
之前tx_kernel_enter()
。
第 5 步。(11) 使用 . 創(chuàng)建新線程tx_thread_create()
。在tx_application_define()
創(chuàng)建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步。 在所使用的論點(diǎn)中發(fā)現(xiàn)了差異。注意命名如何改變以反映: thread_1
-
&thread_1
: 指向定義的線程控制塊的指針。 -
"thread_1"
: 線程名稱(即,指向名稱的指針)。 -
thread_1_entry
:用戶自定義線程入口函數(shù)。 -
thread_1_stack
: 指向線程堆棧開始的指針。
另一個(gè)改變的參數(shù)集是優(yōu)先級(jí)和搶占閾值:
-
4
: 線程的優(yōu)先級(jí)。 -
4
:線程的搶占閾值。
因?yàn)?/font>4的優(yōu)先級(jí)低于1 ,thread_0
所以將首先執(zhí)行,并且只有在它掛起時(shí)(tx_thread_sleep()
),調(diào)度程序才會(huì)執(zhí)行行中的下一個(gè)線程(thread_1
)。一旦thread_0
完成暫停,調(diào)度程序?qū)屨?/font>thread_1
并返回執(zhí)行thread_0
。
保持不變的論點(diǎn)是:
-
0
: 線程的入口輸入。 -
THREAD_STACK_SIZE
:線程堆棧的大?。ㄒ宰止?jié)為單位)。 -
TX_NO_TIME_SLICE
: 時(shí)間片被禁用。 -
TX_AUTO_START
: 線程自動(dòng)啟動(dòng)。
步驟 6.使用 Azure RTOS ThreadX 運(yùn)行多線程 Blink 示例。
- 按照第 2 步。連接您的設(shè)備和第 3 步。運(yùn)行第 1 部分中的示例:運(yùn)行 Arduino Blink 示例。
- 觀察 LED 每 1 秒閃爍一次。
- 導(dǎo)航到工具 > SerialMonitor 。
- 輸入你好閃爍!進(jìn)入串行輸入線。
- 選擇“發(fā)送” 。
深潛
代碼
/* (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 格式和單行樣式注釋//
已轉(zhuǎn)換為 ThreadX 格式和多行樣式/* */
。
到底是怎么回事?
上面的代碼演示了如何使用 Azure RTOS ThreadX 向 Arduino 應(yīng)用程序添加額外的線程。一個(gè)線程使 LED 閃爍,而另一個(gè)線程接收串行輸入并將其打印到串行監(jiān)視器。線程對(duì)于同時(shí)且彼此獨(dú)立地執(zhí)行不同的任務(wù)非常有幫助。
盡管本教程中沒有演示,但線程也可以通過同步和相互通信。當(dāng)程序需要隨時(shí)接收傳入數(shù)據(jù)但也需要對(duì)其進(jìn)行處理時(shí),這可能很有用。這兩個(gè)任務(wù)可以分成兩個(gè)線程。
我們希望在未來的 Azure RTOS ThreadX for Arduino 教程中介紹這些和其他概念。敬請(qǐng)關(guān)注!
?
- 適用于Arduino的Adafruit NeoPixel Shield
- 適用于Arduino YUN、UNO和Nano的DIN導(dǎo)軌安裝
- 適用于PC的ARDUINO控制游戲手柄(有線)
- 適用于Azure Sphere的WS2812B LED燈帶驅(qū)動(dòng)器
- 適用于ESP32的AWS IoT Arduino庫
- 適用于Arduino Uno板的簡(jiǎn)單計(jì)時(shí)器
- DB459_適用于 STM32Cube 的 STM32L4 系列和 STM32L4+ 系列 Azure? RTOS 軟件擴(kuò)展
- DB4594_STM32F7 系列用于 STM32Cube 的 Azure? RTOS 軟件擴(kuò)展
- 適用于PC和Android的Arduino游戲控制器
- 首款適用于Arduino的藍(lán)牙家庭自動(dòng)化擴(kuò)展板
- ThreadX(三)------線程thread
- Azure RTOS NetX Duo嵌入式TCP/IP網(wǎng)絡(luò)堆棧 13次下載
- 高性能嵌入式堆棧Azure PTOS USBX概述 10次下載
- 嵌入式RTOS ThreadX 用戶指南手冊(cè)ver.4.0c 33次下載
- 適用于Microsoft_Azure的NetApp_ONTAP_ 0次下載
- RTOS中的線程、進(jìn)程和協(xié)程詳解 1561次閱讀
- 使用MM32F3270基于Azure RTOS定時(shí)器組的應(yīng)用 1477次閱讀
- 使用MM32F3270基于Azure RTOS動(dòng)態(tài)內(nèi)存管理的應(yīng)用 792次閱讀
- 使用MM32F3270基于Azure RTOS信號(hào)量的應(yīng)用 866次閱讀
- 如何將ThreadX移植到STM32平臺(tái) 1493次閱讀
- RTOS多線程必須要MMU才行? 2166次閱讀
- 如何使用Tracealyzer的流模式來跟蹤ThreadX應(yīng)用 1261次閱讀
- Azure Kinect Senser DK套件簡(jiǎn)介 3433次閱讀
- 如何編寫適用于Go項(xiàng)目的Makefile 2074次閱讀
- 基于一種適用于SSL產(chǎn)品的LED控制電路設(shè)計(jì) 1071次閱讀
- 適用于大功率動(dòng)力馬達(dá)逆變器的IGBT模塊 7476次閱讀
- 主打嵌入式應(yīng)用的中高階RTOS 5561次閱讀
- 適用于TI處理器的可擴(kuò)展Linux和TI RTOS解決方案 5443次閱讀
- 淺談Arduino和樹莓派的區(qū)別 2.1w次閱讀
- 適用于RS232串口的溫度檢測(cè)電路 2597次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多