當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]直接開始說明ucos創(chuàng)建任務(wù)時的步驟:1, 初始化任務(wù)堆棧2, 初始化任務(wù)控制塊3, 把剛創(chuàng)建的任務(wù)設(shè)置為就緒態(tài)(即置位就緒表)上面提到的任務(wù)堆棧,控制塊,就緒表我們前面已經(jīng)說過了,下面就直接看代碼。INT8U OSTa

直接開始說明ucos創(chuàng)建任務(wù)時的步驟:

1, 初始化任務(wù)堆棧

2, 初始化任務(wù)控制塊

3, 把剛創(chuàng)建的任務(wù)設(shè)置為就緒態(tài)(即置位就緒表)

上面提到的任務(wù)堆棧,控制塊,就緒表我們前面已經(jīng)說過了,下面就直接看代碼。

INT8U OSTaskCreate (void (*task)(void *pd), void *p_arg, OS_STK *ptos, INT8U prio)

{

OS_STK *psp;

INT8U err;

#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */

OS_CPU_SR cpu_sr;

cpu_sr = 0; /* Prevent compiler warning */

#endif

#if OS_ARG_CHK_EN > 0

if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */

return (OS_PRIO_INVALID);

}

#endif

OS_ENTER_CRITICAL(); //關(guān)閉中斷

if (OSIntNesting > 0) { /* Make sure we don't create the task from within an ISR */

OS_EXIT_CRITICAL();

return (OS_ERR_TASK_CREATE_ISR);

}

if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* Make sure task doesn't already exist at this priority */

OSTCBPrioTbl[prio] = (OS_TCB *)1; /* Reserve the priority to prevent others from doing ... */

/* ... the same thing until task is created. */

OS_EXIT_CRITICAL();

psp = (OS_STK *)OSTaskStkInit(task, p_arg, ptos, 0); /* Initialize the task's stack *///初始化任務(wù)的堆棧

err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);

if (err == OS_NO_ERR) {

if (OSRunning == TRUE) { /* Find highest priority task if multitasking has started */

OS_Sched(); //如果創(chuàng)建任務(wù)時ucos已經(jīng)開始任務(wù)調(diào)度,那么創(chuàng)建完任務(wù)后需要進(jìn)行任務(wù)調(diào)度

}

} else {

OS_ENTER_CRITICAL();

OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */

OS_EXIT_CRITICAL();

}

return (err);

}

OS_EXIT_CRITICAL();

return (OS_PRIO_EXIST);

}

下面是初始化堆棧的函數(shù):

OS_STK * OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt)

{//函數(shù)需要4個參數(shù),一個指向任務(wù)函數(shù)的指針,任務(wù)運(yùn)行時需要的參數(shù),堆棧指針,擴(kuò)展參數(shù)

unsigned int * stk;

stk = (unsigned int *)ptos; /* Load stack pointer */

//USE_ARG(opt);

opt++;

/* build a stack for the new task */

*--stk = (unsigned int) task; /* pc */

*--stk = (unsigned int) task; /* lr */

*--stk = 12; /* r12 */

*--stk = 11; /* r11 */

*--stk = 10; /* r10 */

*--stk = 9; /* r9 */

*--stk = 8; /* r8 */

*--stk = 7; /* r7 */

*--stk = 6; /* r6 */

*--stk = 5; /* r5 */

*--stk = 4; /* r4 */

*--stk = 3; /* r3 */

*--stk = 2; /* r2 */

*--stk = 1; /* r1 */

*--stk = (unsigned int) pdata; /* r0 */

*--stk = (SUPMODE); /* cpsr */

*--stk = (SUPMODE); /* spsr */

return ((OS_STK *)stk);

}

關(guān)于堆棧,我們前面已經(jīng)講過,這里用的即遞減的滿堆棧。

對于任務(wù),其實就是一個無限循環(huán)的函數(shù),那怎么控制它的運(yùn)行那,這就是操作系統(tǒng)要干的活,操作系統(tǒng)根據(jù)調(diào)度算法實現(xiàn)對任務(wù)的調(diào)度以及任務(wù)的切換。實現(xiàn)了多個任務(wù)共享cpu。

我們已經(jīng)知道,堆棧對任務(wù)的重要性,一:c語言執(zhí)行需要堆棧空間。二:當(dāng)發(fā)生任務(wù)切換時需要把程序運(yùn)行的現(xiàn)場保存到任務(wù)的堆棧中。

也就是說,任務(wù)堆棧中應(yīng)該保存的是任務(wù)運(yùn)行時函數(shù)調(diào)用的情況以及被打斷時的狀態(tài)信息,可是問題來了,我們剛創(chuàng)建一個任務(wù)時,這個任務(wù)并沒有運(yùn)行過呀。這個好辦,我們就模擬這個任務(wù)被打斷過的跡象,任務(wù)沒執(zhí)行過,那么這個函數(shù)調(diào)用棧幀就不復(fù)存在。我們只模擬函數(shù)運(yùn)行環(huán)境的保存??瓷厦娲a,我們首先保存的是PC和LR,因為任務(wù)函數(shù)還沒有執(zhí)行過,因此這個PC和LR就應(yīng)該是函數(shù)的首地址,也就是函數(shù)的名稱指針。比如說你定義了一個任務(wù)函數(shù)

void Task1(void *Id)

{

for(;;){

printf("run task1n");

OSTimeDly(1000);

}

}

那就把Task1這個函數(shù)指針賦給PC和LR。接著是R1~R12這些通用寄存器,由于函數(shù)還沒有執(zhí)行過,這些通用寄存器的值是什么就不太重要,可以隨便賦值,你看,這里就是給R1賦值1,給R2賦值2 ………… 給R12賦值12。當(dāng)然你也可以給這些寄存器賦其他值,這些無關(guān)緊要,但當(dāng)任務(wù)運(yùn)行過后,那再保存程序執(zhí)行現(xiàn)場時就要按章程來了,即這些寄存器被切換的時候里面的值是什么就應(yīng)該保存什么。下面就要初始化CPSR和SPSR了,這兩個值要根據(jù)你的操作系統(tǒng)要運(yùn)行在處理器的那種模式下,任務(wù)運(yùn)行時應(yīng)該開中斷的。你像我們這個把CPSR的值賦成SUPMODE(這個宏的值是0x13),就是說這個任務(wù)運(yùn)行時在SVC模式下并且開中斷。咱們原來說過ucos初始化過程CPSR的中斷一直是關(guān)著的,CPSR的中斷位就是當(dāng)最高優(yōu)先級任務(wù)運(yùn)行時就已經(jīng)開中斷了。

一句話說那,現(xiàn)

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