99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

3天內(nèi)不再提示

HAL庫(kù)GPIO在cubemx中的配置及注意事項(xiàng)

jf_L18yujSQ ? 來(lái)源:小飛哥玩嵌入式 ? 作者:小飛哥玩嵌入式 ? 2022-10-19 09:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本節(jié)內(nèi)容介紹

1、HAL庫(kù)GPIO在cubemx中的配置及注意事項(xiàng);

2、HAL庫(kù)GPIO操作詳解與結(jié)構(gòu)介紹;

3、rt-thread任務(wù)介紹與創(chuàng)建;

4、利用多任務(wù)點(diǎn)燈,實(shí)現(xiàn)rtos多任務(wù)創(chuàng)建于執(zhí)行;

HAL庫(kù)GPIO在cubemx中的配置

上節(jié)課程我們介紹了cubemx的界面、時(shí)鐘配置以及如何新建工程等,本節(jié)咱們就繼續(xù)進(jìn)行程序員屆的“hello world”-“點(diǎn)燈”。

GPIO選擇與配置

嵌入式軟件工程師拿到板子第一件事要做的一定是熟悉原理圖,你可以不會(huì)設(shè)計(jì),但一定要能看懂,軟件工程師調(diào)試代碼,一看原理圖,二才是寫(xiě)代碼、調(diào)試代碼

先來(lái)看看開(kāi)發(fā)板上的LED是哪個(gè)引腳,可以看到PB6、PE3、PD15都是LED控制引腳,采用的是灌電流的方式,低電平燈亮:

3f40004e-4f44-11ed-a3b6-dac502259ad0.png

接下來(lái),咱們?cè)赾ubemx對(duì)這些IO進(jìn)行配置,小飛哥只選擇了兩個(gè)LED燈,名字命名和原理圖保持一致或者是按照實(shí)際功能命名

3f7a31ce-4f44-11ed-a3b6-dac502259ad0.png

右擊選擇第一個(gè)選項(xiàng),就可以修改label3fbfab64-4f44-11ed-a3b6-dac502259ad0.png

單擊選中,會(huì)有很多功能,MCU的一個(gè)引腳是可以復(fù)用為許多功能的,我們根據(jù)自己的需要配置對(duì)應(yīng)的模式即可,此處我們控制LED燈,低電平-燈亮,高電平-燈滅,顯然是要配置為輸出模式的,選擇output即可,其他輸出引腳同理

3ff62b76-4f44-11ed-a3b6-dac502259ad0.png

接下來(lái)我們來(lái)看下GPIO的一些模式配置

403c2374-4f44-11ed-a3b6-dac502259ad0.png

對(duì)于開(kāi)發(fā)板上的LED控制引腳,我們可以按照如下配置,初始化輸出高電平,LED不開(kāi)啟,這樣初始化就可以設(shè)置GPIO輸出電平,設(shè)置為需要的狀態(tài):

4086a9bc-4f44-11ed-a3b6-dac502259ad0.png

GPIO配置比較簡(jiǎn)單,就不再啰嗦了

HAL庫(kù)GPIO操作詳解與結(jié)構(gòu)介紹

打開(kāi)生成的代碼,看看上面配置的GPIO初始化內(nèi)容,上面cubemx的配置項(xiàng)可以看到已經(jīng)生成對(duì)應(yīng)的代碼了,GPIO的配置順序:使能GPIO時(shí)鐘->配置相關(guān)采參數(shù):

voidMX_GPIO_Init(void)
{

GPIO_InitTypeDefGPIO_InitStruct={0};

/*GPIOPortsClockEnable*/
__HAL_RCC_GPIOE_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();

/*ConfigureGPIOpinOutputLevel*/
HAL_GPIO_WritePin(Y_LED_GPIO_Port,Y_LED_Pin,GPIO_PIN_RESET);

/*ConfigureGPIOpinOutputLevel*/
HAL_GPIO_WritePin(CP_LED_GPIO_Port,CP_LED_Pin,GPIO_PIN_RESET);

/*ConfigureGPIOpin:PtPin*/
GPIO_InitStruct.Pin=Y_LED_Pin;
GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull=GPIO_NOPULL;
GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(Y_LED_GPIO_Port,&GPIO_InitStruct);

/*ConfigureGPIOpin:PtPin*/
GPIO_InitStruct.Pin=CP_LED_Pin;
GPIO_InitStruct.Mode=GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull=GPIO_NOPULL;
GPIO_InitStruct.Speed=GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(CP_LED_GPIO_Port,&GPIO_InitStruct);

}

