tx_application_define用于任务的创建,它的具体内容需要我们来实现,接下来我们就来实现tx_application_define这个函数。
我们计划实现5个任务,包括启动任务、红灯闪烁任务、绿灯闪烁任务、空闲任务及统计任务。其中为启动任务用于初始化一些配置并执行一些如系统心跳、看门狗之类的工作;用于红灯闪烁任务和绿灯闪烁任务用于实现我们要操作的指示灯控制;空闲任务在其他任务不运行时其运行,优先级最低。统计任务再次我们实现系统空闲率的统计。接下来我们就按此思路来实现。
/*tx_application_define函数实现*/
void tx_application_define(void *first_unused_memory)
{
/**************创建启动任务*********************/
tx_thread_create(&AppTaskStartTCB, /* 任务控制块地址 */
"App Task Start", /* 任务名 */
AppTaskStart, /* 启动任务函数地址 */
0, /* 传递给任务的参数 */
&AppTaskStartStk[0], /* 堆栈基地址 */
APP_CFG_TASK_START_STK_SIZE, /* 堆栈空间大小 */
APP_CFG_TASK_START_PRIO, /* 任务优先级*/
APP_CFG_TASK_START_PRIO, /* 任务抢占阀值 */
TX_NO_TIME_SLICE, /* 不开启时间片 */
TX_AUTO_START); /* 创建后立即启动 */
/**************创建红灯闪烁任务*********************/
tx_thread_create(&AppTaskRedLedTCB, /* 任务控制块地址 */
"App Msp Pro", /* 任务名 */
AppTaskRedLED, /* 启动任务函数地址 */
0, /* 传递给任务的参数 */
&AppTaskMsgProStk[0], /* 堆栈基地址 */
APP_CFG_TASK_RedLED_STK_SIZE, /* 堆栈空间大小 */
APP_CFG_TASK_REDLED_PRIO, /* 任务优先级*/
APP_CFG_TASK_REDLED_PRIO, /* 任务抢占阀值 */
TX_NO_TIME_SLICE, /* 不开启时间片 */
TX_AUTO_START); /* 创建后立即启动 */
/**************创建绿灯闪烁任务*********************/
tx_thread_create(&AppTaskGreenLEDTCB, /* 任务控制块地址 */
"App Task UserIF", /* 任务名 */
AppTaskGreenLED, /* 启动任务函数地址 */
0, /* 传递给任务的参数 */
&AppTaskUserIFStk[0], /* 堆栈基地址 */
APP_CFG_TASK_GreenLED_STK_SIZE, /* 堆栈空间大小 */
APP_CFG_TASK_GREENLED_PRIO, /* 任务优先级*/
APP_CFG_TASK_GREENLED_PRIO, /* 任务抢占阀值 */
TX_NO_TIME_SLICE, /* 不开启时间片 */
TX_AUTO_START); /* 创建后立即启动 */
/**************创建统计任务*********************/
tx_thread_create(&AppTaskStatTCB, /* 任务控制块地址 */
"App Task STAT", /* 任务名 */
AppTaskStat, /* 启动任务函数地址 */
0, /* 传递给任务的参数 */
&AppTaskStatStk[0], /* 堆栈基地址 */
APP_CFG_TASK_STAT_STK_SIZE, /* 堆栈空间大小 */
APP_CFG_TASK_STAT_PRIO, /* 任务优先级*/
APP_CFG_TASK_STAT_PRIO, /* 任务抢占阀值 */
TX_NO_TIME_SLICE, /* 不开启时间片 */
TX_AUTO_START); /* 创建后立即启动 */
/**************创建空闲任务*********************/
tx_thread_create(&AppTaskIdleTCB, /* 任务控制块地址 */
"App Task IDLE", /* 任务名 */
AppTaskIDLE, /* 启动任务函数地址 */
0, /* 传递给任务的参数 */
&AppTaskIdleStk[0], /* 堆栈基地址 */
APP_CFG_TASK_IDLE_STK_SIZE, /* 堆栈空间大小 */
APP_CFG_TASK_IDLE_PRIO, /* 任务优先级*/
APP_CFG_TASK_IDLE_PRIO, /* 任务抢占阀值 */
TX_NO_TIME_SLICE, /* 不开启时间片 */
TX_AUTO_START); /* 创建后立即启动 */
}/*tx_application_define函数实现*/
void tx_application_define(void *first_unused_memory)
{
/**************创建启动任务*********************/
tx_thread_create(&AppTaskStartTCB, /* 任务控制块地址 */
"App Task Start", /* 任务名 */
AppTaskStart, /* 启动任务函数地址 */
0, /* 传递给任务的参数 */
&AppTaskStartStk[0], /* 堆栈基地址 */
APP_CFG_TASK_START_STK_SIZE, /* 堆栈空间大小 */
APP_CFG_TASK_START_PRIO, /* 任务优先级*/
APP_CFG_TASK_START_PRIO, /* 任务抢占阀值 */
TX_NO_TIME_SLICE, /* 不开启时间片 */
TX_AUTO_START); /* 创建后立即启动 */
/**************创建红灯闪烁任务*********************/
tx_thread_create(&AppTaskRedLedTCB, /* 任务控制块地址 */
"App Msp Pro", /* 任务名 */
AppTaskRedLED, /* 启动任务函数地址 */
0, /* 传递给任务的参数 */
&AppTaskMsgProStk[0], /* 堆栈基地址 */
APP_CFG_TASK_RedLED_STK_SIZE, /* 堆栈空间大小 */
APP_CFG_TASK_REDLED_PRIO, /* 任务优先级*/
APP_CFG_TASK_REDLED_PRIO, /* 任务抢占阀值 */
TX_NO_TIME_SLICE, /* 不开启时间片 */
TX_AUTO_START); /* 创建后立即启动 */
/**************创建绿灯闪烁任务*********************/
tx_thread_create(&AppTaskGreenLEDTCB, /* 任务控制块地址 */
"App Task UserIF", /* 任务名 */
AppTaskGreenLED, /* 启动任务函数地址 */
0, /* 传递给任务的参数 */
&AppTaskUserIFStk[0], /* 堆栈基地址 */
APP_CFG_TASK_GreenLED_STK_SIZE, /* 堆栈空间大小 */
APP_CFG_TASK_GREENLED_PRIO, /* 任务优先级*/
APP_CFG_TASK_GREENLED_PRIO, /* 任务抢占阀值 */
TX_NO_TIME_SLICE, /* 不开启时间片 */
TX_AUTO_START); /* 创建后立即启动 */
/**************创建统计任务*********************/
tx_thread_create(&AppTaskStatTCB, /* 任务控制块地址 */
"App Task STAT", /* 任务名 */
AppTaskStat, /* 启动任务函数地址 */
0, /* 传递给任务的参数 */
&AppTaskStatStk[0], /* 堆栈基地址 */
APP_CFG_TASK_STAT_STK_SIZE, /* 堆栈空间大小 */
APP_CFG_TASK_STAT_PRIO, /* 任务优先级*/
APP_CFG_TASK_STAT_PRIO, /* 任务抢占阀值 */
TX_NO_TIME_SLICE, /* 不开启时间片 */
TX_AUTO_START); /* 创建后立即启动 */
/**************创建空闲任务*********************/
tx_thread_create(&AppTaskIdleTCB, /* 任务控制块地址 */
"App Task IDLE", /* 任务名 */
AppTaskIDLE, /* 启动任务函数地址 */
0, /* 传递给任务的参数 */
&AppTaskIdleStk[0], /* 堆栈基地址 */
APP_CFG_TASK_IDLE_STK_SIZE, /* 堆栈空间大小 */
APP_CFG_TASK_IDLE_PRIO, /* 任务优先级*/
APP_CFG_TASK_IDLE_PRIO, /* 任务抢占阀值 */
TX_NO_TIME_SLICE, /* 不开启时间片 */
TX_AUTO_START); /* 创建后立即启动 */
}
我们实现了tx_application_define函数,在其中创建了任务,理所当然我们还需要实现相应的任务函数。
/*系统启动任务*/
static void AppTaskStart (ULONG thread_input)
{
(void)thread_input;
/* 任务统计前先挂起其它任务 */
tx_thread_suspend(&AppTaskRedLedTCB);
tx_thread_suspend(&AppTaskGreenLEDTCB);
OSStatInit();
/* 任务统计完毕后,恢复其它任务 */
tx_thread_resume(&AppTaskRedLedTCB);
tx_thread_resume(&AppTaskGreenLEDTCB);
/* 内核开启后,恢复HAL里的时间基准 */
HAL_ResumeTick();
while (1)
{
sysHeartBeat++;
tx_thread_sleep(1000);
}
}
/*红灯闪烁控制*/
static void AppTaskRedLED(ULONG thread_input)
{
(void)thread_input;
while(1)
{
HAL_GPIO_TogglePin(GPIOI,GPIO_PIN_8);
tx_thread_sleep(500);
}
}
/*绿灯闪烁控制*/
static void AppTaskGreenLED(ULONG thread_input)
{
(void)thread_input;
while(1)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
tx_thread_sleep(2000);
}
}
/*统计任务函数*/
static void AppTaskStat(ULONG thread_input)
{
(void)thread_input;
while (OSStatRdy == false)
{
tx_thread_sleep(200); /* 等待统计任务就绪 */
}
OSIdleCtrMax /= 100uL;
if (OSIdleCtrMax == 0uL)
{
OSCPUUsage = 0u;
}
OSIdleCtr = OSIdleCtrMax * 100uL; /* 设置初始CPU利用率 0% */
for (;;)
{
OSIdleCtrRun = OSIdleCtr; /* 获得100ms内空闲计数 */
OSIdleCtr = 0uL; /* 复位空闲计数 */
OSCPUUsage = (100uL - (float)OSIdleCtrRun / OSIdleCtrMax);
tx_thread_sleep(100); /* 每100ms统计一次 */
}
}
/*空闲任务函数*/
static void AppTaskIDLE(ULONG thread_input)
{
TX_INTERRUPT_SAVE_AREA
(void)thread_input;
while(1)
{
TX_DISABLE
OSIdleCtr++;
TX_RESTORE
}
}