簡(jiǎn) 介
Azure RTOS ThreadX 是 Microsoft 提供的高級(jí)工業(yè)級(jí)實(shí)時(shí)操作系統(tǒng) (RTOS)。它是專門為深度嵌入式實(shí)時(shí) IoT 應(yīng)用程序設(shè)計(jì)的。Azure RTOS ThreadX 提供高級(jí)計(jì)劃、通信、同步、計(jì)時(shí)器、內(nèi)存管理和中斷管理功能。此外,Azure RTOS ThreadX 具有許多高級(jí)功能,包括 picokernel? 體系結(jié)構(gòu)、preemption-threshold? 計(jì)劃、event-chaining?、執(zhí)行分析、性能指標(biāo)和系統(tǒng)事件跟蹤。Azure RTOS ThreadX 非常易于使用,適用于要求極其苛刻的嵌入式應(yīng)用程序。Azure RTOS ThreadX 在各種產(chǎn)品(包括消費(fèi)者設(shè)備、醫(yī)療電子設(shè)備和工業(yè)控制設(shè)備)上的部署次數(shù)已達(dá)數(shù)十億次。
具體的介紹和用戶指南可以參考:
https://docs.microsoft.com/zh-cn/azure/rtos/threadx/
在前文描述移植基本內(nèi)核的基礎(chǔ)上,本文描述了如何基于MM32F3270系列MCU結(jié)合Azure RTOS ThreadX應(yīng)用事件標(biāo)志組的使用,引導(dǎo)用戶理解Azure RTOS ThreadX事件標(biāo)志組的功能。
表 1 適用系列型號(hào)

1、移植應(yīng)用的準(zhǔn)備
1.1 硬件開(kāi)發(fā)板的準(zhǔn)備
該移植過(guò)程中應(yīng)用的開(kāi)發(fā)板為MM32的EVB-F3270,板載MM32F3273G9P。

EVB-F3270 (MM32F3273G9P)的簡(jiǎn)要參數(shù):
● Arm Cortex-M3 內(nèi)核
● 板載 MM32F3273G9P(LQFP144)
● 4 x Key、4 x LED
● I2S Speaker
● TF-Card
● Ethernet PHY
1.2 軟件的準(zhǔn)備
庫(kù)函數(shù)和例程(Lib Samples)
該移植過(guò)程中應(yīng)用的 Firmware 分別為 MM32F3270 庫(kù)函數(shù)和例程,下載地址:
https://www.mindmotion.com.cn/products/mm32mcu/mm32f/mm32f_mainstream/mm32f3270/

Azure RTOS ThreadX(源碼)
ThreadX 的源代碼已經(jīng)開(kāi)放,我們可以從 ThreadX 公共源代碼存儲(chǔ)庫(kù)獲取 Azure RTOS ThreadX,網(wǎng)址為:https://github.com/azure-rtos/threadx/
具體的商用使用條件參考Azure的許可證說(shuō)明:
https://www.microsoft.com/en-us/legal/intellectualproperty/tech-licensing/programs?msclkid=f7ab4ff3afa011ec90a79366a52034fa activetab=pivot1:primaryr11
Microsoft publishes the Azure RTOS source code to GitHub. No license is required to install and use the software for internal development, testing, and evaluation purposes. A license is required to distribute or sell components and devices unless using Azure RTOS licensed hardware.
Azure RTOS 何時(shí)需要許可證?
Microsoft 將 Azure RTOS 源代碼發(fā)布到 GitHub。安裝和使用該軟件進(jìn)行內(nèi)部開(kāi)發(fā)、測(cè)試和評(píng)估無(wú)需許可證。分發(fā)或銷售組件和設(shè)備需要許可證,除非使用 Azure RTOS 許可的硬件。
ThreadX 安裝
可以通過(guò)將 GitHub 存儲(chǔ)庫(kù)克隆到本地計(jì)算機(jī)來(lái)安裝 ThreadX。下面是用于在 PC 上創(chuàng)建 ThreadX 存儲(chǔ)庫(kù)的克隆的典型語(yǔ)法。
shell復(fù)制
git clone https://github.com/azure-rtos/threadx
或者,也可以使用 GitHub 主頁(yè)上的“下載”按鈕來(lái)下載存儲(chǔ)庫(kù)的副本。
下載后的倉(cāng)庫(kù)代碼目錄列表如下:

Azure RTOS ThreadX(源碼)支持的開(kāi)發(fā)環(huán)境
ThreadX 內(nèi)核提供好了各種主流硬件平臺(tái)和軟件平臺(tái)的移植文件,以Cortex_M3為例,可以支持以下六種開(kāi)發(fā)環(huán)境:

本次移植過(guò)程使用Azure RTOS原有的sample_threadx.c Samples為例子,稍作修改,演示了事件標(biāo)志組的功能與應(yīng)用。
2、Threadx 事件標(biāo)志組的應(yīng)用
該章節(jié)介紹了事件標(biāo)志組應(yīng)用實(shí)現(xiàn)的過(guò)程和注意事項(xiàng),該演示程序可在MM32F3273G9P的EVB-F3270上運(yùn)行。
此示例在文件 main_event_flags_demo.c 中定義,旨在說(shuō)明如何在嵌入式多線程環(huán)境中使用事件標(biāo)志組,實(shí)現(xiàn)任務(wù)之間的數(shù)據(jù)信號(hào)傳遞與中斷或任務(wù)同步的相互關(guān)系。
2.1 Azure Threadx event簡(jiǎn)介
事件標(biāo)志是Threadx線程同步的一個(gè)強(qiáng)大工具。事件標(biāo)志可以被任何線程設(shè)置或清除,也可以被任何線程檢查。線程可以在等待設(shè)置某些事件標(biāo)志組時(shí)掛起。
每個(gè)事件標(biāo)志用1 bit表示,事件標(biāo)志以32個(gè)為一組排列,組成一個(gè)事件標(biāo)志組。之后的所有操作都是以組為單位。

線程可以同時(shí)對(duì)一個(gè)組中的所有32個(gè)事件標(biāo)志進(jìn)行操作。
要設(shè)置或清除事件標(biāo)志組,可以使用tx_event_flags_set服務(wù)。
使用tx_event_flags_get服務(wù)可以“獲取”事件標(biāo)志組。
獲取事件標(biāo)志時(shí),線程可以等待一個(gè)事件標(biāo)志(一段時(shí)間或永久等待),直到該事件標(biāo)志被另一個(gè)線程或中斷設(shè)置為1(set狀態(tài))。
對(duì)于嵌入式應(yīng)用來(lái)說(shuō),就有點(diǎn)像對(duì)一個(gè)個(gè)的寄存器位進(jìn)行“ ”和“|”操作。
使用事件標(biāo)志組可以有效的解決中斷服務(wù)程序和任務(wù)之間的同步問(wèn)題。

2.2 Azure Threadx event的結(jié)構(gòu)體
Event的結(jié)構(gòu)體
typedef struct TX_EVENT_FLAGS_GROUP_STRUCT
{
/* Define the event flags group ID used for error checking. */
ULONG tx_event_flags_group_id;
/* Define the event flags group's name. */
CHAR *tx_event_flags_group_name;
/* Define the actual current event flags in this group. A zero in a
particular bit indicates the event flag is not set. */
ULONG tx_event_flags_group_current;
/* Define the reset search flag that is set when an ISR sets flags during
the search of the suspended threads list. */
UINT tx_event_flags_group_reset_search;
/* Define the event flags group suspension list head along with a count of
how many threads are suspended. */
struct TX_THREAD_STRUCT
*tx_event_flags_group_suspension_list;
UINT tx_event_flags_group_suspended_count;
/* Define the created list next and previous pointers. */
struct TX_EVENT_FLAGS_GROUP_STRUCT
*tx_event_flags_group_created_next,
*tx_event_flags_group_created_previous;
/* Define the delayed clearing event flags. */
ULONG tx_event_flags_group_delayed_clear;
#ifdef TX_EVENT_FLAGS_ENABLE_PERFORMANCE_INFO
/* Define the number of event flag sets. */
ULONG tx_event_flags_group_performance_set_count;
/* Define the number of event flag gets. */
ULONG tx_event_flags_group__performance_get_count;
/* Define the number of event flag suspensions. */
ULONG tx_event_flags_group___performance_suspension_count;
/* Define the number of event flag timeouts. */
ULONG tx_event_flags_group____performance_timeout_count;
#endif
#ifndef TX_DISABLE_NOTIFY_CALLBACKS
/* Define the application callback routine used to notify the application when
an event flag is set. */
VOID (*tx_event_flags_group_set_notify)(struct TX_EVENT_FLAGS_GROUP_STRUCT *group_ptr);
#endif
/* Define the port extension in the event flags group control block. This
is typically defined to whitespace in tx_port.h. */
TX_EVENT_FLAGS_GROUP_EXTENSION
} TX_EVENT_FLAGS_GROUP;
Event flags包含成員的含義:

2.3 Azure Threadx event的主要函數(shù)與功能
事件標(biāo)志組的主要函數(shù)

2.4 事件標(biāo)志組的應(yīng)用演示
2.4.1 工程目錄的建立
打開(kāi)目標(biāo)工程文件夾“MM32F3270Project”:

移除原有樣例.c 文件sample_threadx.c:

參考sample_threadx.c建立main_event_flags_demo.c文件,并添加hardware目錄中的led.c到工程項(xiàng)目中。

2.4.2 創(chuàng)建事件標(biāo)志組tx_event_flags_create
聲明需要使用的事件標(biāo)志組變量。
調(diào)用tx_event_flags_create, 建立一個(gè)事件標(biāo)志組。
創(chuàng)建一個(gè)待使用的事件標(biāo)志組
#include "tx_api.h" #define DEMO_STACK_SIZE 1024 /* Define the ThreadX object control blocks... */ TX_THREAD thread_0; TX_THREAD thread_5; TX_EVENT_FLAGS_GROUP event_flags_0; /* Define what the initial system looks like. */ void tx_application_define(void *first_unused_memory) { /* Create the main thread. */ tx_thread_create( thread_0, "thread 0", thread_0_entry, 0, thread_0_stack, DEMO_STACK_SIZE, 1, 1, TX_NO_TIME_SLICE, TX_AUTO_START); /* Create thread 5. This thread simply pends on an event flag which will be set by thread_0. */ tx_thread_create( thread_5, "thread 5", thread_5_entry, 5, thread_5_stack, DEMO_STACK_SIZE, 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START); /* Create the event flags group used by threads 0 and 5. */ tx_event_flags_create( event_flags_0, "event flags 0"); }
函數(shù)原型:
tx_event_flags_create函數(shù)原型
UINT _tx_event_flags_create(TX_EVENT_FLAGS_GROUP *group_ptr, CHAR *name_ptr)
參數(shù):
● group_ptr:指向事件標(biāo)志組控制塊的指針。
● name_ptr:指向事件標(biāo)志組名稱的指針。
返回值:
● TX_SUCCESS:(0X00) 成功創(chuàng)建事件組。
● TX_GROUP_ERROR:(0x06) 事件組指針無(wú)效。指針為 NULL 或事件組已創(chuàng)建。
● NX_CALLER_ERROR:(0x13) 此服務(wù)的調(diào)用方無(wú)效。
應(yīng)用中該實(shí)現(xiàn)函數(shù):
tx_event_flags_create( event_flags_0, "event flags 0");
A. 第1個(gè)參數(shù)是事件標(biāo)志組引用的指針,引用聲明的事件標(biāo)注“event_flags_0”指向的地址。
B. 第2個(gè)參數(shù)是事件標(biāo)志組的名字,字符串值為" event flags 0"。
2.4.3 創(chuàng)建一個(gè)任務(wù)用于發(fā)送事件標(biāo)志組
在此建立一個(gè)定時(shí)發(fā)送一個(gè)事件標(biāo)志組的簡(jiǎn)單任務(wù),發(fā)送完成,發(fā)送任務(wù)計(jì)數(shù)值加一:
創(chuàng)建一個(gè)發(fā)送事件標(biāo)志組的任務(wù)
/* Define the test threads. */
void thread_0_entry(ULONG thread_input)
{
UINT status;
/* This thread simply sits in while-forever-sleep loop. */
while(1)
{
/* Increment the thread counter. */
thread_0_counter++;
/* Sleep for 10 ticks. */
tx_thread_sleep(10);
/* Set event flag 0 to wakeup thread 5. */
status = tx_event_flags_set( event_flags_0, 0x1, TX_OR);
/* Check status. */
if (status != TX_SUCCESS)
break;
}
}
函數(shù)原型:
_tx_event_flags_set函數(shù)原型
UINT _tx_event_flags_set(TX_EVENT_FLAGS_GROUP *group_ptr, ULONG flags_to_set, UINT set_option)
參數(shù):
● group_ptr:指向以前創(chuàng)建的事件標(biāo)志組控制塊的指針。
● flags_to_set:根據(jù)所選的 set-option,指定要設(shè)置或清除的事件標(biāo)志。
● set_option:指定將所指定的事件標(biāo)志與該組的當(dāng)前事件標(biāo)志進(jìn)行“AND”或“OR”運(yùn)算。以下是有效的選擇:
- TX_AND (0x02)
- TX_OR (0x00)
如果選擇 TX_AND,則會(huì)指定將所指定的事件標(biāo)志與該組的當(dāng)前事件標(biāo)志進(jìn)行“AND”運(yùn)算。此選項(xiàng)通常用于清除組中的事件標(biāo)志。否則,如果指定了 TX_OR,則對(duì)所指定的事件標(biāo)志與該組的當(dāng)前事件標(biāo)志進(jìn)行“OR”運(yùn)算。
返回值:
● TX_SUCCESS:(0X00) 成功設(shè)置事件標(biāo)志。
● TX_GROUP_ERROR:(0x06) 指向事件標(biāo)志組的指針無(wú)效。
● TX_OPTION_ERROR:(0x08) 指定的 set-option 無(wú)效。
應(yīng)用中該實(shí)現(xiàn)函數(shù):
status = tx_event_flags_set( event_flags_0, 0x1, TX_OR);
A. 第1個(gè)參數(shù)是事件標(biāo)志組引用的指針,引用聲明的事件標(biāo)注“event_flags_0”指向的地址。
B. 第2個(gè)參數(shù)是事件標(biāo)志組的名字,字符串值為" event flags 0"。
返回值
C. 第3個(gè)參數(shù)是TX_OR,則對(duì)所指定的事件標(biāo)志與該組的當(dāng)前事件標(biāo)志進(jìn)行“OR”運(yùn)算。
2.4.4 創(chuàng)建一個(gè)任務(wù)接收事件標(biāo)志組
在此建立一個(gè)任務(wù),實(shí)現(xiàn)接收收事件標(biāo)志組,接收事件設(shè)置值成功,接收任務(wù)計(jì)數(shù)值加一:
創(chuàng)建一個(gè)接收事件標(biāo)志組任務(wù)
void thread_5_entry(ULONG thread_input)
{
UINT status;
ULONG actual_flags;
/* This thread simply waits for an event in a forever loop. */
while(1)
{
/* Increment the thread counter. */
thread_5_counter++;
/* Wait for event flag 0. */
status = tx_event_flags_get( event_flags_0, 0x1, TX_OR_CLEAR,
actual_flags, TX_WAIT_FOREVER);
/* Check status. */
if ((status != TX_SUCCESS) || (actual_flags != 0x1))
break;
}
}
函數(shù)原型:
_tx_event_flags_set函數(shù)原型
UINT _tx_event_flags_get(TX_EVENT_FLAGS_GROUP *group_ptr, ULONG requested_flags,
UINT get_option, ULONG *actual_flags_ptr, ULONG wait_option)
參數(shù):
● group_ptr:指向以前創(chuàng)建的事件標(biāo)志組的指針。
● requested_flags:32 位無(wú)符號(hào)變量,表示請(qǐng)求的事件標(biāo)志。
● get_option:指定是否需要所有或任何請(qǐng)求的事件標(biāo)志。以下是有效的選擇:
- TX_AND (0x02)
- TX_AND_CLEAR (0x03)
- TX_OR (0x00)
- TX_OR_CLEAR (0x01)
如果選擇 TX_AND 或 TX_AND_CLEAR,則會(huì)指定所有事件標(biāo)志在組中都必須存在。如果選擇 TX_OR 或 TX_OR_CLEAR,則會(huì)指定任何事件標(biāo)志都符合要求。如果指定 TX_AND_CLEAR 或 TX_OR_CLEAR,則會(huì)清除滿足請(qǐng)求的事件標(biāo)志(設(shè)置為零)。
● actual_flags_ptr:指向放置檢索到的事件標(biāo)志的位置這一目標(biāo)的指針。注意,實(shí)際獲得的標(biāo)志可能包含沒(méi)有請(qǐng)求的標(biāo)志。
● wait_option:定義未設(shè)置所選事件標(biāo)志時(shí)服務(wù)的行為方式。
等待選項(xiàng)的定義如下:
- TX_NO_WAIT (0x00000000) - 如果選擇 TX_NO_WAIT,則無(wú)論此服務(wù)是否成功,都會(huì)導(dǎo)致立即從此服務(wù)返回。如果從非線程(例如初始化、計(jì)時(shí)器或 ISR)調(diào)用服務(wù),則這是唯一有效的選項(xiàng)。
- TX_WAIT_FOREVER 超時(shí)值 (0xFFFFFFFF) - 選擇 TX_WAIT_FOREVER 會(huì)導(dǎo)致發(fā)出調(diào)用的線程無(wú)限期掛起,直到事件標(biāo)志可用為止。
- 超時(shí)值(0x00000001 至 0xFFFFFFFE)- 如果選擇一個(gè)數(shù)值(1 到 0xFFFFFFFE),則會(huì)指定在等待事件標(biāo)志時(shí)發(fā)出調(diào)用的線程保持掛起的最大計(jì)時(shí)器時(shí)鐘周期數(shù)。
返回值:
● TX_SUCCESS:(0X00) 成功獲取事件標(biāo)志。
● TX_DELETED:(0x01) 線程掛起時(shí)刪除了事件標(biāo)志組。
● TX_NO_EVENTS:(0X07) 服務(wù)無(wú)法在指定的等待時(shí)間內(nèi)獲取指定的事件。
● TX_WAIT_ABORTED:(0x1A) 掛起狀態(tài)由其他線程、計(jì)時(shí)器或 ISR 中止。
● TX_GROUP_ERROR:(0x06) 事件標(biāo)志組指針無(wú)效。
● TX_PTR_ERROR:(0x03) 指向?qū)嶋H事件標(biāo)志的指針無(wú)效。
● TX_WAIT_ERROR:(0x04) 從非線程調(diào)用時(shí)指定了除 TX_NO_WAIT 以外的等待選項(xiàng)。
● TX_OPTION_ERROR:(0x08) 指定的 get-option 無(wú)效。
應(yīng)用中該實(shí)現(xiàn)函數(shù):
status = tx_event_flags_get( event_flags_0, 0x1, TX_OR_CLEAR, actual_flags, TX_WAIT_FOREVER);
A. 第1個(gè)參數(shù)是事件標(biāo)志組引用的指針,引用聲明的事件標(biāo)注“event_flags_0”指向的地址。
B. 第2個(gè)參數(shù)是根據(jù)所選的 get-option,指定要設(shè)置或清除的事件標(biāo)志等于0x01。
C. 第3個(gè)參數(shù)是TX_OR_CLEAR,則會(huì)判斷指定任何事件標(biāo)志都符合要求,符合后并清除。
3、Threadx 的事件標(biāo)志組應(yīng)用實(shí)現(xiàn)與調(diào)試
3.1 代碼實(shí)現(xiàn)
下載調(diào)試默認(rèn)會(huì)運(yùn)行到main()函數(shù),如下為全部實(shí)現(xiàn)的代碼。
Demo演示代碼
/* This is a small demo of the high-performance ThreadX kernel. It includes examples of six
threads of different priorities, using a message an event flags group. */
#include "tx_api.h"
#define DEMO_STACK_SIZE 1024
/* Define the ThreadX object control blocks... */
TX_THREAD thread_0;
TX_THREAD thread_5;
TX_EVENT_FLAGS_GROUP event_flags_0;
/* Define the counters used in the demo application... */
ULONG thread_0_counter;
ULONG thread_5_counter;
/* Define the thread stacks. */
UCHAR thread_0_stack[DEMO_STACK_SIZE];
UCHAR thread_5_stack[DEMO_STACK_SIZE];
/* Define thread prototypes. */
void thread_0_entry(ULONG thread_input);
void thread_5_entry(ULONG thread_input);
/* Define main entry point. */
int main()
{
/* Enter the ThreadX kernel. */
tx_kernel_enter();
}
/* Define what the initial system looks like. */
void tx_application_define(void *first_unused_memory)
{
/* Create the main thread. */
tx_thread_create( thread_0, "thread 0", thread_0_entry, 0,
thread_0_stack, DEMO_STACK_SIZE,
1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);
/* Create thread 5. This thread simply pends on an event flag which will be set
by thread_0. */
tx_thread_create( thread_5, "thread 5", thread_5_entry, 5,
thread_5_stack, DEMO_STACK_SIZE,
4, 4, TX_NO_TIME_SLICE, TX_AUTO_START);
/* Create the event flags group used by threads 0 and 5. */
tx_event_flags_create( event_flags_0, "event flags 0");
}
/* Define the test threads. */
void thread_0_entry(ULONG thread_input)
{
UINT status;
/* This thread simply sits in while-forever-sleep loop. */
while(1)
{
/* Increment the thread counter. */
thread_0_counter++;
/* Sleep for 10 ticks. */
tx_thread_sleep(10);
/* Set event flag 0 to wakeup thread 5. */
status = tx_event_flags_set( event_flags_0, 0x1, TX_OR);
/* Check status. */
if (status != TX_SUCCESS)
break;
}
}
void thread_5_entry(ULONG thread_input)
{
UINT status;
ULONG actual_flags;
/* This thread simply waits for an event in a forever loop. */
while(1)
{
/* Increment the thread counter. */
thread_5_counter++;
/* Wait for event flag 0. */
status = tx_event_flags_get( event_flags_0, 0x1, TX_OR_CLEAR,
actual_flags, TX_WAIT_FOREVER);
/* Check status. */
if ((status != TX_SUCCESS) || (actual_flags != 0x1))
break;
}
}
3.2 下載與調(diào)試
進(jìn)入調(diào)試模式,可以看到接收事件標(biāo)志組成功。