關(guān)于GPIO操作的API:

/*Initializationandde-initializationfunctions*****************************/
voidHAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_Init);
voidHAL_GPIO_DeInit(GPIO_TypeDef*GPIOx,uint32_tGPIO_Pin);

/**
*@}
*/

/**@addtogroupGPIO_Exported_Functions_Group2IOoperationfunctions
*@{
*/

/*IOoperationfunctions*****************************************************/
GPIO_PinStateHAL_GPIO_ReadPin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,GPIO_PinStatePinState);
voidHAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
HAL_StatusTypeDefHAL_GPIO_LockPin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);
voidHAL_GPIO_EXTI_IRQHandler(uint16_tGPIO_Pin);
voidHAL_GPIO_EXTI_Callback(uint16_tGPIO_Pin);

本節(jié)由于是LED操作,我們只需要操作:

voidHAL_GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_Init);
voidHAL_GPIO_WritePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,GPIO_PinStatePinState);
voidHAL_GPIO_TogglePin(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);

如何使用呢?

參數(shù)GPIO_TypeDef *GPIOx可以是GPIO組的地址:

#defineGPIOA((GPIO_TypeDef*)GPIOA_BASE)
#defineGPIOB((GPIO_TypeDef*)GPIOB_BASE)
#defineGPIOC((GPIO_TypeDef*)GPIOC_BASE)
#defineGPIOD((GPIO_TypeDef*)GPIOD_BASE)
#defineGPIOE((GPIO_TypeDef*)GPIOE_BASE)
#defineGPIOF((GPIO_TypeDef*)GPIOF_BASE)
#defineGPIOG((GPIO_TypeDef*)GPIOG_BASE)
#defineGPIOH((GPIO_TypeDef*)GPIOH_BASE)
#defineGPIOI((GPIO_TypeDef*)GPIOI_BASE)
參數(shù)GPIO_Pin可以是GPIO的引腳號(hào):

#defineGPIO_PIN_0((uint16_t)0x0001)/*Pin0selected*/
#defineGPIO_PIN_1((uint16_t)0x0002)/*Pin1selected*/
#defineGPIO_PIN_2((uint16_t)0x0004)/*Pin2selected*/
#defineGPIO_PIN_3((uint16_t)0x0008)/*Pin3selected*/
#defineGPIO_PIN_4((uint16_t)0x0010)/*Pin4selected*/
#defineGPIO_PIN_5((uint16_t)0x0020)/*Pin5selected*/
#defineGPIO_PIN_6((uint16_t)0x0040)/*Pin6selected*/
#defineGPIO_PIN_7((uint16_t)0x0080)/*Pin7selected*/
#defineGPIO_PIN_8((uint16_t)0x0100)/*Pin8selected*/
#defineGPIO_PIN_9((uint16_t)0x0200)/*Pin9selected*/
#defineGPIO_PIN_10((uint16_t)0x0400)/*Pin10selected*/
#defineGPIO_PIN_11((uint16_t)0x0800)/*Pin11selected*/
#defineGPIO_PIN_12((uint16_t)0x1000)/*Pin12selected*/
#defineGPIO_PIN_13((uint16_t)0x2000)/*Pin13selected*/
#defineGPIO_PIN_14((uint16_t)0x4000)/*Pin14selected*/
#defineGPIO_PIN_15((uint16_t)0x8000)/*Pin15selected*/
#defineGPIO_PIN_All((uint16_t)0xFFFF)/*Allpinsselected*/
參數(shù)GPIO_PinState PinState可以是:
/**
*@briefGPIOBitSETandBitRESETenumeration
*/
typedefenum
{
GPIO_PIN_RESET=0U,
GPIO_PIN_SET
}GPIO_PinState;

輸出低電平:

/*ConfigureGPIOpinOutputLevel*/
HAL_GPIO_WritePin(Y_LED_GPIO_Port,Y_LED_Pin,GPIO_PIN_RESET);

