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

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]先把入口函數(shù)main給貼出來,就從這里開始,來自文件main.c/******************************************************************************** Function Name : main* De

先把入口函數(shù)main給貼出來,就從這里開始,來自文件main.c

/*******************************************************************************

* Function Name : main

* Description : 主函數(shù),對系統(tǒng)以及硬件初始化,建立主函數(shù)并開啟系統(tǒng)

* Input : None

* Output : None

* Return : None

*******************************************************************************/

int main(void)

{

CPU_IntDis(); // 禁止CPU中斷 連接到匯編

OSInit(); // uCOS系統(tǒng)初始化

BSP_Init(); // 硬件初始化

OSTaskCreate //建立主任務(wù), 優(yōu)先級最高 建立這個任務(wù)另外一個用途是為了以后使用統(tǒng)計任務(wù)

(

(void (*) (void *)) App_TaskStart, //指向任務(wù)代碼的指針

(void *) 0, //任務(wù)開始執(zhí)行時,傳遞給任務(wù)的參數(shù)的指針

(OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1], //分配給任務(wù)的堆棧的棧頂指針,從 (INT8U) APP_TASK_START_PRIO //分配給任務(wù)的優(yōu)先級

);

OSTimeSet(0);

OSStart();

return(0);

}

在開始 uC/OS_II 的調(diào)度之前,我們需要調(diào)用函數(shù)OSInit(),他負(fù)責(zé)建立任務(wù)控制塊鏈表,就緒任務(wù)表等數(shù)據(jù)結(jié)構(gòu),然后初始化全局變量。然后把需要用的外部設(shè)備進行初始化,主要是時鐘初始化,中斷嵌套初始化,端口初始化,調(diào)用函數(shù)BSP_Init(),uC/OS_II規(guī)定在任務(wù)調(diào)度開始前至少有一個任務(wù)已經(jīng)建立,所以我們建立一個任務(wù)APP_TaskStart,并且給這個任務(wù)分配優(yōu)先級以及堆棧等資源這是必須的啦,然后我們用OSTimeSet(0)函數(shù)初始化系統(tǒng)的時鐘節(jié)拍數(shù)后,就調(diào)用OSStart()函數(shù)開始任務(wù)調(diào)度,任務(wù)就會從所有建立的任務(wù)里最高優(yōu)先級開始執(zhí)行。

大家還記得剛才建立了一個APP_TaskStart任務(wù),在系統(tǒng)開始任務(wù)調(diào)度的時候,系統(tǒng)里除了默認(rèn)的優(yōu)先級最低的空閑任務(wù)外只有這一個任務(wù)被注冊了,自然就會運行這個任務(wù),我們先來看下他的相關(guān)源代碼來自文件task.c:

/*******************************************************************************

* Function Name : App_TaskStart

* Description : 主任務(wù)

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void App_TaskStart(void* p_arg)

{

(void) p_arg;

OS_CPU_SysTickInit(); // 初始化系統(tǒng)心跳

#if (OS_TASK_STAT_EN > 0)

OSStatInit(); // 統(tǒng)計任務(wù)初始化函數(shù)

#endif

App_TaskCreate(); // 創(chuàng)建新的用戶任務(wù)

while(1)

{

LED4_HIGH;

OSTimeDlyHMSM(0,0,1,0);

LED4_LOW;

OSTimeDlyHMSM(0,0,1,0);

}

}

/*******************************************************************************

* Function Name : App_TaskCreate

* Description : 建立用戶任務(wù)

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void App_TaskCreate(void)

{

//===================================================================// 測試任務(wù)1

OSTaskCreateExt(

Task_Test1, // 指向任務(wù)代碼的指針,也就是任務(wù)函數(shù)名

(void *)0, // 任務(wù)開始執(zhí)行時傳遞給任務(wù)的參數(shù)

(OS_STK *)&Task_Test1Stk[Task_Test1_STK_SIZE-1],//分配給任務(wù)堆棧的棧頂指針,自頂向下

Task_Test1_PRIO, // 分配給任務(wù)的優(yōu)先級

Task_Test1_PRIO, // 預(yù)備給以后版本的標(biāo)識符,現(xiàn)在同任務(wù)優(yōu)先級

(OS_STK *)&Task_Test1Stk[0], // 指向任務(wù)堆棧的棧底指針,用于堆棧的檢驗

Task_Test1_STK_SIZE, // 指定堆棧的容量,用于堆棧檢驗

(void *)0, // 指向用戶附加數(shù)據(jù)域的指針,用來擴展任務(wù)控制塊

OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR // 任務(wù)選項:使能堆棧檢測 和 創(chuàng)建任務(wù)時清空堆棧

);

//===================================================================// 測試任務(wù)2

OSTaskCreateExt(

Task_Test2,

(void *)0,

(OS_STK *)&Task_Test2Stk[Task_Test2_STK_SIZE-1],

Task_Test2_PRIO,

Task_Test2_PRIO,

(OS_STK *)&Task_Test2Stk[0],

Task_Test2_STK_SIZE,

(void *)0,

OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR

);

//===================================================================// 測試任務(wù)3

OSTaskCreateExt(

Task_Test3,

(void *)0,

(OS_STK *)&Task_Test3Stk[Task_Test3_STK_SIZE-1],

Task_Test3_PRIO,

Task_Test3_PRIO,

(OS_STK *)&Task_Test3Stk[0],

Task_Test3_STK_SIZE,

(void *)0,

OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR

);

}

同時給出任務(wù)的優(yōu)先級及堆棧大小等信息來自文件app_cfg.h

//任務(wù)優(yōu)先級

#define APP_TASK_START_PRIO 10

#define Task_Test1_PRIO 7

#define Task_Test2_PRIO 8

#define Task_Test3_PRIO 9

//任務(wù)堆棧大小

#define APP_TASK_START_STK_SIZE 64

#define Task_Test1_STK_SIZE 128

#define Task_Test2_STK_SIZE 128

#define Task_Test3_STK_SIZE 128

可以看到,任務(wù)APP_TaskStart的優(yōu)先級最低,所以在這個任務(wù)里創(chuàng)建其他的任務(wù)的時候他就會被更高優(yōu)先級的任務(wù)把CPU的占有權(quán)搶去,在uC/OS_II里每建立一個任務(wù)后都會產(chǎn)生一次任務(wù)的調(diào)度,如果這個建立的任務(wù)優(yōu)先級更高,則系統(tǒng)就會去執(zhí)行這個剛創(chuàng)立的任務(wù),如果低就只能等著了。所以在建立Task_Test1任務(wù)后,就會跳轉(zhuǎn)執(zhí)行此任務(wù),現(xiàn)在我們來看下這三個測試任務(wù)的源代碼來自文件app.c[!--empirenews.page--]

/*******************************************************************************

* Function Name : Task_Test1

* Description : 任務(wù)1

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void Task_Test1(void* p_arg)

{

(void) p_arg ;

while(1)

{

if(KEY_WKUP == 0)

{

LED1_HIGH;

}

else

{

LED1_LOW;

}

OSTimeDlyHMSM(0,0,0,100); // 延時,為其他低優(yōu)先級的任務(wù)執(zhí)行留有空間

}

}

/*******************************************************************************

* Function Name : Task_Test2

* Description : 任務(wù)2

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void Task_Test2(void* p_arg)

{

(void) p_arg ;

while(1)

{

LED2_HIGH;

OSTimeDlyHMSM(0,0,0,500);

LED2_LOW;

OSTimeDlyHMSM(0,0,0,500);

}

}

/*******************************************************************************

* Function Name : Task_Test3

* Description : 任務(wù)3

* Input : None

* Output : None

* Return : None

*******************************************************************************/

void Task_Test3(void* p_arg)

{

(void) p_arg ;

while(1)

{

LED3_HIGH;

OSTimeDlyHMSM(0,0,0,500);

LED3_LOW;

OSTimeDlyHMSM(0,0,0,500);

}

}

剛才說到哪里了?對,現(xiàn)在開始執(zhí)行Task_Test1的任務(wù)了,很顯然,這個任務(wù)是對一個按鍵的檢測,檢測完成后進入一個100ms的延時函數(shù),在uC/OS_II里延時函數(shù)的作用要比以前的大得多,在uC/OS_II里任務(wù)中調(diào)用了延時函數(shù)時,該任務(wù)就被退出了任務(wù)就緒表,然后調(diào)用一次系統(tǒng)調(diào)度OS_Sched(),重新尋找最高優(yōu)先級的任務(wù)去執(zhí)行,這個時候咱們的系統(tǒng)只注冊了兩個任務(wù),這樣就只能繼續(xù)執(zhí)行任務(wù)APP_TaskStart了,剛才在這個函數(shù)里建立第一個測試任務(wù)就被搶去了CPU的占用權(quán),現(xiàn)在回來繼續(xù)創(chuàng)建Task_Test2第二個測試任務(wù),這第二個測試任務(wù)優(yōu)先級也比開始任務(wù)高,所以自然的它又被人搶去了CPU的占用權(quán),在第二個測試任務(wù)里大家又會看到有延時函數(shù),功能肯定是相同的,以此類推第三個測試任務(wù)也就清晰的多了。這時還有一個問題就是延時結(jié)束后系統(tǒng)操作,剛才測試任務(wù)1進入延時后,不會被系統(tǒng)調(diào)用,他的延時變量OSTCBDly是隨著系統(tǒng)的心跳進行遞減的,如果有兩個任務(wù)同時在延時中只要他們的任務(wù)控制塊里的延時變量不是0就會在心跳中斷服務(wù)函數(shù)里減1,等到他被減為0,系統(tǒng)會把這個任務(wù)重新放到任務(wù)就緒表里,并且運行一次系統(tǒng)調(diào)度函數(shù)OS_Sched(),通過這種機制來保證系統(tǒng)始終在運行著最高優(yōu)先級的任務(wù)。這樣系統(tǒng)的調(diào)度問題就解釋完了,在后面關(guān)于中斷和信號量使用時,他們對系統(tǒng)的執(zhí)行順序也是有影響的,他們是如何參與到系統(tǒng)的調(diào)度里,就看后面的講解了。

