void task_2() { while(1) { task2count++; uart1.printf("Task 2 Running!!!,runtimes = %d\r\n",task2count); if(task2count%5 == 0) { uart1.printf("------Task 2 suspend!--------\r\n"); OS_TaskSuspend(TASK2_PRIO); } OS_DelayTimes(1000); } }
//开始任务函数 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); OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //挂起开始任务 OS_CRITICAL_EXIT(); //进入临界区 }
void OS_IntQRePost (void) { #if (OS_CFG_TMR_EN == DEF_ENABLED) CPU_TS ts; #endif OS_ERR err; switch (OSIntQOutPtr->Type) { /* Re-post to task */ case OS_OBJ_TYPE_FLAG: #if (OS_CFG_FLAG_EN == DEF_ENABLED) (void)OS_FlagPost((OS_FLAG_GRP *) OSIntQOutPtr->ObjPtr, OSIntQOutPtr->Flags, OSIntQOutPtr->Opt, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); #endif break; case OS_OBJ_TYPE_Q: #if (OS_CFG_Q_EN == DEF_ENABLED) OS_QPost((OS_Q *) OSIntQOutPtr->ObjPtr, OSIntQOutPtr->MsgPtr, OSIntQOutPtr->MsgSize, OSIntQOutPtr->Opt, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); #endif break; case OS_OBJ_TYPE_SEM: #if (OS_CFG_SEM_EN == DEF_ENABLED) (void)OS_SemPost((OS_SEM *) OSIntQOutPtr->ObjPtr, OSIntQOutPtr->Opt, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); #endif break; case OS_OBJ_TYPE_TASK_MSG: #if (OS_CFG_TASK_Q_EN == DEF_ENABLED) OS_TaskQPost((OS_TCB *) OSIntQOutPtr->ObjPtr, (void *) OSIntQOutPtr->MsgPtr, OSIntQOutPtr->MsgSize, OSIntQOutPtr->Opt, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); #endif break; case OS_OBJ_TYPE_TASK_RESUME: #if (OS_CFG_TASK_SUSPEND_EN == DEF_ENABLED) (void)OS_TaskResume((OS_TCB *) OSIntQOutPtr->ObjPtr, &err); #endif break; case OS_OBJ_TYPE_TASK_SIGNAL: (void)OS_TaskSemPost((OS_TCB *) OSIntQOutPtr->ObjPtr, OSIntQOutPtr->Opt, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); break; case OS_OBJ_TYPE_TASK_SUSPEND: #if (OS_CFG_TASK_SUSPEND_EN == DEF_ENABLED) (void)OS_TaskSuspend((OS_TCB *) OSIntQOutPtr->ObjPtr, &err); #endif break; case OS_OBJ_TYPE_TICK: #if (OS_CFG_TASK_TICK_EN == DEF_ENABLED) #if (OS_CFG_SCHED_ROUND_ROBIN_EN == DEF_ENABLED) OS_SchedRoundRobin(&OSRdyList[OSPrioSaved]); #endif (void)OS_TaskSemPost((OS_TCB *)&OSTickTaskTCB, /* Signal tick task */ OS_OPT_POST_NONE, #if (OS_CFG_TS_EN == DEF_ENABLED) OSIntQOutPtr->TS, #else 0u, #endif &err); #endif #if (OS_CFG_TMR_EN == DEF_ENABLED) OSTmrUpdateCtr--; if (OSTmrUpdateCtr == 0u) { OSTmrUpdateCtr = OSTmrUpdateCnt; #if (OS_CFG_TS_EN == DEF_ENABLED) ts = OS_TS_GET(); /* Get timestamp */ #else ts = 0u; #endif (void)OS_TaskSemPost(&OSTmrTaskTCB, /* Signal timer task */ OS_OPT_POST_NONE, ts, &err); } #endif break; default: break; } }
void OS_IntQRePost (void) { CPU_TS ts; OS_ERR err; switch (OSIntQOutPtr->Type) { /* Re-post to task */ case OS_OBJ_TYPE_FLAG: #if OS_CFG_FLAG_EN > 0u (void)OS_FlagPost((OS_FLAG_GRP *) OSIntQOutPtr->ObjPtr, (OS_FLAGS ) OSIntQOutPtr->Flags, (OS_OPT ) OSIntQOutPtr->Opt, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_Q: #if OS_CFG_Q_EN > 0u OS_QPost((OS_Q *) OSIntQOutPtr->ObjPtr, (void *) OSIntQOutPtr->MsgPtr, (OS_MSG_SIZE) OSIntQOutPtr->MsgSize, (OS_OPT ) OSIntQOutPtr->Opt, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_SEM: #if OS_CFG_SEM_EN > 0u (void)OS_SemPost((OS_SEM *) OSIntQOutPtr->ObjPtr, (OS_OPT ) OSIntQOutPtr->Opt, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_TASK_MSG: #if OS_CFG_TASK_Q_EN > 0u OS_TaskQPost((OS_TCB *) OSIntQOutPtr->ObjPtr, (void *) OSIntQOutPtr->MsgPtr, (OS_MSG_SIZE) OSIntQOutPtr->MsgSize, (OS_OPT ) OSIntQOutPtr->Opt, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_TASK_RESUME: #if OS_CFG_TASK_SUSPEND_EN > 0u (void)OS_TaskResume((OS_TCB *) OSIntQOutPtr->ObjPtr, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_TASK_SIGNAL: (void)OS_TaskSemPost((OS_TCB *) OSIntQOutPtr->ObjPtr, (OS_OPT ) OSIntQOutPtr->Opt, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); break; case OS_OBJ_TYPE_TASK_SUSPEND: #if OS_CFG_TASK_SUSPEND_EN > 0u (void)OS_TaskSuspend((OS_TCB *) OSIntQOutPtr->ObjPtr, (OS_ERR *)&err); #endif break; case OS_OBJ_TYPE_TICK: #if OS_CFG_SCHED_ROUND_ROBIN_EN > 0u OS_SchedRoundRobin(&OSRdyList[OSPrioSaved]); #endif (void)OS_TaskSemPost((OS_TCB *)&OSTickTaskTCB, /* Signal tick task */ (OS_OPT ) OS_OPT_POST_NONE, (CPU_TS ) OSIntQOutPtr->TS, (OS_ERR *)&err); #if OS_CFG_TMR_EN > 0u OSTmrUpdateCtr--; if (OSTmrUpdateCtr == (OS_CTR)0u) { OSTmrUpdateCtr = OSTmrUpdateCnt; ts = OS_TS_GET(); /* Get timestamp */ (void)OS_TaskSemPost((OS_TCB *)&OSTmrTaskTCB, /* Signal timer task */ (OS_OPT ) OS_OPT_POST_NONE, (CPU_TS ) ts, (OS_ERR *)&err); } #endif break; default: break; } }
//�رմ��������룬�ⲿ�������� void Q_DisableInput(void) { Disable_Touch_Inperrupt(); OS_TaskSuspend(KeysHandler_Task_Handle);//���𰴼�����߳� }