|
熟悉的指點(diǎn)一下,謝謝!
//任務(wù)優(yōu)先級(jí)
#define START_TASK_PRIO 3
//任務(wù)堆棧大小
#define START_STK_SIZE 512
//任務(wù)控制塊
OS_TCB StartTaskTCB;
//任務(wù)堆棧
CPU_STK START_TASK_STK[START_STK_SIZE];
//任務(wù)函數(shù)
void start_task(void *p_arg);
//任務(wù)優(yōu)先級(jí)
#define InternalTemperature_TASK_PRIO 4
//任務(wù)堆棧大小
#define InternalTemperature_STK_SIZE 128
//任務(wù)控制塊
OS_TCB InternalTemperatureTaskTCB;
//任務(wù)堆棧
CPU_STK InternalTemperature_TASK_STK[InternalTemperature_STK_SIZE];
void InternalTemperature_Task(void *p_arg);
//任務(wù)優(yōu)先級(jí)
#define DHT11_TASK_PRIO 5
//任務(wù)堆棧大小
#define DHT11_STK_SIZE 128
//任務(wù)控制塊
OS_TCB DHT11TaskTCB;
//任務(wù)堆棧
CPU_STK DHT11_TASK_STK[InternalTemperature_STK_SIZE];
void DHT11_Task(void *p_arg);
//任務(wù)優(yōu)先級(jí)
#define LED_TASK_PRIO 6
//任務(wù)堆棧大小
#define LED_STK_SIZE 128
//任務(wù)控制塊
OS_TCB LEDTaskTCB;
//任務(wù)堆棧
CPU_STK LED_TASK_STK[LED_STK_SIZE];
void LED_Task(void *p_arg);
//任務(wù)優(yōu)先級(jí)
#define TIM1_TASK_PRIO 7
//任務(wù)堆棧大小
#define TIM1_STK_SIZE 128
//任務(wù)控制塊
OS_TCB TIMT1askTCB;
//任務(wù)堆棧
CPU_STK TIM_TASK_STK[TIM1_STK_SIZE];
void TIM_Task(void *p_arg);
OS_TMR tmr1;//定時(shí)器1
//OS_TMR tmr2;
void tmr1_callback(void *p_tmr,void *p_arg);//定時(shí)器1回調(diào)函數(shù)
//void tmr2_callback(void *p_tmr,void *p_arg);//定時(shí)器1回調(diào)函數(shù)
int main(void)
{
OS_ERR err;
CPU_SR_ALLOC();
delay_init(); //延時(shí)初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級(jí)分組為組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
uart_init(115200); //串口初始化為115200
LED_Init(); //初始化與LED連接的硬件接口
T_Adc_Init(); //ADC初始化
OSInit(&err); //初始化UCOSIII
OS_CRITICAL_ENTER();//進(jìn)入臨界區(qū)
OSTmrStart(&tmr1, &err); //開(kāi)啟定時(shí)器
OSTmrStop(&tmr1, OS_OPT_TMR_NONE, 0, &err); //關(guān)閉定時(shí)器
//創(chuàng)建開(kāi)始任務(wù)1
OSTaskCreate((OS_TCB * )&StartTaskTCB, //任務(wù)控制塊
(CPU_CHAR * )"start task", //任務(wù)名字
(OS_TASK_PTR )start_task, //任務(wù)函數(shù)
(void * )0, //傳遞給任務(wù)函數(shù)的參數(shù)
(OS_PRIO )START_TASK_PRIO, //任務(wù)優(yōu)先級(jí)
(CPU_STK * )&START_TASK_STK[0], //任務(wù)堆棧基地址
(CPU_STK_SIZE)START_STK_SIZE/10, //任務(wù)堆棧深度限位
(CPU_STK_SIZE)START_STK_SIZE, //任務(wù)堆棧大小
(OS_MSG_QTY )0, //任務(wù)內(nèi)部消息隊(duì)列能夠接收的最大消息數(shù)目,為0時(shí)禁止接收消息
(OS_TICK )0, //當(dāng)使能時(shí)間片輪轉(zhuǎn)時(shí)的時(shí)間片長(zhǎng)度,為0時(shí)為默認(rèn)長(zhǎng)度,
(void * )0, //用戶補(bǔ)充的存儲(chǔ)區(qū)
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任務(wù)選項(xiàng)
(OS_ERR * )&err); //存放該函數(shù)錯(cuò)誤時(shí)的返回值
//創(chuàng)建開(kāi)始任務(wù)2
OSTaskCreate((OS_TCB * )&LEDTaskTCB, //任務(wù)控制塊
(CPU_CHAR * )"start task", //任務(wù)名字
(OS_TASK_PTR )LED_Task, //任務(wù)函數(shù)
(void * )0, //傳遞給任務(wù)函數(shù)的參數(shù)
(OS_PRIO )LED_TASK_PRIO, //任務(wù)優(yōu)先級(jí)
(CPU_STK * )&LED_TASK_STK[0], //任務(wù)堆棧基地址
(CPU_STK_SIZE)LED_STK_SIZE/10, //任務(wù)堆棧深度限位
(CPU_STK_SIZE)LED_STK_SIZE, //任務(wù)堆棧大小
(OS_MSG_QTY )0, //任務(wù)內(nèi)部消息隊(duì)列能夠接收的最大消息數(shù)目,為0時(shí)禁止接收消息
(OS_TICK )0, //當(dāng)使能時(shí)間片輪轉(zhuǎn)時(shí)的時(shí)間片長(zhǎng)度,為0時(shí)為默認(rèn)長(zhǎng)度,
(void * )0, //用戶補(bǔ)充的存儲(chǔ)區(qū)
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任務(wù)選項(xiàng)
(OS_ERR * )&err); //存放該函數(shù)錯(cuò)誤時(shí)的返回值
OS_CRITICAL_EXIT(); //退出臨界區(qū)
OSStart(&err); //開(kāi)啟UCOSIII
while(1);
}
//開(kāi)始任務(wù)函數(shù)
void start_task(void *p_arg)
{
OS_ERR err;
CPU_SR_ALLOC();
p_arg = p_arg;
CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0u
OSStatTaskCPUUsageInit(&err); //統(tǒng)計(jì)任務(wù)
#endif
#ifdef CPU_CFG_INT_DIS_MEAS_EN //如果使能了測(cè)量中斷關(guān)閉時(shí)間
CPU_IntDisMeasMaxCurReset();
#endif
#if OS_CFG_SCHED_ROUND_ROBIN_EN //當(dāng)使用時(shí)間片輪轉(zhuǎn)的時(shí)候
//使能時(shí)間片輪轉(zhuǎn)調(diào)度功能,時(shí)間片長(zhǎng)度為1個(gè)系統(tǒng)時(shí)鐘節(jié)拍,既1*5=5ms
OSSchedRoundRobinCfg(DEF_ENABLED,1,&err);
#endif
OS_CRITICAL_ENTER(); //進(jìn)入臨界區(qū)
//create InternalTemperature Task
OSTaskCreate((OS_TCB * )&InternalTemperatureTaskTCB,
(CPU_CHAR * )"InternalTemperature task",
(OS_TASK_PTR )InternalTemperature_Task,
(void * )0,
(OS_PRIO )InternalTemperature_TASK_PRIO,
(CPU_STK * )&InternalTemperature_TASK_STK[0],
(CPU_STK_SIZE)InternalTemperature_STK_SIZE/10,
(CPU_STK_SIZE)InternalTemperature_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
OSTaskCreate((OS_TCB * )&DHT11TaskTCB,
(CPU_CHAR * )"DHT11 task",
(OS_TASK_PTR )DHT11_Task,
(void * )0,
(OS_PRIO )DHT11_TASK_PRIO,
(CPU_STK * )&DHT11_TASK_STK[0],
(CPU_STK_SIZE)DHT11_STK_SIZE/10,
(CPU_STK_SIZE)DHT11_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
OSTaskCreate((OS_TCB * )&LEDTaskTCB,
(CPU_CHAR * )"LED task",
(OS_TASK_PTR )LED_Task,
(void * )0,
(OS_PRIO )LED_TASK_PRIO,
(CPU_STK * )&LED_TASK_STK[0],
(CPU_STK_SIZE)LED_STK_SIZE/10,
(CPU_STK_SIZE)LED_STK_SIZE,
(OS_MSG_QTY )0,
(OS_TICK )0,
(void * )0,
(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,
(OS_ERR * )&err);
//創(chuàng)建定時(shí)器1
OSTmrCreate((OS_TMR * )&tmr1, //任務(wù)控制塊
(CPU_CHAR * )"tmr1", //任務(wù)名字
(OS_TICK )20, //20*10=200ms
(OS_TICK )100, //任務(wù)內(nèi)部消息隊(duì)列能夠接收的最大消息數(shù)目,為0時(shí)禁止接收消息
(OS_OPT )OS_OPT_TMR_PERIODIC, //任務(wù)選項(xiàng)
(OS_TMR_CALLBACK_PTR)tmr1_callback,
(void *)0,
(OS_ERR * )&err); //存放該函數(shù)錯(cuò)誤時(shí)的返回值
OS_CRITICAL_EXIT(); //退出臨界區(qū)
}
/**************************************************************
任務(wù)函數(shù)區(qū)
優(yōu)先級(jí):4 CPU溫度
優(yōu)先級(jí):5 DHT11環(huán)境溫度
**************************************************************/
//CPU溫度 優(yōu)先級(jí):4
void InternalTemperature_Task(void *p_arg)
{
OS_ERR err;
p_arg = p_arg;
while(1)
{
short temp;
temp=Get_Temprate(); //得到溫度值
if(temp<0)
{
temp=-temp;
}
printf("temp is %d \r\n",temp);
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延時(shí)500ms
}
}
//DHT11環(huán)境溫度 優(yōu)先級(jí):5
void DHT11_Task(void *p_arg)
{
OS_ERR err;
u8 temperature;
u8 humidity;
p_arg = p_arg;
while(1)
{
DHT11_Read_Data(&temperature,&humidity); //讀取溫濕度值
printf("temp is %d, humidity is %d \r\n",temperature,humidity);
OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延時(shí)500ms
}
}
// 定時(shí)器回調(diào)函數(shù)
void tmr1_callback(void *P_tmr,void *p_arg)
{
// 定時(shí)器到期時(shí)執(zhí)行的操作
// printf("Timer expired!\n");
u8 sakl;
sakl++;
while(1)
{
LED0=~ LED0;
}
}
|
|