UCOSII系統(tǒng)建立了兩個優(yōu)先級不同的任務
通過設置任務間的延時實時調(diào)度任務
寄存器版程序驗證OK
例如優(yōu)先級別為64
系統(tǒng)空閑任務為最低優(yōu)先級64-1
統(tǒng)計任務優(yōu)先級為64-2
任務堆棧
堆棧為后進先出,先進后出
任務創(chuàng)建時應該依據(jù)處理堆棧的生長方向(向上生長【低地址在下】和向下生長【低地址在上】)
M3的棧生長方向為高地址向低地址增長即向上增長的
棧的地址是從頂端開始傳遞的
優(yōu)先級使用
0 1 2 3 OS_LOWEST_PRIO-3 OS_LOWEST_PRIO-2 OS_LOWEST_PRIO-1 OS_LOWEST_PRIO
開發(fā)者:h
stm32單片機源程序如下:
- #include "sys.h"
- #include "usart.h"
- #include "delay.h"
- #include "led.h"
- #include "includes.h"
-
- /////////////////////////UCOSII任務設置///////////////////////////////////
- //START 任務
- //設置任務優(yōu)先級
- #define START_TASK_PRIO 10 //開始任務的優(yōu)先級設置為最低
- //設置任務堆棧大小
- #define START_STK_SIZE 64
- //任務堆棧
- OS_STK START_TASK_STK[START_STK_SIZE];
- //任務函數(shù)
- void start_task(void *pdata);
-
- //LED0任務
- //設置任務優(yōu)先級
- #define LED0_TASK_PRIO 6
- //設置任務堆棧大小
- #define LED0_STK_SIZE 64
- //任務堆棧
- OS_STK LED0_TASK_STK[LED0_STK_SIZE];
- //任務函數(shù)
- void led0_task(void *pdata);
- //LED1任務
- //設置任務優(yōu)先級
- #define LED1_TASK_PRIO 7
- //設置任務堆棧大小
- #define LED1_STK_SIZE 64
- //任務堆棧
- OS_STK LED1_TASK_STK[LED1_STK_SIZE];
- //任務函數(shù)
- void led1_task(void *pdata);
- //LED2任務
- //設置任務優(yōu)先級
- #define LED2_TASK_PRIO 8
- //設置任務堆棧大小
- #define LED2_STK_SIZE 64
- //任務堆棧
- OS_STK LED2_TASK_STK[LED2_STK_SIZE];
- //任務函數(shù)
- void led2_task(void *pdata);
- //LED3任務
- //設置任務優(yōu)先級
- #define LED3_TASK_PRIO 9
- //設置任務堆棧大小
- #define LED3_STK_SIZE 64
- //任務堆棧
- OS_STK LED3_TASK_STK[LED3_STK_SIZE];
- //任務函數(shù)
- void led3_task(void *pdata);
- //任務函數(shù)解析
- //OSTimeTick() 系統(tǒng)服務函數(shù) 時鐘節(jié)拍函數(shù)
- //OSTimeTickHook() 時鐘節(jié)拍外連函數(shù)
- //OSTimeDly() OSTimeDlyHMSM() 任務延時函數(shù)
- //OSTaskStat() 統(tǒng)計時間運行任務 用來計算CPU使用率
- //OSStatInit() 系統(tǒng)統(tǒng)計初始化函數(shù)
- //OS_TaskIdle() 空閑任務
- //OS_TaskStat() 統(tǒng)計任務
- //TickTask() 時鐘節(jié)拍任務
- //OSTickISR() 時鐘節(jié)拍中斷服務函數(shù)
- //OSVersion() 獲取UCOS的版本號
- //OSTaskDel(OS_PRIO_SELF) 任務刪除
- //OSTaskCreateExt 任務創(chuàng)建擴展函數(shù)
- //OSTaskStkChk() 堆棧檢驗函數(shù)
- int main(void)
- {
- Stm32_Clock_Init(9); //系統(tǒng)時鐘設置
- delay_init(72); //延時初始化
- uart_init(72,9600); //初始化串口
- // LED_Init();
- LED_Init(); //初始化與LED連接的硬件接口
- OSInit();
- OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//創(chuàng)建起始任務
- OSStart();
- }
-
- //開始任務
- void start_task(void *pdata)
- {
- OS_CPU_SR cpu_sr=0;
- pdata = pdata;
- OSSysTickInit();
- OS_ENTER_CRITICAL(); //進入臨界區(qū)(無法被中斷打斷)
- OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);
- OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
- OSTaskCreate(led2_task,(void *)0,(OS_STK*)&LED2_TASK_STK[LED2_STK_SIZE-1],LED2_TASK_PRIO);
- OSTaskCreate(led3_task,(void *)0,(OS_STK*)&LED3_TASK_STK[LED3_STK_SIZE-1],LED3_TASK_PRIO);
- OSTaskSuspend(START_TASK_PRIO); //掛起起始任務.
- OS_EXIT_CRITICAL(); //退出臨界區(qū)(可以被中斷打斷)
- }
- /***************************************/
- void delay(u16 tt)
- {
- u16 kk;
- while(tt--)
- {
- for(kk=0;kk<8000;kk++)
- ;
- }
- }
- //LED0任務
- void led0_task(void *pdata)
- {
- while(1)
- {
- OSTimeDly(2);//自身延時函數(shù) OSTimeDlyHMSM()表示等待狀態(tài)
- /* LED0=0;
- delay_ms(80);
- LED0=1;
- delay_ms(920);
- printf("按鍵1已經(jīng)按下\r\n"); */
- if(KEY22==0)
- {
- delay_ms(10);
- if(KEY22==0)
- {
- while(KEY22==0);
- delay_ms(10);
- while(KEY22==0);
- Uart1_PutString("按鍵1已經(jīng)按下\r\n");
- }
- }
- };
- }
- //LED1任務
- void led1_task(void *pdata)
- {
- while(1)
- {
- OSTimeDly(2);
- switch(FLAG_YY)
- {
- case 1:printf("任務2成功實現(xiàn)\r\n");FLAG_YY=0;break;
- case 2:printf("22任務成功實現(xiàn)\r\n");FLAG_YY=0;break;
- case 3:printf("33任務成功實現(xiàn)\r\n");FLAG_YY=0;break;
- default:break;
- }
- /* LED1=0;
- delay_ms(300);
- LED1=1;
- printf("按鍵已經(jīng)按下\r\n");
- delay_ms(300); */
- /* if(KEY_K==0)
- {
- delay_ms(10);
- if(KEY_K==0)
- {
- while(KEY_K==0);
- delay_ms(10);
- while(KEY_K==0);
- printf("按鍵2已經(jīng)按下\r\n");
- }
- } */
- };
- }
- //LED2任務
- void led2_task(void *pdata)
- {
- while(1)
- {
- OSTimeDly(2);
- if(KEY_K==0)
- {
- delay_ms(10);
- if(KEY_K==0)
- {
- while(KEY_K==0);
- delay_ms(10);
- while(KEY_K==0);
- printf("led 狀態(tài)反轉(zhuǎn)\r\n");
- }
- }
- /* LED1=0;
- delay_ms(300);
- LED1=1;
- printf("按鍵已經(jīng)按下\r\n");
- delay_ms(300); */
- /* if(KEY_K==0)
- {
- delay_ms(10);
- if(KEY_K==0)
- {
- while(KEY_K==0);
- delay_ms(10);
- while(KEY_K==0);
- printf("按鍵2已經(jīng)按下\r\n");
- }
- } */
- };
- }
- //LED3任務
- void led3_task(void *pdata)
- {
- while(1)
- {
- OSTimeDly(2);
- if(KEY11==0)
- {
- delay_ms(10);
- if(KEY11==0)
- {
- while(KEY11==0);
- delay_ms(10);
- while(KEY11==0);
- printf("led1 狀態(tài)反轉(zhuǎn)\r\n");
- }
- }
- /* LED1=0;
- delay_ms(300);
- LED1=1;
- printf("按鍵已經(jīng)按下\r\n");
- delay_ms(300); */
- /* if(KEY_K==0)
- {
- delay_ms(10);
- if(KEY_K==0)
- {
- while(KEY_K==0);
- delay_ms(10);
- while(KEY_K==0);
- printf("按鍵2已經(jīng)按下\r\n");
- }
- } */
- };
- }
復制代碼
所有資料51hei提供下載:
STM32UCOSII 任務調(diào)度.rar
(402.17 KB, 下載次數(shù): 13)
2018-8-23 18:13 上傳
點擊文件名下載附件
ucosii 任務調(diào)度 下載積分: 黑幣 -5
|