標(biāo)題:
STM32 UOSII系統(tǒng)任務(wù)調(diào)度源碼
[打印本頁]
作者:
hg1234
時(shí)間:
2018-8-23 15:37
標(biāo)題:
STM32 UOSII系統(tǒng)任務(wù)調(diào)度源碼
UCOSII系統(tǒng)建立了兩個(gè)優(yōu)先級(jí)不同的任務(wù)
通過設(shè)置任務(wù)間的延時(shí)實(shí)時(shí)調(diào)度任務(wù)
寄存器版程序驗(yàn)證OK
例如優(yōu)先級(jí)別為64
系統(tǒng)空閑任務(wù)為最低優(yōu)先級(jí)64-1
統(tǒng)計(jì)任務(wù)優(yōu)先級(jí)為64-2
任務(wù)堆棧
堆棧為后進(jìn)先出,先進(jìn)后出
任務(wù)創(chuàng)建時(shí)應(yīng)該依據(jù)處理堆棧的生長(zhǎng)方向(向上生長(zhǎng)【低地址在下】和向下生長(zhǎng)【低地址在上】)
M3的棧生長(zhǎng)方向?yàn)楦叩刂废虻偷刂吩鲩L(zhǎng)即向上增長(zhǎng)的
棧的地址是從頂端開始傳遞的
優(yōu)先級(jí)使用
0 1 2 3 OS_LOWEST_PRIO-3 OS_LOWEST_PRIO-2 OS_LOWEST_PRIO-1 OS_LOWEST_PRIO
開發(fā)者:h
stm32單片機(jī)源程序如下:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "includes.h"
/////////////////////////UCOSII任務(wù)設(shè)置///////////////////////////////////
//START 任務(wù)
//設(shè)置任務(wù)優(yōu)先級(jí)
#define START_TASK_PRIO 10 //開始任務(wù)的優(yōu)先級(jí)設(shè)置為最低
//設(shè)置任務(wù)堆棧大小
#define START_STK_SIZE 64
//任務(wù)堆棧
OS_STK START_TASK_STK[START_STK_SIZE];
//任務(wù)函數(shù)
void start_task(void *pdata);
//LED0任務(wù)
//設(shè)置任務(wù)優(yōu)先級(jí)
#define LED0_TASK_PRIO 6
//設(shè)置任務(wù)堆棧大小
#define LED0_STK_SIZE 64
//任務(wù)堆棧
OS_STK LED0_TASK_STK[LED0_STK_SIZE];
//任務(wù)函數(shù)
void led0_task(void *pdata);
//LED1任務(wù)
//設(shè)置任務(wù)優(yōu)先級(jí)
#define LED1_TASK_PRIO 7
//設(shè)置任務(wù)堆棧大小
#define LED1_STK_SIZE 64
//任務(wù)堆棧
OS_STK LED1_TASK_STK[LED1_STK_SIZE];
//任務(wù)函數(shù)
void led1_task(void *pdata);
//LED2任務(wù)
//設(shè)置任務(wù)優(yōu)先級(jí)
#define LED2_TASK_PRIO 8
//設(shè)置任務(wù)堆棧大小
#define LED2_STK_SIZE 64
//任務(wù)堆棧
OS_STK LED2_TASK_STK[LED2_STK_SIZE];
//任務(wù)函數(shù)
void led2_task(void *pdata);
//LED3任務(wù)
//設(shè)置任務(wù)優(yōu)先級(jí)
#define LED3_TASK_PRIO 9
//設(shè)置任務(wù)堆棧大小
#define LED3_STK_SIZE 64
//任務(wù)堆棧
OS_STK LED3_TASK_STK[LED3_STK_SIZE];
//任務(wù)函數(shù)
void led3_task(void *pdata);
//任務(wù)函數(shù)解析
//OSTimeTick() 系統(tǒng)服務(wù)函數(shù) 時(shí)鐘節(jié)拍函數(shù)
//OSTimeTickHook() 時(shí)鐘節(jié)拍外連函數(shù)
//OSTimeDly() OSTimeDlyHMSM() 任務(wù)延時(shí)函數(shù)
//OSTaskStat() 統(tǒng)計(jì)時(shí)間運(yùn)行任務(wù) 用來計(jì)算CPU使用率
//OSStatInit() 系統(tǒng)統(tǒng)計(jì)初始化函數(shù)
//OS_TaskIdle() 空閑任務(wù)
//OS_TaskStat() 統(tǒng)計(jì)任務(wù)
//TickTask() 時(shí)鐘節(jié)拍任務(wù)
//OSTickISR() 時(shí)鐘節(jié)拍中斷服務(wù)函數(shù)
//OSVersion() 獲取UCOS的版本號(hào)
//OSTaskDel(OS_PRIO_SELF) 任務(wù)刪除
//OSTaskCreateExt 任務(wù)創(chuàng)建擴(kuò)展函數(shù)
//OSTaskStkChk() 堆棧檢驗(yàn)函數(shù)
int main(void)
{
Stm32_Clock_Init(9); //系統(tǒng)時(shí)鐘設(shè)置
delay_init(72); //延時(shí)初始化
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)建起始任務(wù)
OSStart();
}
//開始任務(wù)
void start_task(void *pdata)
{
OS_CPU_SR cpu_sr=0;
pdata = pdata;
OSSysTickInit();
OS_ENTER_CRITICAL(); //進(jìn)入臨界區(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); //掛起起始任務(wù).
OS_EXIT_CRITICAL(); //退出臨界區(qū)(可以被中斷打斷)
}
/***************************************/
void delay(u16 tt)
{
u16 kk;
while(tt--)
{
for(kk=0;kk<8000;kk++)
;
}
}
//LED0任務(wù)
void led0_task(void *pdata)
{
while(1)
{
OSTimeDly(2);//自身延時(shí)函數(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任務(wù)
void led1_task(void *pdata)
{
while(1)
{
OSTimeDly(2);
switch(FLAG_YY)
{
case 1:printf("任務(wù)2成功實(shí)現(xiàn)\r\n");FLAG_YY=0;break;
case 2:printf("22任務(wù)成功實(shí)現(xiàn)\r\n");FLAG_YY=0;break;
case 3:printf("33任務(wù)成功實(shí)現(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任務(wù)
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任務(wù)
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");
}
} */
};
}
復(fù)制代碼
所有資料51hei提供下載:
STM32UCOSII 任務(wù)調(diào)度.rar
(402.17 KB, 下載次數(shù): 13)
2018-8-23 18:13 上傳
點(diǎn)擊文件名下載附件
ucosii 任務(wù)調(diào)度
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1