/*ConfigureGPIOpinOutputLevel*/
HAL_GPIO_WritePin(CP_LED_GPIO_Port,CP_LED_Pin,GPIO_PIN_RESET);

輸出高電平:

/*ConfigureGPIOpinOutputLevel*/
HAL_GPIO_WritePin(Y_LED_GPIO_Port,Y_LED_Pin,GPIO_PIN_SET);

/*ConfigureGPIOpinOutputLevel*/
HAL_GPIO_WritePin(CP_LED_GPIO_Port,CP_LED_Pin,GPIO_PIN_SET);

翻轉(zhuǎn)電平:

HAL_GPIO_TogglePin(Y_LED_GPIO_Port,Y_LED_Pin);
HAL_GPIO_TogglePin(CP_LED_GPIO_Port,CP_LED_Pin);

關(guān)于GPIO輸出不外乎這幾個(gè)API,掌握如何使用就可以了

rt-thread任務(wù)介紹與創(chuàng)建

主要摘取一些比較關(guān)鍵的信息,也可參見(jiàn)RT-Thread官網(wǎng)介紹

線程管理

嵌入式系統(tǒng)執(zhí)行這樣的任務(wù),系統(tǒng)通過(guò)傳感器采集數(shù)據(jù),并通過(guò)顯示屏將數(shù)據(jù)顯示出來(lái),在多線程實(shí)時(shí)系統(tǒng)中,可以將這個(gè)任務(wù)分解成兩個(gè)子任務(wù),如下圖所示,一個(gè)子任務(wù)不間斷地讀取傳感器數(shù)據(jù),并將數(shù)據(jù)寫(xiě)到共享內(nèi)存中,另外一個(gè)子任務(wù)周期性的從共享內(nèi)存中讀取數(shù)據(jù),并將傳感器數(shù)據(jù)輸出到顯示屏上。40b5042e-4f44-11ed-a3b6-dac502259ad0.png

在 RT-Thread 中,與上述子任務(wù)對(duì)應(yīng)的程序?qū)嶓w就是線程,線程是實(shí)現(xiàn)任務(wù)的載體,它是 RT-Thread 中最基本的調(diào)度單位,它描述了一個(gè)任務(wù)執(zhí)行的運(yùn)行環(huán)境,也描述了這個(gè)任務(wù)所處的優(yōu)先等級(jí),重要的任務(wù)可設(shè)置相對(duì)較高的優(yōu)先級(jí),非重要的任務(wù)可以設(shè)置較低的優(yōu)先級(jí),不同的任務(wù)還可以設(shè)置相同的優(yōu)先級(jí),輪流運(yùn)行。

線程狀態(tài)

線程運(yùn)行的過(guò)程中,同一時(shí)間內(nèi)只允許一個(gè)線程在處理器中運(yùn)行,從運(yùn)行的過(guò)程上劃分,線程有多種不同的運(yùn)行狀態(tài),如初始狀態(tài)、掛起狀態(tài)、就緒狀態(tài)等。在 RT-Thread 中,線程包含五種狀態(tài),操作系統(tǒng)會(huì)自動(dòng)根據(jù)它運(yùn)行的情況來(lái)動(dòng)態(tài)調(diào)整它的狀態(tài)。RT-Thread 中線程的五種狀態(tài),如下表所示:

狀態(tài) 描述
初始狀態(tài) 當(dāng)線程剛開(kāi)始創(chuàng)建還沒(méi)開(kāi)始運(yùn)行時(shí)就處于初始狀態(tài);在初始狀態(tài)下,線程不參與調(diào)度。此狀態(tài)在 RT-Thread 中的宏定義為 RT_THREAD_INIT
就緒狀態(tài) 在就緒狀態(tài)下,線程按照優(yōu)先級(jí)排隊(duì),等待被執(zhí)行;一旦當(dāng)前線程運(yùn)行完畢讓出處理器,操作系統(tǒng)會(huì)馬上尋找最高優(yōu)先級(jí)的就緒態(tài)線程運(yùn)行。此狀態(tài)在 RT-Thread 中的宏定義為 RT_THREAD_READY
運(yùn)行狀態(tài) 線程當(dāng)前正在運(yùn)行。在單核系統(tǒng)中,只有 rt_thread_self() 函數(shù)返回的線程處于運(yùn)行狀態(tài);在多核系統(tǒng)中,可能就不止這一個(gè)線程處于運(yùn)行狀態(tài)。此狀態(tài)在 RT-Thread 中的宏定義為 RT_THREAD_RUNNING
掛起狀態(tài) 也稱(chēng)阻塞態(tài)。它可能因?yàn)橘Y源不可用而掛起等待,或線程主動(dòng)延時(shí)一段時(shí)間而掛起。在掛起狀態(tài)下,線程不參與調(diào)度。此狀態(tài)在 RT-Thread 中的宏定義為 RT_THREAD_SUSPEND
關(guān)閉狀態(tài) 當(dāng)線程運(yùn)行結(jié)束時(shí)將處于關(guān)閉狀態(tài)。關(guān)閉狀態(tài)的線程不參與線程的調(diào)度。此狀態(tài)在 RT-Thread 中的宏定義為 RT_THREAD_CLOSE

線程狀態(tài)切換

RT-Thread 提供一系列的操作系統(tǒng)調(diào)用接口,使得線程的狀態(tài)在這五個(gè)狀態(tài)之間來(lái)回切換。幾種狀態(tài)間的轉(zhuǎn)換關(guān)系如下圖所示:

40c6425c-4f44-11ed-a3b6-dac502259ad0.png

線程優(yōu)先級(jí)

RT-Thread 線程的優(yōu)先級(jí)是表示線程被調(diào)度的優(yōu)先程度。每個(gè)線程都具有優(yōu)先級(jí),線程越重要,賦予的優(yōu)先級(jí)就應(yīng)越高,線程被調(diào)度的可能才會(huì)越大。

RT-Thread 最大支持 256 個(gè)線程優(yōu)先級(jí) (0~255),數(shù)值越小的優(yōu)先級(jí)越高,0 為最高優(yōu)先級(jí)。在一些資源比較緊張的系統(tǒng)中,可以根據(jù)實(shí)際情況選擇只支持 8 個(gè)或 32 個(gè)優(yōu)先級(jí)的系統(tǒng)配置;對(duì)于 ARM Cortex-M 系列,普遍采用 32 個(gè)優(yōu)先級(jí)。最低優(yōu)先級(jí)默認(rèn)分配給空閑線程使用,用戶(hù)一般不使用。在系統(tǒng)中,當(dāng)有比當(dāng)前線程優(yōu)先級(jí)更高的線程就緒時(shí),當(dāng)前線程將立刻被換出,高優(yōu)先級(jí)線程搶占處理器運(yùn)行。

時(shí)間片

每個(gè)線程都有時(shí)間片這個(gè)參數(shù),但時(shí)間片僅對(duì)優(yōu)先級(jí)相同的就緒態(tài)線程有效。系統(tǒng)對(duì)優(yōu)先級(jí)相同的就緒態(tài)線程采用時(shí)間片輪轉(zhuǎn)的調(diào)度方式進(jìn)行調(diào)度時(shí),時(shí)間片起到約束線程單次運(yùn)行時(shí)長(zhǎng)的作用,其單位是一個(gè)系統(tǒng)節(jié)拍(OS Tick),詳見(jiàn)《時(shí)鐘管理》章節(jié)。假設(shè)有 2 個(gè)優(yōu)先級(jí)相同的就緒態(tài)線程 A 與 B,A 線程的時(shí)間片設(shè)置為 10,B 線程的時(shí)間片設(shè)置為 5,那么當(dāng)系統(tǒng)中不存在比 A 優(yōu)先級(jí)高的就緒態(tài)線程時(shí),系統(tǒng)會(huì)在 A、B 線程間來(lái)回切換執(zhí)行,并且每次對(duì) A 線程執(zhí)行 10 個(gè)節(jié)拍的時(shí)長(zhǎng),對(duì) B 線程執(zhí)行 5 個(gè)節(jié)拍的時(shí)長(zhǎng),如下圖。

41087154-4f44-11ed-a3b6-dac502259ad0.png

線程通過(guò)調(diào)用函數(shù) rt_thread_create/init() 進(jìn)入到初始狀態(tài)(RT_THREAD_INIT);

