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