![](http://stamssolution.com/wp-content/uploads/2024/07/640625-1-ggft5.jpg)
Azure RTOS ThreadX on STM32 MCU
前言
目前在最新系列H5/U5/U0 /C071使用STM32CubeMX建置出USB的基底都變成USBX是以Azure RTOS ThreadX 架構去撰寫,變成如果需要使用舊的FreeRTOS會必須自己搬移code相對變得麻煩許多,但因新的Azure RTOS在結構上優化這邊就嘗試研究撰寫整理文章
簡介Azure RTOS
Azure RTOS 的核心是 ThreadX,它是一種即時內核,ThreadX 擁有多種競爭優勢,其中包括多種安全關鍵認證。Microsoft 提供Azure RTOS 也能夠最大限度地減少品質和可靠性問題,大大降低此類問題可能引發的冗長調試會話,總體上有利於 RTOS 用戶。
ST支援與架構
這邊會以主要THREADX架構往下生成
![](https://stamssolution.com/wp-content/uploads/2024/07/image-8.png)
![](https://stamssolution.com/wp-content/uploads/2024/07/image-10.png)
![](https://stamssolution.com/wp-content/uploads/2024/07/image-9.png)
這邊留意Azure RTOS有支援USB PD但ST還未整合完全需要自己寫
USB-PD is supported by ST USBPD library and applications provided in STM32Cube MCU packages. But it is not yet integrated with STM32 Azure® RTOS MW solution.
THREADX簡介
ThreadX 是一個即時作業系統 (RTOS),專為嵌入式系統而設計
- Common mode:包含常見的 RTOS 功能,例如執行緒管理和同步、記憶體池管理、訊息傳遞和事件處理。
- Module mode:一種進階使用模式,允許透過模組管理器即時載入和卸載預先連結的 ThreadX 模組。
![](https://stamssolution.com/wp-content/uploads/2024/07/image-12.png)
![](https://stamssolution.com/wp-content/uploads/2024/07/image-11.png)
![](https://stamssolution.com/wp-content/uploads/2024/07/image-13.png)
- common: 包含所有 ThreadX API 的實現。它還提供一些實用功能,如軟件計時器、性能信息和追踪。
- common_modules: 包含 ThreadX 模組功能的實現,允許動態加載預先鏈接的 ThreadX 模組
- module_lib: 實現了 txm_.c API,應在編寫 ThreadX 模組時使用該 API 代替 tx_.c。
- module_manager: 實現了放置在 ThreadX 核心之上的功能塊,以處理模組加載、卸載、運行等操作。
- ports//: 包含內核調度器的實現,大多是用匯編語言編寫的。
- ports_module//: 包含與模組管理器需求相適應的 ThreadX 模組相關調度器的實現。當啟用 ThreadX 模組時,這個目錄中的文件將取代 port 目錄中的文件。
ThreadX 支援表如下
![](https://stamssolution.com/wp-content/uploads/2024/07/image-14.png)
ThreadX操作
從 main 呼叫 tx_kernel_enter 函數(必須包含「tx_api.h」檔案)
![](https://stamssolution.com/wp-content/uploads/2024/07/image-16.png)
/* 啟動ThreadX核心 */
tx_kernel_enter ();
tx_application_define 的輸入參數是用於執行緒堆疊、佇列和記憶體池的執行時間記憶體分配的第一個可用 RAM 位址
/* Create ThreadOne. */
if (tx_thread_create(&ThreadOne, "Thread One", ThreadOne_Entry, 0,
pointer, THREAD_ONE_STACK_SIZE,
THREAD_ONE_PRIORITY, THREAD_ONE_PREEMPTION_THRESHOLD,
TX_NO_TIME_SLICE, TX_AUTO_START) != TX_SUCCESS)
{
status = TX_THREAD_ERROR;
}
為每個建立的執行緒定義入口函數:
void ThreadOne_Entry(ULONG thread_input)
{
/* User can add their own implementation*/
}