假如有兩個(gè)Task,行為類型,只是個(gè)別參數(shù)不一樣。那么可以使用同一個(gè)task,來(lái)實(shí)現(xiàn)兩個(gè)實(shí)例。這兩個(gè)實(shí)例是相互獨(dú)立的:Each created instance will execute independently
under the control of the FreeRTOS scheduler.
以兩個(gè)LED的task任務(wù)為例子,假設(shè)LED1和LED2都是每1s變換一次。那么,建立2個(gè)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);
只是一個(gè)定義
osThreadDef只是一個(gè)定義,把相關(guān)的內(nèi)容綁在一起,不是函數(shù)。
osThreadCreate才是一個(gè)函數(shù)。第二個(gè)參數(shù)就是*argument,對(duì)應(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 */
兩個(gè)燈就能同時(shí)點(diǎn)亮和熄滅了 。
查看IAR內(nèi)嵌的FreeRTOS插件,可以看到,這兩個(gè)task只是共用代碼,但是stack和任務(wù)的優(yōu)先級(jí)是獨(dú)立的。
也就是說(shuō),在上面的代碼里面,pxledpin是task里定義的局部變量,是保存在任務(wù)的stack里面。因此兩個(gè)任務(wù)有兩個(gè)獨(dú)立的pxledpin變量。
假如需要兩個(gè)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);
}
這樣兩個(gè)任務(wù)就能按照不同的頻率同時(shí)正常工作了
如果把task部分修改為以下代碼:
LEDFlashPara_TypeDef *pledpara ;
pledpara = (LEDFlashPara_TypeDef *)argument ;
/* Infinite loop */
for(;;)
{
osDelay(pledpara->timer);
HAL_GPIO_TogglePin(GPIOA, pledpara->ledpin);
}
就會(huì)發(fā)現(xiàn)LED1的task正常翻轉(zhuǎn)幾次以后就無(wú)法正常翻轉(zhuǎn)了。
未完 待續(xù)
上一篇:stm32 FreeRTOS中如何創(chuàng)建任務(wù)
下一篇:FreeRTOS學(xué)習(xí)筆記——基礎(chǔ)知識(shí)與移植(STM32F103)
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來(lái)
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問(wèn)外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 晶心科技:只需提供兩個(gè)設(shè)計(jì)文件,就能輕松擴(kuò)展RISC-V指令集
- 艾邁斯歐司朗先進(jìn)的高精度溫度傳感器助推動(dòng)物健康管理
- Microchip與臺(tái)達(dá)電子簽署碳化硅解決方案合作協(xié)議,共創(chuàng)電源管理未來(lái)
- 馬斯克被曝將旗下腦機(jī)接口公司 Neuralink 登記為“小微企業(yè)”
- 寒武紀(jì)宣布將募資 39.85 億元加碼 AI 大模型芯片與軟件平臺(tái)
- 如何加快基于RISC-V的SoC項(xiàng)目上市時(shí)間?西門子EDA給出了解法
- 負(fù)責(zé)任的賦能技術(shù)實(shí)現(xiàn)邊緣AI全面適用
- 半導(dǎo)體創(chuàng)新推動(dòng)能源格局演變的三種方式
- 大模型怎么幫助RISC-V設(shè)計(jì)和驗(yàn)證?Nuclei Model讓芯來(lái)的IP更有競(jìng)爭(zhēng)力
- 合見(jiàn)工軟如何幫助“香山”解決高性能多核RISC-V驗(yàn)證難題?
- EEworld&TI 喊你來(lái)玩BLE+ZigBee+6lowpan!
- 解鎖 TE 掌上信息智庫(kù),獲取一站式資源!
- ADI有獎(jiǎng)下載活動(dòng)之16 太陽(yáng)能光伏逆變器解決方案
- 你評(píng)論,我送禮!《玩轉(zhuǎn)TI MSP430 Launchpad》TI社區(qū)與EEWORLD聯(lián)合首發(fā)!
- 有獎(jiǎng)活動(dòng) | 來(lái) Pl BridgeSwitch™ 技術(shù)中心探秘半橋電機(jī)驅(qū)動(dòng)器新技術(shù)
- 閱讀 TI工業(yè)應(yīng)用方案(電器、電力傳輸)精彩專題,挑戰(zhàn)你的記憶力!好禮相送
- 參加MSP430F5529培訓(xùn),長(zhǎng)知識(shí)、免費(fèi)送、超低團(tuán)、搶樓得!
- 三星Note9價(jià)格曝光:6GB+128GB版約7800元人民幣
- 微軟Surface Phone還活著 2019年仙女座系統(tǒng)爆發(fā)
- 10GB運(yùn)存手機(jī)要來(lái)了?vivo或?qū)屜仁装l(fā)
- Find X單品月流水23.4億 但對(duì)于OPPO這只是“小錢”
- FF迎來(lái)許家印后利好不斷 刺激恒大市值超800億港元
- 宏碁電競(jìng)再出擊 Predator電競(jìng)大賽開(kāi)打
- 紫光控股稱不知公司股價(jià)及成交量不尋常上升原因
- 傳英特爾攜紫光欲顛覆NAND Flash 紫光漲逾17%
- 半導(dǎo)體產(chǎn)業(yè)保持高景氣趨勢(shì) 國(guó)內(nèi)設(shè)備投資增速將不斷走高
- 鼎龍股份:收購(gòu)時(shí)代立夫69%股權(quán),CMP拋光墊業(yè)務(wù)再加碼;
- 進(jìn)入wince系統(tǒng)后,無(wú)法識(shí)別鼠標(biāo)鍵盤 急...
- 在編譯U-BOOT的時(shí)候出現(xiàn)錯(cuò)誤
- 求問(wèn) WINCE中如何判斷平臺(tái)是否有觸發(fā)呢? 謝謝
- WinCE 5.0 能否在vista下開(kāi)發(fā)?
- STM32F107 的USB是不是不帶雙緩沖功能的
- 51系列 看門狗的應(yīng)用
- 工藝審查難度越來(lái)越大,如何才能快刀斬亂麻?
- ARM里面沒(méi)有EEPROM,掉電以后怕丟失的數(shù)據(jù)存在哪里?
- 請(qǐng)教,同相放大電路中的這個(gè)電阻和電容的作用?
- -------- win ce 模擬問(wèn)題 ------------