該demo示例,建立了2個(gè)線程,程序執(zhí)行一個(gè)發(fā)送事件標(biāo)志,另外一個(gè)線程接收事件標(biāo)志,實(shí)現(xiàn)執(zhí)行Task Counter與發(fā)送 接收的Message Counter的累加。
全速運(yùn)行后,可以看到相關(guān)的數(shù)值在變化:

4、小結(jié)
這個(gè)演示程序中,使用了tx_thread_sleep()函數(shù)做了延時(shí),剛好使得發(fā)送事件標(biāo)志組與接收事件標(biāo)志組一一配對(duì),計(jì)數(shù)值累加后都是相等的,說(shuō)明同步成功。
Azure RTOS ThreadX 的使用事件標(biāo)志組可以方便實(shí)現(xiàn)任務(wù)對(duì)任務(wù)或任務(wù)對(duì)中斷的同步,結(jié)合MM32F3270的強(qiáng)大性能,可以實(shí)現(xiàn)Azure RTOS的各種特色功能。
來(lái)源:靈動(dòng)MM32MCU
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理
審核編輯 黃宇
-
RTOS
+關(guān)注
關(guān)注
25文章
866瀏覽量
122979 -
Azure
+關(guān)注
關(guān)注
1文章
130瀏覽量
13685
發(fā)布評(píng)論請(qǐng)先 登錄
基于靈動(dòng)MM32F3270 MCU微控制器的無(wú)線計(jì)量?jī)x表
基于靈動(dòng)MM32F0010微控制器的空氣炸鍋應(yīng)用方案
選擇RTOS的要點(diǎn)
RTOS Crash 問(wèn)題全維度分析與解決指南
基于靈動(dòng)MM32F3270微控制器的監(jiān)護(hù)儀主控方案(MCU微控制器介紹)
靈動(dòng)微MM32F3270微控制器的音頻設(shè)備參考方案
國(guó)產(chǎn)MCU-靈動(dòng)微MM32F0050系列微控制器的簡(jiǎn)單分享
如何使用 NuMaker 板和 Mbed OS 上的連接字符串連接到 Azure IoT?
請(qǐng)問(wèn)編譯純rtos到底是選擇Linux+rtos的sdk編譯only rtos還是直接使用rtos sdk?
如何在Eclipse ThreadX RTOS中集成SystemView
SEGGER SystemView支持Eclipse ThreadX
靈動(dòng)微電子推出全新超值型MM32F0050系列MCU
詳解RTOS中的Hook函數(shù)
移植RT-Thread到靈動(dòng)微MM32F5265開(kāi)發(fā)板教程
使用MM32F3270基于Azure RTOS事件標(biāo)志組的應(yīng)用
評(píng)論