假如有兩個Task,行為類型,只是個別參數(shù)不一樣。那么可以使用同一個task,來實(shí)現(xiàn)兩個實(shí)例。這兩個實(shí)例是相互獨(dú)立的:Each created instance will execute independently
under the control of the FreeRTOS scheduler.
以兩個LED的task任務(wù)為例子,假設(shè)LED1和LED2都是每1s變換一次。那么,建立2個task:分別是LED1Flash和LED2Flash,使用同樣的task入口:StartLEDFlashTask
生成iar工程后,在main.c中有 以下代碼:
/* Create the thread(s) */
/* definition and creation of LED1Flash */
osThreadDef(LED1Flash, StartLEDFlashTask, osPriorityNormal, 0, 128);
LED1FlashHandle = osThreadCreate(osThread(LED1Flash), NULL);
/* definition and creation of LED2Flash */
osThreadDef(LED2Flash, StartLEDFlashTask, osPriorityLow, 0, 128);
LED2FlashHandle = osThreadCreate(osThread(LED2Flash), NULL);
只是一個定義
osThreadDef只是一個定義,把相關(guān)的內(nèi)容綁在一起,不是函數(shù)。
osThreadCreate才是一個函數(shù)。第二個參數(shù)就是*argument,對應(yīng)StartLEDFlashTask函數(shù)的輸入?yún)?shù)。
因此在osThreadDef之前加入code。
/*import user code,may be changed by stm32cubeMX*/
/*take attention */
uint16_t led1pin,led2pin = 0 ;
led1pin = GPIO_PIN_4 ;
led2pin = GPIO_PIN_5 ;
另外,osThreadCreate需要改成
LED1FlashHandle = osThreadCreate(osThread(LED1Flash), (void *)(&led1pin));
LED2FlashHandle = osThreadCreate(osThread(LED2Flash), (void *)(&led2pin));
在StartLEDFlashTask函數(shù)改成
/* USER CODE BEGIN 5 */
uint16_t * pxledpin ;
pxledpin = (uint16_t *)argument ;
/* Infinite loop */
for(;;)
{
osDelay(1000);
HAL_GPIO_TogglePin(GPIOA, (*pxledpin));
}
/* USER CODE END 5 */
兩個燈就能同時點(diǎn)亮和熄滅了 。
查看IAR內(nèi)嵌的FreeRTOS插件,可以看到,這兩個task只是共用代碼,但是stack和任務(wù)的優(yōu)先級是獨(dú)立的。
也就是說,在上面的代碼里面,pxledpin是task里定義的局部變量,是保存在任務(wù)的stack里面。因此兩個任務(wù)有兩個獨(dú)立的pxledpin變量。
假如需要兩個led分別閃爍,可以在main.c加入以下代碼
全局部分
typedef struct
{
uint16_t ledpin ;
uint32_t timer ;
}LEDFlashPara_TypeDef ;
main主函數(shù)部分修改為
LEDFlashPara_TypeDef led1para,led2para ;
led1para.ledpin = GPIO_PIN_4 ;
led1para.timer = 1000 ;
led2para.ledpin = GPIO_PIN_5 ;
led2para.timer = 500 ;
/* Create the thread(s) */
/* definition and creation of LED1Flash */
osThreadDef(LED1Flash, StartLEDFlashTask, osPriorityNormal, 0, 128);
LED1FlashHandle = osThreadCreate(osThread(LED1Flash), (void *)(&led1para));
/* definition and creation of LED2Flash */
osThreadDef(LED2Flash, StartLEDFlashTask, osPriorityLow, 0, 128);
LED2FlashHandle = osThreadCreate(osThread(LED2Flash), (void *)(&led2para));
Task部分修改為
LEDFlashPara_TypeDef ledpara ;
ledpara = *( (LEDFlashPara_TypeDef *)argument) ;
/* Infinite loop */
for(;;)
{
osDelay(ledpara.timer);
HAL_GPIO_TogglePin(GPIOA, ledpara.ledpin);
}
這樣兩個任務(wù)就能按照不同的頻率同時正常工作了
如果把task部分修改為以下代碼:
LEDFlashPara_TypeDef *pledpara ;
pledpara = (LEDFlashPara_TypeDef *)argument ;
/* Infinite loop */
for(;;)
{
osDelay(pledpara->timer);
HAL_GPIO_TogglePin(GPIOA, pledpara->ledpin);
}
就會發(fā)現(xiàn)LED1的task正常翻轉(zhuǎn)幾次以后就無法正常翻轉(zhuǎn)了。
未完 待續(xù)
上一篇:stm32 FreeRTOS中如何創(chuàng)建任務(wù)
下一篇:FreeRTOS學(xué)習(xí)筆記——基礎(chǔ)知識與移植(STM32F103)
推薦閱讀最新更新時間:2025-05-31 09:37








