色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>適用于Arduino 101的Azure RTOS ThreadX線程

適用于Arduino 101的Azure RTOS ThreadX線程

2022-10-18 | zip | 0.00 MB | 次下載 | 免費(fèi)

資料介紹

描述

微軟的 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 代碼示例。

先決條件

以下是在 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ù)必安裝最新版本。
librarymanager_azurertos_xkKBCwMBZ5.png?auto=compress%2Cformat&w=740&h=555&fit=max
?

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

  • 導(dǎo)航到工具 > 板:... > 板管理器...
  • 搜索“MKR WiFi 1010” 。
  • 安裝“Arduino SAMD 板(32 位 ARM Cortex-M0+)” 請(qǐng)務(wù)必安裝最新版本。
boardsmanager_mkrwifi1010_qA9rojesgB.png?auto=compress%2Cformat&w=740&h=555&fit=max
?

第 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)入串行輸入線。
serialmonitor_helloblinkyinput_xt1mGvNiTf.png?auto=compress%2Cformat&w=740&h=555&fit=max
?
  • 選擇“發(fā)送”
serialmonitor_helloblinkyoutput_IWczf9sBSJ.png?auto=compress%2Cformat&w=740&h=555&fit=max
?

深潛

代碼

/* (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)注!

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
  2. 1.06 MB  |  532次下載  |  免費(fèi)
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費(fèi)
  5. 3TC358743XBG評(píng)估板參考手冊(cè)
  6. 1.36 MB  |  330次下載  |  免費(fèi)
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費(fèi)
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費(fèi)
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費(fèi)
  13. 7元宇宙底層硬件系列報(bào)告
  14. 13.42 MB  |  182次下載  |  免費(fèi)
  15. 8FP5207XR-G1中文應(yīng)用手冊(cè)
  16. 1.09 MB  |  178次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191187次下載  |  免費(fèi)
  13. 7十天學(xué)會(huì)AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)
主站蜘蛛池模板: 亚洲精品久久久无码AV片软件| 欧美牲交视频免费观看K8经典| 乱精品一区字幕二区| 乌克兰成人性色生活片| 扒开女生尿口| 欧美人与善交大片| 2020亚洲 欧美 国产 日韩| 久久精品国产免费播放| 亚洲精品久久久一区| 国产免费啪嗒啪嗒视频看看| 污污又黄又爽免费的网站| 高清国产免费观看视频在线| 色欲AV人妻精品麻豆AV| 高干紧射H后入| 丝袜足控免费网站xx91| 光棍天堂在线a| 添加一点爱与你电视剧免费观看| 成 人 免费 黄 色 网站无毒下载| 欧美人与动交zOZ0| 动漫美女的阴| 亚洲 欧美 制服 视频二区| 国产主播AV福利精品一区| 亚洲一区二区三区免费看| 精品国产免费第一区二区| 野花日本大全免费观看3中文版| 久久99视热频国只有精品| 在线亚洲免费| 欧洲电影巜肉欲丛林| 动漫美女3d被爆漫画| 西西人体一级裸片| 精品人伦一区二区三区潘金莲| 一品探花论坛| 年轻老师毛茸茸自由性| 敌伦小芳的第一次| 嫩草电影网嫩草影院| 成人午夜剧场| 亚欧成人毛片一区二区三区四区 | 欧美一区二区视频在线观看| 9久久99久久久精品齐齐综合色圆| 日本无修肉动漫在线观看| 国产精品.XX视频.XXTV|