任务创建示例
任务处理函数简介
LiteOS的main函数定义在开发板工程的main.c文件中,主要负责硬件和内核的初始化工作,并在初始化完成后开始任务调度。在main() 调用的OsMain函数中,会调用OsAppInit() 创建一个名为“app_Task”的任务,该任务的处理函数为app_init()。用户可以直接在app_init()中添加自己的代码,可以为一段功能代码或者是一个任务。
创建任务
任务简介
LiteOS支持多任务。在LiteOS 中,一个任务表示一个线程。任务可以使用或等待CPU、使用内存空间等系统资源,并独立于其它任务运行。LiteOS实现了任务之间的切换和通信,帮助开发者管理业务程序流程。开发者可以将更多的精力投入到业务功能的实现中。
在LiteOS中,通过函数LOS_TaskCreate()创建任务,LOS_TaskCreate()函数原型在kernel\base\los_task.c文件中定义。调用LOS_TaskCreate()创建一个任务后,任务就会进入就绪状态。
任务创建流程
下面以一个循环亮灯任务为例,介绍LiteOS任务创建流程。
在移植好的开发板工程“targets\开发板名称\Src\main.c”文件中按照如下流程创建任务:
编写任务函数,创建两个不同闪烁频率的LED指示灯任务:
UINT32 LED1_init(VOID)
{
while(1) {
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9); // 需要和“创建裸机工程”中配置的LED灯引脚对应
LOS_TaskDelay(500000);
}
return 0;
}
UINT32 LED2_init(VOID)
{
while(1) {
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10); // 需要和“创建裸机工程”中配置的LED灯引脚对应
LOS_TaskDelay(1000000);
}
return 0;
}
配置两个任务的参数并创建任务:
STATIC UINT32 LED1TaskCreate(VOID)
{
UINT32 taskId;
TSK_INIT_PARAM_S LEDTask;
(VOID)memset_s(&LEDTask, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
LEDTask.pfnTaskEntry = (TSK_ENTRY_FUNC)LED1_init;
LEDTask.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
LEDTask.pcName = "LED1_Task";
LEDTask.usTaskPrio = LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO;
LEDTask.uwResved = LOS_TASK_STATUS_DETACHED;
return LOS_TaskCreate(&taskId, &LEDTask);
}
STATIC UINT32 LED2TaskCreate(VOID)
{
UINT32 taskId;
TSK_INIT_PARAM_S LEDTask;
(VOID)memset_s(&LEDTask, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
LEDTask.pfnTaskEntry = (TSK_ENTRY_FUNC)LED2_init;
LEDTask.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
LEDTask.pcName = "LED2_Task";
LEDTask.usTaskPrio = LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO;
LEDTask.uwResved = LOS_TASK_STATUS_DETACHED;
return LOS_TaskCreate(&taskId, &LEDTask);
}
在硬件初始化函数HardwareInit()中增加对LED灯的初始化:
MX_GPIO_Init();
对于移植好的STM32F407_OpenEdv工程,任务处理函数app_init定义在targets\STM32F407_OpenEdv\Src\user_task.c文件中,其中包含了网络、文件系统等相关的任务,目前并不需要执行这些任务,可在targets\STM32F407_OpenEdv\Makefile的“USER_SRC”变量中删除这个文件,后续有相关任务需求时,可以参考这个文件的实现。
在main.c文件的main()函数前实现任务处理函数app_init(),添加对LED任务创建函数的调用:
UINT32 app_init(VOID)
{
LED1TaskCreate();
LED2TaskCreate();
return 0;
}
完整代码示例
说明: 此代码示例只完成了基本任务的创建,开发者可以根据实际需求创建自己的任务。