初始狀態(tài)的線程通過(guò)調(diào)用函數(shù) rt_thread_startup() 進(jìn)入到就緒狀態(tài)(RT_THREAD_READY);

就緒狀態(tài)的線程被調(diào)度器調(diào)度后進(jìn)入運(yùn)行狀態(tài)(RT_THREAD_RUNNING);當(dāng)處于運(yùn)行狀態(tài)的線程調(diào)用 rt_thread_delay(),rt_sem_take(),rt_mutex_take(),rt_mb_recv() 等函數(shù)或者獲取不到資源時(shí),將進(jìn)入到掛起狀態(tài)(RT_THREAD_SUSPEND);

處于掛起狀態(tài)的線程,如果等待超時(shí)依然未能獲得資源或由于其他線程釋放了資源,那么它將返回到就緒狀態(tài)。掛起狀態(tài)的線程,如果調(diào)用 rt_thread_delete/detach() 函數(shù),將更改為關(guān)閉狀態(tài)(RT_THREAD_CLOSE);

而運(yùn)行狀態(tài)的線程,如果運(yùn)行結(jié)束,就會(huì)在線程的最后部分執(zhí)行 rt_thread_exit() 函數(shù),將狀態(tài)更改為關(guān)閉狀態(tài)。

線程相關(guān)的API

創(chuàng)建和刪除線程

一個(gè)線程要成為可執(zhí)行的對(duì)象,就必須由操作系統(tǒng)的內(nèi)核來(lái)為它創(chuàng)建一個(gè)線程??梢酝ㄟ^(guò)如下的接口創(chuàng)建一個(gè)動(dòng)態(tài)線程:

rt_thread_trt_thread_create(constchar*name,
void(*entry)(void*parameter),
void*parameter,
rt_uint32_tstack_size,
rt_uint8_tpriority,
rt_uint32_ttick);

調(diào)用這個(gè)函數(shù)時(shí),系統(tǒng)會(huì)從動(dòng)態(tài)堆內(nèi)存中分配一個(gè)線程句柄以及按照參數(shù)中指定的棧大小從動(dòng)態(tài)堆內(nèi)存中分配相應(yīng)的空間。分配出來(lái)的??臻g是按照 rtconfig.h 中配置的 RT_ALIGN_SIZE 方式對(duì)齊。線程創(chuàng)建 rt_thread_create() 的參數(shù)和返回值見(jiàn)下圖:

41173c8e-4f44-11ed-a3b6-dac502259ad0.png

對(duì)于一些使用 rt_thread_create() 創(chuàng)建出來(lái)的線程,當(dāng)不需要使用,或者運(yùn)行出錯(cuò)時(shí),我們可以使用下面的函數(shù)接口來(lái)從系統(tǒng)中把線程完全刪除掉:

rt_err_trt_thread_delete(rt_thread_tthread);
4163103c-4f44-11ed-a3b6-dac502259ad0.png

初始化和脫離線程

線程的初始化可以使用下面的函數(shù)接口完成,來(lái)初始化靜態(tài)線程對(duì)象:

rt_err_trt_thread_init(structrt_thread*thread,
constchar*name,
void(*entry)(void*parameter),void*parameter,
void*stack_start,rt_uint32_tstack_size,
rt_uint8_tpriority,rt_uint32_ttick);

靜態(tài)線程的線程句柄(或者說(shuō)線程控制塊指針)、線程棧由用戶(hù)提供。靜態(tài)線程是指線程控制塊、線程運(yùn)行棧一般都設(shè)置為全局變量,在編譯時(shí)就被確定、被分配處理,內(nèi)核不負(fù)責(zé)動(dòng)態(tài)分配內(nèi)存空間。需要注意的是,用戶(hù)提供的棧首地址需做系統(tǒng)對(duì)齊(例如 ARM 上需要做 4 字節(jié)對(duì)齊)。線程初始化接口 rt_thread_init() 的參數(shù)和返回值見(jiàn)下表:

417ab426-4f44-11ed-a3b6-dac502259ad0.png

對(duì)于用 rt_thread_init() 初始化的線程,使用 rt_thread_detach() 將使線程對(duì)象在線程隊(duì)列和內(nèi)核對(duì)象管理器中被脫離。線程脫離函數(shù)如下:

rt_err_trt_thread_detach(rt_thread_tthread);
41b0b6b6-4f44-11ed-a3b6-dac502259ad0.png

啟動(dòng)線程

創(chuàng)建(初始化)的線程狀態(tài)處于初始狀態(tài),并未進(jìn)入就緒線程的調(diào)度隊(duì)列,我們可以在線程初始化 / 創(chuàng)建成功后調(diào)用下面的函數(shù)接口讓該線程進(jìn)入就緒態(tài):

rt_err_trt_thread_startup(rt_thread_tthread);
41e9f552-4f44-11ed-a3b6-dac502259ad0.png

...還有其他一些線程API,就不再一一贅述了,可以在RT-Thread官網(wǎng)查看

創(chuàng)建任務(wù)

上面對(duì)線程的介紹,羅里吧嗦的說(shuō)了一大堆,接下來(lái)一起實(shí)戰(zhàn)來(lái)看看,如何創(chuàng)建并運(yùn)行任務(wù)

創(chuàng)建任務(wù)實(shí)現(xiàn)多任務(wù)點(diǎn)燈

根據(jù)創(chuàng)建任務(wù)的API

rt_thread_trt_thread_create(constchar*name,
void(*entry)(void*parameter),
void*parameter,
rt_uint32_tstack_size,
rt_uint8_tpriority,
rt_uint32_ttick);

來(lái)創(chuàng)建我們的2個(gè)任務(wù):

/**
******************************************************************************
*@filert_user_task.c
*@brief用戶(hù)任務(wù)文件
*
******************************************************************************
*@attention
*
* Copyright (c) 2022 公眾號(hào):小飛哥玩嵌入式.
*Allrightsreserved.
* Author:小飛哥
*
*****************************************************************************/

/*Includes------------------------------------------------------------------*/
#include"main.h"
#include
#include"rt_user_task.h"
/*Privatetypedef-----------------------------------------------------------*/

/*Privatedefine------------------------------------------------------------*/
#defineTHREAD1_PRIORITY27//線程
#defineTHREAD_STACK_SIZE512//線程棧深度
#defineTHREAD_TIMESLICE5//線程的時(shí)間片


#defineTHREAD2_PRIORITY26//線程
/*Privatemacro-------------------------------------------------------------*/

/*Privatevariables---------------------------------------------------------*/

/*Privatefunctionprototypes-----------------------------------------------*/

/*Privateusercode---------------------------------------------------------*/

