任务创建示例

任务处理函数简介

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”文件中按照如下流程创建任务:

  1. 编写任务函数,创建两个不同闪烁频率的LED指示灯任务:

    1. UINT32 LED1_init(VOID)
    2. {
    3. while(1) {
    4. HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9); // 需要和“创建裸机工程”中配置的LED灯引脚对应
    5. LOS_TaskDelay(500000);
    6. }
    7. return 0;
    8. }
    9. UINT32 LED2_init(VOID)
    10. {
    11. while(1) {
    12. HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10); // 需要和“创建裸机工程”中配置的LED灯引脚对应
    13. LOS_TaskDelay(1000000);
    14. }
    15. return 0;
    16. }
  2. 配置两个任务的参数并创建任务:

    1. STATIC UINT32 LED1TaskCreate(VOID)
    2. {
    3. UINT32 taskId;
    4. TSK_INIT_PARAM_S LEDTask;
    5. (VOID)memset_s(&LEDTask, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
    6. LEDTask.pfnTaskEntry = (TSK_ENTRY_FUNC)LED1_init;
    7. LEDTask.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
    8. LEDTask.pcName = "LED1_Task";
    9. LEDTask.usTaskPrio = LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO;
    10. LEDTask.uwResved = LOS_TASK_STATUS_DETACHED;
    11. return LOS_TaskCreate(&taskId, &LEDTask);
    12. }
    13. STATIC UINT32 LED2TaskCreate(VOID)
    14. {
    15. UINT32 taskId;
    16. TSK_INIT_PARAM_S LEDTask;
    17. (VOID)memset_s(&LEDTask, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
    18. LEDTask.pfnTaskEntry = (TSK_ENTRY_FUNC)LED2_init;
    19. LEDTask.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;
    20. LEDTask.pcName = "LED2_Task";
    21. LEDTask.usTaskPrio = LOSCFG_BASE_CORE_TSK_DEFAULT_PRIO;
    22. LEDTask.uwResved = LOS_TASK_STATUS_DETACHED;
    23. return LOS_TaskCreate(&taskId, &LEDTask);
    24. }
  3. 在硬件初始化函数HardwareInit()中增加对LED灯的初始化:

    1. MX_GPIO_Init();
  4. 对于移植好的STM32F407_OpenEdv工程,任务处理函数app_init定义在targets\STM32F407_OpenEdv\Src\user_task.c文件中,其中包含了网络、文件系统等相关的任务,目前并不需要执行这些任务,可在targets\STM32F407_OpenEdv\Makefile的“USER_SRC”变量中删除这个文件,后续有相关任务需求时,可以参考这个文件的实现。

  5. 在main.c文件的main()函数前实现任务处理函数app_init(),添加对LED任务创建函数的调用:

    1. UINT32 app_init(VOID)
    2. {
    3. LED1TaskCreate();
    4. LED2TaskCreate();
    5. return 0;
    6. }

完整代码示例

main.c

任务创建示例 - 图1 说明: 此代码示例只完成了基本任务的创建,开发者可以根据实际需求创建自己的任务。