剛才我們說了延時函數(shù)的作用,如果我把上面的代碼里黃色高亮的部分注視掉會有什么樣的效果,結(jié)果就是其他的3個任務(wù)都無法運行了,系統(tǒng)將一直處理任務(wù)Task_Test1,再加入我們?nèi)绻腰S色高亮部分的延時參數(shù)調(diào)大一些,調(diào)整到1s,結(jié)果也不令人滿意,雖然我給了提起任務(wù)充足的運行時間,但是由于每檢測一次我都會等待很長時間,導(dǎo)致我的檢測精度大大降低,按鍵變的極為難用。這時候我們就應(yīng)該思考,在uC/OS_II這樣一個實時的嵌入式操作系統(tǒng)里面,最可怕的就是無目的的等待,所以我們盡量使用中斷這樣方式去處理接口信息,中斷和實時系統(tǒng)是相得益彰的。

 

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

無論是在統(tǒng)治NLP屆的Transformer,還是最近視覺領(lǐng)域的新秀Vision Transformer,我們都能在模型中看到Transpose/Permute算子的身影,特別是在多頭注意力機制(Multi-Head A...

關(guān)鍵字: se rc os

在六個服務(wù)領(lǐng)域表現(xiàn)出顯著提升;從2021年的第7位躍居第2位 印度班加羅爾2022年4月11日 /美通社/ -- 下一代數(shù)字服務(wù)和咨詢領(lǐng)域的全球領(lǐng)軍者Infosys(印度國家證券交易所、孟買證券交易所和紐約證券交易所代...

關(guān)鍵字: Group os

(全球TMT2022年4月11日訊)下一代數(shù)字服務(wù)和咨詢領(lǐng)域的全球領(lǐng)軍者Infosys近期宣布,在Everest Group PEAK Matrix?2022年度 IT服務(wù)提供商獎中排名第二。在第六屆PEAK Matr...

關(guān)鍵字: Group os

香港2022年3月29日 /美通社/ -- 在傳統(tǒng)與創(chuàng)新的十字路口,一些人不僅記錄了歷史,而且潛心打造未來?;仡橳oshiba TV第一次屏幕閃爍的那一刻,創(chuàng)新便已深植于公司的“血液”,致力于真實...

關(guān)鍵字: os

北京2022年3月21日 /美通社/ -- 微美全息軟件有限公司(納斯達克: WIMI)(以下簡稱為“微美全息”或“公司”),一家全球領(lǐng)先的增強現(xiàn)實(“AR”)服務(wù)提供商,今天宣布宣布被納入Proshares Metav...

關(guān)鍵字: os

Infosys 元宇宙工坊(Infosys metaverse foundry)是 Infosys Living Labs 不可或缺的一部分,它正在推動企業(yè)的數(shù)字創(chuàng)新議程,以適應(yīng)新興的優(yōu)先事項和市場趨勢。 Infosys...

關(guān)鍵字: os

Chronos芯片將搭載于Ouster面向量產(chǎn)車推出的DF系列固態(tài)數(shù)字激光雷達上,提高其性能與功效...

關(guān)鍵字: 芯片 激光雷達 os

(全球TMT2022年3月11日訊)2022年3月11日,高分辨率數(shù)字激光雷達供應(yīng)商Ouster發(fā)布最新Chronos 芯片,這是一款車規(guī)級、完全定制化的數(shù)字激光雷達接收芯片,將搭載于其DF系列固態(tài)激光雷達上。Chro...

關(guān)鍵字: 芯片 激光雷達 os

上海2022年3月10日 /美通社/ -- 中國上海,2022年3月,柏中(Bossard)宣布推出Smart Vending Cloud幫助客戶解決MRO耗材管理問題,進一步升級“智能工廠物流”服務(wù)。此舉也意味著柏中在...

關(guān)鍵字: 全自動 os

(全球TMT2022年2月22日訊)孚昇電子(Fusion Worldwide)收購了位于新加坡的大型電子元件測試公司Prosemi Mfg Pte Ltd。由于供應(yīng)鏈經(jīng)歷了歷史性的限制,導(dǎo)致周轉(zhuǎn)時間過長,此次收購將進...

關(guān)鍵字: os se 電子元件
關(guān)閉