/**
*@functionrt_ledflash_entry
*@author:小飛哥玩嵌入式-小飛哥
*@TODO:LED控制線程
*@param:
*@return:NULL
*/
staticvoidrt_led1_flash_entry(void*parameter)
{
for(;;)
{
HAL_GPIO_TogglePin(Y_LED_GPIO_Port,Y_LED_Pin);
rt_kprintf("LED1TaskisRunning!
");
rt_thread_mdelay(500);
}
}
/**
*@functionrt_led2flash_entry
*@author:小飛哥玩嵌入式-小飛哥
*@TODO:LED控制線程
*@param:
*@return:NULL
*/
staticvoidrt_led2_flash_entry(void*parameter)
{
for(;;)
{
HAL_GPIO_TogglePin(CP_LED_GPIO_Port,CP_LED_Pin);
rt_kprintf("LED2TaskisRunning!
");
rt_thread_mdelay(500);
}
}
/**
*@functionrt_user_thread_entry
*@author:小飛哥玩嵌入式-小飛哥
*@TODO:創(chuàng)建線程
*@param:
*@return:NULL
*/

intrt_user_thread_entry(void)
{
staticrt_thread_tresult=RT_NULL;
/*創(chuàng)建一個(gè)線程,名稱(chēng)是rt_ledflash,入口是rt_ledflash_entry*/
result=rt_thread_create("rt_led1flash",rt_led1_flash_entry,
NULL,
THREAD_STACK_SIZE,
THREAD1_PRIORITY,
THREAD_TIMESLICE);
if(result!=RT_NULL)//線程創(chuàng)建成功
{
rt_thread_startup(result);
}
else
{
rt_kprintf("
rt_led1flashthreadcreatefailed
");
}
/*創(chuàng)建一個(gè)線程,名稱(chēng)是rt_ledflash,入口是rt_ledflash_entry*/
result=rt_thread_create("rt_led2flash",rt_led2_flash_entry,
NULL,
THREAD_STACK_SIZE,
THREAD2_PRIORITY,
THREAD_TIMESLICE);
if(result!=RT_NULL)//線程創(chuàng)建成功
{
rt_thread_startup(result);
}
else
{
rt_kprintf("
rt_led2flashthreadcreatefailed
");
}
return0;
}

上面創(chuàng)建了兩個(gè)任務(wù),rt-thread任務(wù)的數(shù)值越小優(yōu)先級(jí)是越高的,我們?cè)O(shè)置任務(wù)1的優(yōu)先級(jí)為27,任務(wù)2的優(yōu)先級(jí)為26,按照優(yōu)先級(jí)設(shè)置規(guī)則,任務(wù)2的優(yōu)先級(jí)是比較高的,接下來(lái)我們通過(guò)打印的方式(LED就不展示啦)來(lái)看看是不是按照我們的優(yōu)先級(jí)去執(zhí)行,可以看到,任務(wù)2的優(yōu)先級(jí)是比較任務(wù)1高的

4203e6b0-4f44-11ed-a3b6-dac502259ad0.png

然后我們測(cè)試下同一個(gè)優(yōu)先級(jí)情況下會(huì)發(fā)生什么,不出意外的話(huà),應(yīng)該是先執(zhí)行先創(chuàng)建的任務(wù),下圖也可以看到,確實(shí)如此

423ad0da-4f44-11ed-a3b6-dac502259ad0.png

至此,本節(jié)教程就完了,講的還是比較粗略的,LED就不展示啦,希望對(duì)小伙們有所幫助哈!

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • led
    led
    +關(guān)注

    關(guān)注

    242

    文章

    23834

    瀏覽量

    673884
  • RT-Thread
    +關(guān)注

    關(guān)注

    32

    文章

    1406

    瀏覽量

    41910
  • HAL
    HAL
    +關(guān)注

    關(guān)注

    2

    文章

    72

    瀏覽量

    13108
  • CubeMx
    +關(guān)注

    關(guān)注

    0

    文章

    31

    瀏覽量

    1647

原文標(biāo)題:02-rt-thread 任務(wù)創(chuàng)建與HAL庫(kù)點(diǎn)燈

文章出處:【微信號(hào):小飛哥玩嵌入式,微信公眾號(hào):小飛哥玩嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    HAL庫(kù)GPIO輸入模式cubemx配置

    上節(jié)課程介紹了GPIO輸出模式的配置,包括修改IO標(biāo)簽,選擇GPIO模式、GPIO上下拉等,本節(jié)輸入模式有很多相同之處,節(jié)省時(shí)間,小飛哥就簡(jiǎn)單介紹一下
    的頭像 發(fā)表于 11-02 09:33 ?2335次閱讀

    使用STM32 HAL庫(kù)進(jìn)行GPIO控制的實(shí)例

    基于STM32微控制器的嵌入式系統(tǒng)開(kāi)發(fā),GPIO(GeneralPurposeInput/Output)控制是其中最基本、最常見(jiàn)的操作之一。通過(guò)使用STM32的HAL
    的頭像 發(fā)表于 12-21 15:22 ?4953次閱讀

    HAL庫(kù)GPIO使用注意事項(xiàng)

    [tr=transparent]stm32資料 STM32l05x HAL庫(kù)使用注意事項(xiàng) 主講人:成沖 一、STM32L0xx_HAL_GPIO (一)、引腳初始化函數(shù)
    發(fā)表于 07-02 07:05

    講解GPIO的API使用和注意事項(xiàng)

    第17章 STM32F429之GPIOHAL庫(kù)API本章教程為大家講解GPIO(General-purpose I/Os)的API使用和注意事項(xiàng)
    發(fā)表于 08-10 06:19

    Simulink開(kāi)發(fā)STM32環(huán)境配置注意事項(xiàng)

    的是2018bSTM32MATJavaSTM32CubeMX,我下載的是5.3版本STM32F1庫(kù),注意是用于STM32CubeMX,不是Keil,可以
    發(fā)表于 08-17 06:07

    基于CubeMX HAL庫(kù)的CAN該如何去配置

    基于CubeMX HAL庫(kù)的CAN該如何去配置呢?使用時(shí)有哪些注意事項(xiàng)
    發(fā)表于 10-22 06:58

    GPIO口的配置過(guò)程是怎樣的?有哪些注意事項(xiàng)?

    GPIO口具有哪些特性功能?GPIO口的配置過(guò)程是怎樣的?有哪些注意事項(xiàng)?
    發(fā)表于 11-18 07:52

    GPIO的API該如何去使用呢?有哪些注意事項(xiàng)

    GPIO的API該如何去使用呢?有哪些注意事項(xiàng)?如何使用HAL庫(kù)GPIO驅(qū)動(dòng)呢?
    發(fā)表于 11-29 06:41

    stm32 fft庫(kù)使用注意事項(xiàng)

    stm32 fft庫(kù)使用方法 與 注意事項(xiàng)
    發(fā)表于 11-02 10:55 ?0次下載

    MCU的SWD端口復(fù)用為GPIO端口功能的配置方法及注意事項(xiàng)詳細(xì)說(shuō)明

    本篇應(yīng)用筆記主要介紹華大半導(dǎo)體 MCU*的 SWD 端口復(fù)用為 GPIO 端口功能的配置方法及注意事項(xiàng)。
    發(fā)表于 11-12 08:00 ?20次下載
    MCU的SWD端口復(fù)用為<b class='flag-5'>GPIO</b>端口功能的<b class='flag-5'>配置</b>方法及<b class='flag-5'>注意事項(xiàng)</b>詳細(xì)說(shuō)明

    【STM32】標(biāo)準(zhǔn)庫(kù)HAL庫(kù)對(duì)照學(xué)習(xí)教程三--使用庫(kù)函數(shù)配置GPIO點(diǎn)亮LED燈

    【STM32】標(biāo)準(zhǔn)庫(kù)HAL庫(kù)對(duì)照學(xué)習(xí)教程三--使用庫(kù)函數(shù)配置GPIO點(diǎn)亮LED燈一、前言二、準(zhǔn)備工作三、LED硬件電路四、使用標(biāo)準(zhǔn)
    發(fā)表于 12-05 14:06 ?17次下載
    【STM32】標(biāo)準(zhǔn)<b class='flag-5'>庫(kù)</b>與<b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b>對(duì)照學(xué)習(xí)教程三--使用庫(kù)函數(shù)<b class='flag-5'>配置</b><b class='flag-5'>GPIO</b>點(diǎn)亮LED燈

    00_STM32F4學(xué)習(xí)_HAL庫(kù)_GPIO函數(shù)

    00_STM32F4學(xué)習(xí)_HAL庫(kù)_GPIO函數(shù)最近重學(xué)STM32,打算從HAL庫(kù)+STM32CubeM
    發(fā)表于 12-05 14:21 ?12次下載
    00_STM32F4學(xué)習(xí)_<b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b>_<b class='flag-5'>GPIO</b>函數(shù)

    STM32 HAL庫(kù) CUBEMX配置 ADC采集

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔文章目錄STM32 HAL庫(kù) CUBEMX配置 ADC采集軟硬件型號(hào)1.單通道不定時(shí)任意時(shí)刻采集信號(hào)
    發(fā)表于 12-27 18:57 ?25次下載
    STM32 <b class='flag-5'>HAL</b><b class='flag-5'>庫(kù)</b> <b class='flag-5'>CUBEMX</b><b class='flag-5'>配置</b> ADC采集

    AN092GD32MCU GPIO結(jié)構(gòu)與使用注意事項(xiàng)

    AN092 GD32 MCU GPIO結(jié)構(gòu)與使用注意事項(xiàng)
    發(fā)表于 03-01 18:48 ?0次下載
    AN092GD32MCU <b class='flag-5'>GPIO</b>結(jié)構(gòu)與使用<b class='flag-5'>注意事項(xiàng)</b>

    SysTick與HAL_Delay的關(guān)系與注意事項(xiàng)

    本文將介紹SysTick與HAL_Delay()函數(shù)之間的關(guān)系,以及使用HAL_Delay()函數(shù)的注意事項(xiàng);
    的頭像 發(fā)表于 04-21 11:32 ?2683次閱讀