熟悉的指点一下,谢谢!
//任务优先级
#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;
}
}
|