簡 介
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ù)十億次。
在前文描述移植基本內(nèi)核的基礎(chǔ)上,該應(yīng)用手冊(cè)描述了MM32F3270系列MCU結(jié)合Azure RTOS ThreadX定時(shí)器組的使用,引導(dǎo)用戶理解Azure RTOS ThreadX應(yīng)用程序計(jì)時(shí)器功能。
表 1 適用系列型號(hào)
系列 | 芯片型號(hào) | 開發(fā)板 |
MM32F3270 | MM32F3273G9P | EVB-F3270 |
1移植應(yīng)用的準(zhǔn)備
1.1 硬件開發(fā)板的準(zhǔn)備
該移植過程中應(yīng)用的開發(fā)板為MM32的EVB-F3270,板載MM32F3273G9P。
EVB-F3270 (MM32F3273G9P) 的簡要參數(shù):
Arm Cortex-M3 內(nèi)核
板載 MM32F3273G9P(LQFP144)
4 x Key、4 x LED
I2S Speaker
TF-Card
Ethernet PHY
1.2 軟件的準(zhǔn)備
庫函數(shù)和例程(Lib Samples)
該移植過程中應(yīng)用的 Firmware 分別為 MM32F3270 庫函數(shù)和例程。
? ??
Azure RTOS ThreadX(源碼)
ThreadX 的源代碼已經(jīng)開放,我們可以從 ThreadX 公共源代碼存儲(chǔ)庫獲取 Azure RTOS ThreadX,網(wǎng)址為:
https://github.com/azure-rtos/threadx/
Azure RTOS 何時(shí)需要許可證?
Microsoft 將 Azure RTOS 源代碼發(fā)布到 GitHub。安裝和使用該軟件進(jìn)行內(nèi)部開發(fā)、測(cè)試和評(píng)估無需許可證。分發(fā)或銷售組件和設(shè)備需要許可證,除非使用 Azure RTOS 許可的硬件。
ThreadX 安裝
可以通過將 GitHub 存儲(chǔ)庫克隆到本地計(jì)算機(jī)來安裝 ThreadX。下面是用于在 PC 上創(chuàng)建 ThreadX 存儲(chǔ)庫的克隆的典型語法。
shell復(fù)制
git clone https://github.com/azure-rtos/threadx
或者,也可以使用 GitHub 主頁上的“下載”按鈕來下載存儲(chǔ)庫的副本。
下載后的倉庫代碼目錄列表如下:
? ?
Azure RTOS ThreadX(源碼)支持的開發(fā)環(huán)境
ThreadX 內(nèi)核提供好了各種主流硬件平臺(tái)和軟件平臺(tái)的移植文件,以Cortex_M3為例,可以支持以下六種開發(fā)環(huán)境:
本次移植過程使用Azure RTOS原有的sample_threadx.c文件為例,稍作修改,演示定時(shí)器組功能。
2ThreadX定時(shí)器組的應(yīng)用
該章節(jié)介紹動(dòng)態(tài)內(nèi)存管理相關(guān)知識(shí),演示程序可在MM32F3273G9P的EVB-F3270上運(yùn)行。此示例在文件 main_timer_demo.c 中實(shí)現(xiàn),旨在說明如何在嵌入式多線程環(huán)境中使用定時(shí)器組功能。
2.1 定時(shí)器組
2.1.1 應(yīng)用程序計(jì)時(shí)器
快速響應(yīng)異步外部事件是嵌入式實(shí)時(shí)應(yīng)用程序中最重要的功能。但是,其中的許多應(yīng)用程序還必須按預(yù)定的時(shí)間間隔執(zhí)行某些活動(dòng)。
借助 ThreadX 應(yīng)用程序計(jì)時(shí)器,應(yīng)用程序能夠按特定的時(shí)間間隔執(zhí)行應(yīng)用程序 C 函數(shù)。應(yīng)用程序計(jì)時(shí)器也可能只過期一次。這種類型的計(jì)時(shí)器稱為“單次計(jì)時(shí)器”,而重復(fù)間隔計(jì)時(shí)器稱為“定期計(jì)時(shí)器”。
每個(gè)應(yīng)用程序計(jì)時(shí)器都是一個(gè)公用資源。ThreadX 對(duì)如何使用應(yīng)用程序計(jì)時(shí)器沒有任何限制。
2.1.2 計(jì)時(shí)器間隔
在 ThreadX 中,時(shí)間間隔通過定期計(jì)時(shí)器中斷來測(cè)量。每個(gè)計(jì)時(shí)器中斷稱為計(jì)時(shí)器時(shí)鐘周期。計(jì)時(shí)器時(shí)鐘周期之間的實(shí)際時(shí)間由應(yīng)用程序指定,但 10 毫秒是大多數(shù)實(shí)現(xiàn)的標(biāo)準(zhǔn)時(shí)間。定期計(jì)時(shí)器設(shè)置通常位于 tx_initialize_low_level 程序集文件中。
值得一提的是,基礎(chǔ)硬件必須能夠生成定期中斷,應(yīng)用程序計(jì)時(shí)器才會(huì)正常運(yùn)行。在某些情況下,處理器具有內(nèi)置的定期中斷功能。如果處理器沒有此功能,用戶的主板必須包含可生成定期中斷的外圍設(shè)備。
即使沒有定期中斷源,ThreadX 仍可正常工作。但隨后會(huì)禁用所有與計(jì)時(shí)器相關(guān)的處理。這包括時(shí)間切片、掛起超時(shí)和計(jì)時(shí)器服務(wù)。
2.1.3 計(jì)時(shí)器準(zhǔn)確性
計(jì)時(shí)器過期時(shí)間根據(jù)時(shí)鐘周期指定。達(dá)到每個(gè)計(jì)時(shí)器時(shí)鐘周期時(shí),指定到期值將減一。由于應(yīng)用程序計(jì)時(shí)器可在計(jì)時(shí)器中斷(或計(jì)時(shí)器時(shí)鐘周期)之前啟用,因此,實(shí)際過期時(shí)間可能會(huì)提前一個(gè)時(shí)鐘周期。
如果計(jì)時(shí)器時(shí)鐘周期速率為 10 毫秒,應(yīng)用程序計(jì)時(shí)器可能會(huì)提前 10 毫秒過期。與 1 秒計(jì)時(shí)器相比,這對(duì) 10 毫秒計(jì)時(shí)器更重要。當(dāng)然,增加計(jì)時(shí)器中斷頻率會(huì)減少此誤差范圍。
2.1.4 計(jì)時(shí)器執(zhí)行
應(yīng)用程序計(jì)時(shí)器按照其激活的順序執(zhí)行。例如,如果創(chuàng)建了三個(gè)具有相同過期值的計(jì)時(shí)器并已激活,這些計(jì)時(shí)器對(duì)應(yīng)的過期函數(shù)將保證按它們激活的順序執(zhí)行。
2.1.5 創(chuàng)建應(yīng)用程序計(jì)時(shí)器
應(yīng)用程序計(jì)時(shí)器由應(yīng)用程序線程在初始化期間或運(yùn)行時(shí)創(chuàng)建。應(yīng)用程序中應(yīng)用程序計(jì)時(shí)器的數(shù)量沒有限制。
2.1.6 運(yùn)行時(shí)應(yīng)用程序計(jì)時(shí)器性能信息
ThreadX 提供可選的運(yùn)行時(shí)應(yīng)用程序計(jì)時(shí)器性能信息。如果 ThreadX 庫和應(yīng)用程序是在定義 TX_TIMER_ENABLE_PERFORMANCE_INFO 的情況下生成的,ThreadX 會(huì)累積以下信息。
整個(gè)系統(tǒng)的總數(shù):
激活數(shù)
停用數(shù)
重新激活(定期計(jì)時(shí)器)
expirations
過期調(diào)整數(shù)
每個(gè)應(yīng)用程序計(jì)時(shí)器的總數(shù):
激活數(shù)
停用數(shù)
重新激活(定期計(jì)時(shí)器)
expirations
過期調(diào)整數(shù)
此信息在運(yùn)行時(shí)通過 tx_timer_performance_info_get 和 tx_timer_performance_system_info_get 服務(wù)提供。應(yīng)用程序計(jì)時(shí)器性能信息在確定應(yīng)用程序是否正常運(yùn)行時(shí)非常有用。此信息對(duì)于優(yōu)化應(yīng)用程序也很有用。
2.1.7 應(yīng)用程序計(jì)時(shí)器控制塊 TX_TIMER
每個(gè)應(yīng)用程序計(jì)時(shí)器的特征都可在其控制塊中找到。該控制塊包含諸如 32 位過期標(biāo)識(shí)值等有用信息。此結(jié)構(gòu)在 tx_api.h 文件中定義。
應(yīng)用程序計(jì)時(shí)器控制塊可以位于內(nèi)存中的任意位置,但最常見的是通過在任何函數(shù)的作用域外部定義該控件塊來使其成為全局結(jié)構(gòu)。
2.1.8 計(jì)時(shí)器過多
默認(rèn)情況下,應(yīng)用程序計(jì)時(shí)器在優(yōu)先級(jí)為 0 時(shí)運(yùn)行的隱藏系統(tǒng)線程中執(zhí)行,該線程的優(yōu)先級(jí)通常比任何應(yīng)用程序線程都高。因此,在應(yīng)用程序計(jì)時(shí)器內(nèi)進(jìn)行處理應(yīng)保持最小值。
如果可能,還應(yīng)盡可能避免使用在每個(gè)時(shí)鐘周期過期的計(jì)時(shí)器。這種情況可能導(dǎo)致應(yīng)用程序的開銷過大。
如前所述,應(yīng)用程序計(jì)時(shí)器在隱藏的系統(tǒng)線程中執(zhí)行。因此,請(qǐng)不要在應(yīng)用程序計(jì)時(shí)器的過期函數(shù)內(nèi)執(zhí)行任何 ThreadX 服務(wù)調(diào)用時(shí)選擇掛起。
2.1.9 相對(duì)時(shí)間
除了前面所述的應(yīng)用程序計(jì)時(shí)器,ThreadX 還提供單個(gè)連續(xù)遞增的 32 位時(shí)鐘周期計(jì)數(shù)器。每次發(fā)生計(jì)時(shí)器中斷時(shí),時(shí)鐘周期計(jì)數(shù)器或時(shí)間就會(huì)加一。
應(yīng)用程序可以通過分別調(diào)用 tx_time_get 和 tx_time_set 來讀取或設(shè)置此 32 位計(jì)數(shù)器。此時(shí)鐘周期計(jì)數(shù)器的使用完全由應(yīng)用程序確定。ThreadX 不在內(nèi)部使用此計(jì)時(shí)器。
2.2 Azure ThreadX 定時(shí)器組的相關(guān)函數(shù)
tx_timer_create 創(chuàng)建應(yīng)用程序計(jì)時(shí)器
UINTtx_timer_create( TX_TIMER*timer_ptr, CHAR*name_ptr, VOID(*expiration_function)(ULONG), ULONGexpiration_input, ULONGinitial_ticks, ULONGreschedule_ticks, UINTauto_activate);
說明
此服務(wù)創(chuàng)建具有指定過期函數(shù)和定期的應(yīng)用程序計(jì)時(shí)器。
參數(shù)
timer_ptr:
指向計(jì)時(shí)器控制塊的指針。
name_ptr:
指向計(jì)時(shí)器名稱的指針。
expiration_function:
在計(jì)時(shí)器過期時(shí)要調(diào)用的應(yīng)用程序函數(shù)。
expiration_input:
在計(jì)時(shí)器過期時(shí)要傳遞到過期函數(shù)的輸入。
initial_ticks:
指定計(jì)時(shí)器過期的初始時(shí)鐘周期數(shù)。合法值的范圍為 1 至 0xFFFFFFFF。
reschedule_ticks:
指定第一個(gè)計(jì)時(shí)器過期后所有計(jì)時(shí)器過期的時(shí)鐘周期數(shù)。如果此參數(shù)為 0,則計(jì)時(shí)器是一次性的。否則,對(duì)于周期性計(jì)時(shí)器,合法值的范圍為 1 至 0xFFFFFFFF。
備注
一次性計(jì)時(shí)器過期后,必須通過 tx_timer_change 將其重置,然后才能再次激活。
auto_activate:
確定創(chuàng)建期間是否自動(dòng)激活計(jì)時(shí)器。如果此值為 TX_AUTO_ACTIVATE (0x01),則激活計(jì)時(shí)器。否則,如果選擇了值 TX_NO_ACTIVATE (0x00),則所創(chuàng)建的計(jì)時(shí)器處于非活動(dòng)狀態(tài)。在這種情況下,隨后需要調(diào)用 tx_timer_activate 服務(wù)來實(shí)際啟動(dòng)計(jì)時(shí)器。
返回值
TX_SUCCESS:
(0X00) 成功創(chuàng)建應(yīng)用程序計(jì)時(shí)器。
TX_TIMER_ERROR:
(0X15) 應(yīng)用程序計(jì)時(shí)器指針無效。指針為 NULL 或已創(chuàng)建計(jì)時(shí)器。
TX_TICK_ERROR:
(0x16) 為初始時(shí)鐘周期提供的值無效(零)。
TX_ACTIVATE_ERROR:
(0x17) 選擇的激活無效。
NX_CALLER_ERROR:
(0x13) 此服務(wù)的調(diào)用方無效。
示例
TX_TIMERmy_timer; UINTstatus; /*Createanapplicationtimerthatexecutes "my_timer_function"after100ticksinitiallyandthen afterevery25ticks.Thistimerisspecifiedtostart immediately!*/ status=tx_timer_create(&my_timer,"my_timer_name", my_timer_function,0x1234,100,25, TX_AUTO_ACTIVATE); /*IfstatusequalsTX_SUCCESS,my_timer_functionwill becalled100timertickslaterandthencalledevery 25timerticks.Notethatthevalue0x1234ispassedto my_timer_functioneverytimeitiscalled.*/
另請(qǐng)參閱
tx_timer_activate
tx_timer_change
tx_timer_deactivate
tx_timer_delete
tx_timer_info_get
tx_timer_performance_info_get
tx_timer_performance_system_info_get
2.3 定時(shí)器組的應(yīng)用演示
2.3.1 工程目錄的建立
打開目標(biāo)工程文件夾“MM32F3270Project”:
移除原有樣例.c 文件sample_threadx.c:
參考sample_threadx.c建立main_timer_demo.c文件,并添加hardware目錄中的led.c、key.c到工程項(xiàng)目中。
3ThreadX的定時(shí)器組應(yīng)用
3.1 代碼實(shí)現(xiàn)
下載調(diào)試默認(rèn)會(huì)運(yùn)行到main()函數(shù),如下為全部實(shí)現(xiàn)的代碼。
Demo演示代碼
/*Thisisasmalldemoofthehigh-performanceThreadXkernel.Itincludesexamplesofsix threadsofdifferentpriorities,usingamessagequeue,semaphore,andaneventflagsgroup.*/ #include"tx_api.h" #include"delay.h" #include"led.h" #include"key.h" #include"uart.h" #defineDEMO_STACK_SIZE1024 #defineTHREAD0_PRIORITY1 #defineTHREAD0_PREEMPTION_THRESHOLD1 /*DefinetheThreadXobjectcontrolblocks...*/ TX_THREADthread_0; TX_TIMERMyTimer; /*Definethecountersusedinthedemoapplication...*/ ULONGthread_0_counter; /*Definethethreadstacks.*/ UCHARthread_0_stack[DEMO_STACK_SIZE]; /*Definethreadprototypes.*/ voidthread_0_entry(ULONGthread_input); volatileunsignedintbootloop; voidSystem_Init(void); voidAppThreadCreate(void); voidAppModuleCreate(void); /*Definemainentrypoint.*/ intmain() { System_Init(); /*EntertheThreadXkernel.*/ tx_kernel_enter(); } /*Definewhattheinitialsystemlookslike.*/ voidtx_application_define(void*first_unused_memory) { AppThreadCreate(); AppModuleCreate(); } voidSystem_Init(void) { DELAY_Init();//cannotusesystick LED_Init(); KEY_Init(); CONSOLE_Init(115200); printf("!!!Start!!! "); } voidAppThreadCreate(void) { /*Createthread0.*/ tx_thread_create( &thread_0, "thread0", thread_0_entry, 0, thread_0_stack, DEMO_STACK_SIZE, THREAD0_PRIORITY, THREAD0_PREEMPTION_THRESHOLD, TX_NO_TIME_SLICE, TX_AUTO_START); } voidAppModuleCreate(void) { /*Createatimergroup.*/ tx_timer_create(&MyTimer, "MyTimer", TimerCallback, 0,/*Theparameterspassed*/ 100,/*Settheinitialdelayfortimertimeoverflow*/ 1000,/*Setthetimerrunperiodaftertheinitialdelay*/ TX_AUTO_ACTIVATE);/*Activatethetimer*/ } /*Thecallbackfunctionforthetimergroup.*/ voidTimerCallback(ULONGthread_input) { LED2_TOGGLE(); } /*Definethetestthreads.*/ voidthread_0_entry(ULONGthread_input) { /*ThisthreadsimplycontrolsLEDflashingtoindicatethatthesystemisrunning*/ while(1) { /*Incrementthethreadcounter.*/ thread_0_counter++; LED1_TOGGLE(); /*Sleepfor300ticks.*/ tx_thread_sleep(300); } }
3.2 下載與調(diào)試
運(yùn)行程序,板載LED1閃爍,表示當(dāng)前系統(tǒng)正在運(yùn)行。
觀察LED2間隔1s閃爍。
程序中創(chuàng)建定時(shí)器組,設(shè)置溢出周期為1000ms,在定時(shí)器回調(diào)函數(shù)中配置LED2引腳翻轉(zhuǎn),激活定時(shí)器。當(dāng)計(jì)時(shí)周期到時(shí),LED2引腳翻轉(zhuǎn),運(yùn)行現(xiàn)象是LED2間隔1s閃爍,Demo演示成功。
4小結(jié)
Azure RTOS ThreadX提供定時(shí)器組能夠使應(yīng)用程序按照特定的時(shí)間間隔執(zhí)行,結(jié)合MM32F3270的強(qiáng)大性能,可以實(shí)現(xiàn)Azure RTOS廣泛的應(yīng)用場(chǎng)景。
審核編輯:湯梓紅
-
threadx
+關(guān)注
關(guān)注
0文章
15瀏覽量
13828 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3246瀏覽量
114719 -
RTOS
+關(guān)注
關(guān)注
22文章
811瀏覽量
119593 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5032瀏覽量
97371 -
Azure
+關(guān)注
關(guān)注
1文章
123瀏覽量
12778
原文標(biāo)題:靈動(dòng)微課堂 (第242講)|使用MM32F3270基于Azure RTOS定時(shí)器組的應(yīng)用
文章出處:【微信號(hào):MindMotion-MMCU,微信公眾號(hào):靈動(dòng)MM32MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論