//开始任务函数 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(); //进入临界区 //创建定时器1 OSTmrCreate((OS_TMR *)&tmr1, //定时器1 (CPU_CHAR *)"tmr1", //定时器名字 (OS_TICK )0, //0ms (OS_TICK )50, //50*10=500ms (OS_OPT )OS_OPT_TMR_PERIODIC, //周期模式 (OS_TMR_CALLBACK_PTR)tmr1_callback,//定时器1回调函数 (void *)0, //参数为0 (OS_ERR *)&err); //返回的错误码 //创建主任务 OSTaskCreate((OS_TCB * )&Main_TaskTCB, (CPU_CHAR * )"Main task", (OS_TASK_PTR )main_task, (void * )0, (OS_PRIO )MAIN_TASK_PRIO, (CPU_STK * )&MAIN_TASK_STK[0], (CPU_STK_SIZE)MAIN_STK_SIZE/10, (CPU_STK_SIZE)MAIN_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); //创建MSGDIS任务 OSTaskCreate((OS_TCB * )&Msgdis_TaskTCB, (CPU_CHAR * )"Msgdis task", (OS_TASK_PTR )msgdis_task, (void * )0, (OS_PRIO )MSGDIS_TASK_PRIO, (CPU_STK * )&MSGDIS_TASK_STK[0], (CPU_STK_SIZE)MSGDIS_STK_SIZE/10, (CPU_STK_SIZE)MSGDIS_STK_SIZE, (OS_MSG_QTY )TASK_Q_NUM, //任务Msgdis_task需要使用内建消息队列,消息队列长度为4 (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); OS_CRITICAL_EXIT(); //退出临界区 OSTaskDel((OS_TCB*)0,&err); //删除start_task任务自身 }
static void AppTaskStart (void *p_arg) { CPU_INT08U seq; OS_ERR err; #if (APP_CFG_TCPIP_MODULE_EN > 0u) NET_ERR net_err; #endif (void)&p_arg; BSP_Init(); /* Initialize BSP functions */ CPU_Init(); /* Initialize the uC/CPU services */ OS_CPU_TickInit(); /* Init uC/OS periodic time src (SysTick). */ BSP_Ser_Init(BSP_CFG_SER_BAUDRATE); #if (OS_CFG_STAT_TASK_EN > 0u) OSStatTaskCPUUsageInit(&err); /* Compute CPU capacity with no task running */ #endif Mem_Init(); /* Initialize mem mgmt module, required for TCP-IP. */ BSP_GraphLCD_Init(); AppGraphLCD_Hdr(); #if (APP_CFG_FS_EN > 0u) App_FS_Init(); #endif #if (APP_CFG_TCPIP_MODULE_EN > 0u) AppTCPIP_Init(&net_err); /* Initialize uC/TCP-IP & associated applications. */ if ((net_err == NET_ERR_NONE) || (net_err == NET_IF_ERR_LINK_DOWN)) { AppTCPIP_Cfg = DEF_TRUE; } #if (APP_CFG_TFTPs_MODULE_EN > 0u) TFTPs_Init(); #endif AppCloud_Init(1); #else AppTCPIP_Cfg = DEF_TRUE; #endif #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u OSSchedRoundRobinCfg(DEF_ENABLED, 5, &err); #endif #if (APP_CFG_AUDIO_EN > 0u) AppAudio_Init(); #endif #ifdef CPU_CFG_INT_DIS_MEAS_EN CPU_IntDisMeasMaxCurReset(); #endif seq = 0; LED_Off(0); /* turn all LEDs off */ while (DEF_ON) { /* Task body, always written as an infinite loop. */ if (AppTCPIP_Cfg == DEF_FALSE) { LED_Toggle(14); /* simple LED flash */ LED_Toggle( 5); LED_Toggle( 8); LED_Toggle(11); OSTimeDlyHMSM(0u, 0u, 0u, 100u, OS_OPT_TIME_HMSM_STRICT, &err); } else { switch (seq){ case 0: LEDDisplay_Seq0(); seq++; break; case 1: LEDDisplay_Seq1(); seq++; break; case 2: LEDDisplay_Seq2(); seq++; break; case 3: LEDDisplay_Seq3(); seq = 0; break; default: seq = 0; break; } } } }
//开始任务函数 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(); //进入临界区 OSTaskCreate((OS_TCB * )&Led0TaskTCB, (CPU_CHAR * )"led0 task", (OS_TASK_PTR )led0_task, (void * )0, (OS_PRIO )LED0_TASK_PRIO, (CPU_STK * )&LED0_TASK_STK[0], (CPU_STK_SIZE)LED0_STK_SIZE/10, (CPU_STK_SIZE)LED0_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 * )&FloatTaskTCB, (CPU_CHAR * )"float test task", (OS_TASK_PTR )float_task, (void * )0, (OS_PRIO )FLOAT_TASK_PRIO, (CPU_STK * )&FLOAT_TASK_STK[0], (CPU_STK_SIZE)FLOAT_STK_SIZE/10, (CPU_STK_SIZE)FLOAT_STK_SIZE, (OS_MSG_QTY )5, (OS_TICK )0, (void * )0, (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR * )&err); //创建协议处理任务 OSTaskCreate((OS_TCB * )&ProtocolTaskTCB, (CPU_CHAR * )"protocol task", (OS_TASK_PTR )protocol_task, (void * )0, (OS_PRIO )Protocol_TASK_PRIO, (CPU_STK * )&Protocol_TASK_STK[0], (CPU_STK_SIZE)Protocol_STK_SIZE/10, (CPU_STK_SIZE)Protocol_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); OS_CRITICAL_EXIT(); //进入临界区 OSTaskDel(NULL,&err); }
//开始任务函数 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(); //进入临界区 //创建信号量Test_Sem1 OSSemCreate ((OS_SEM* )&Test_Sem1, (CPU_CHAR* )"Test_Sem1", (OS_SEM_CTR)0, (OS_ERR* )&err); //创建信号量Test_Sem2 OSSemCreate ((OS_SEM* )&Test_Sem2, (CPU_CHAR* )"Test_Sem2", (OS_SEM_CTR)0, (OS_ERR* )&err); //创建消息队列 OSQCreate ((OS_Q* )&Test_Q, //消息队列 (CPU_CHAR* )"KEY Msg", //消息队列名称 (OS_MSG_QTY )QUEUE_NUM, //消息队列长度 (OS_ERR* )&err); //错误码 //创建TASK1任务 OSTaskCreate((OS_TCB * )&Task1_TaskTCB, (CPU_CHAR * )"Task1 task", (OS_TASK_PTR )task1_task, (void * )0, (OS_PRIO )TASK1_TASK_PRIO, (CPU_STK * )&TASK1_TASK_STK[0], (CPU_STK_SIZE)TASK1_STK_SIZE/10, (CPU_STK_SIZE)TASK1_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); //创建MULTI测试任务 OSTaskCreate((OS_TCB * )&Multi_TaskTCB, (CPU_CHAR * )"Multi task", (OS_TASK_PTR )multi_task, (void * )0, (OS_PRIO )MULTI_TASK_PRIO, (CPU_STK * )&MULTI_TASK_STK[0], (CPU_STK_SIZE)MULTI_STK_SIZE/10, (CPU_STK_SIZE)MULTI_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); OS_CRITICAL_EXIT(); //退出临界区 OSTaskDel((OS_TCB*)0,&err); //删除start_task任务自身 }