日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

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

直接開(kāi)始說(shuō)明ucos創(chuàng)建任務(wù)時(shí)的步驟:

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

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

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

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

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ù)時(shí)ucos已經(jīng)開(kāi)始任務(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個(gè)參數(shù),一個(gè)指向任務(wù)函數(shù)的指針,任務(wù)運(yùn)行時(shí)需要的參數(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)講過(guò),這里用的即遞減的滿堆棧。

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

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

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

void Task1(void *Id)

{

for(;;){

printf("run task1n");

OSTimeDly(1000);

}

}

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

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

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

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