設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- EVAL-ADG5248FEBZ,ADG5248F 過壓保護(hù) 8:1 多路復(fù)用器評估板
- EVAL-ADF7021DBZ3,基于 ADF7021 431 - 470 MHz ISM 頻段收發(fā)器的子板
- 使用 Analog Devices 的 LTC4162EUFD-SADM 的參考設(shè)計
- LT3091MPFE 產(chǎn)生極低輸出電壓的典型應(yīng)用
- 使用 Analog Devices 的 LT1173CN8 的參考設(shè)計
- AD9649-65EBZ,用于 AD9649BCPZ-65、單通道、14 位、65 MSPS 模數(shù)轉(zhuǎn)換器的評估板
- 帶有用于 NCV3063 1.5A 升壓開關(guān)穩(wěn)壓器的外部 NMOS 晶體管的典型升壓應(yīng)用原理圖
- NE555八音電子琴
- KITPF4210EPEVB: Evaluation board- PF4210, Power Management IC for i.MX 8M
- 使用 NXP Semiconductors 的 ISP1582 的參考設(shè)計
- iTOP-4412開發(fā)板-LinuxC-繼電器模塊的測試?yán)?/a>
- 賽輪思與梅賽德斯-奔馳合作 為EQS的MBUX系統(tǒng)提供增強(qiáng)智能
- Tiny4412模式跳轉(zhuǎn)
- 固態(tài)電池的5種構(gòu)型與現(xiàn)有研發(fā)水平及待攻關(guān)的關(guān)鍵技術(shù)
- 89C51中斷系統(tǒng)介紹(外部中斷)
- 第47章 STM32F429的SPI 總線應(yīng)用之SPI Flash的MDK下載算法制作
- STM32的GPIO詳細(xì)介紹
- 異構(gòu)集成推動面板制程設(shè)備(驅(qū)動器)的改變 異構(gòu)集成(HI)已成為封裝技術(shù)最新的轉(zhuǎn)折點(diǎn)
- STM32F1_ FSMC讀寫外部SRAM
- 美國餐廳推出會做漢堡的機(jī)器人,5分鐘就能做出漢堡
- 擁有機(jī)器視覺的機(jī)器人,取代了四臺傳統(tǒng)機(jī)器人,能夠連續(xù)工作
- 機(jī)器人都可以搬磚了,難道我們連搬磚的機(jī)會都沒了嗎
- 庫卡六軸機(jī)器人,現(xiàn)實(shí)銑削自動化
- 機(jī)器人“四大家族”逐鹿廣東
- 蘋果AR眼鏡除了智能對焦技術(shù)還有什么亮點(diǎn)?
- FOD指紋辨識技術(shù)將成為未來焦點(diǎn)
- 5G:美韓硬吵噱頭,中國務(wù)實(shí)推進(jìn)
- 2019全球PC、平板和手機(jī)設(shè)備出貨預(yù)計將達(dá)到22.1億臺
- Qualcomm Cloud AI 100將搶占推理加速器市場