
# 创建任务
#### 任务简介
LiteOS支持多任务。在LiteOS 中，一个任务表示一个线程。任务可以使用或等待CPU、使用内存空间等系统资源，并独立于其它任务运行。LiteOS实现了任务之间的切换和通信，帮助开发者管理业务程序流程。开发者可以将更多的精力投入到业务功能的实现中。
在LiteOS中，通过函数LOS_TaskCreate()创建任务，LOS_TaskCreate()函数原型在kernel\\base\\los_task.c文件中定义。调用LOS_TaskCreate()创建一个任务后，任务就会进入就绪状态。
#### 任务创建流程
下面以一个循环亮灯任务为例，介绍LiteOS任务创建流程。
在移植好的开发板工程"targets\\开发板名称\\Src\\main.c"文件中按照如下流程创建任务：
1. 编写任务函数，创建两个不同闪烁频率的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;
   }
   ```
   
2. 配置两个任务的参数并创建任务：
   ```
   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);
   }
   ```
   
3. 在硬件初始化函数HardwareInit()中增加对LED灯的初始化：
   ```
   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任务创建函数的调用：
   ```
   UINT32 app_init(VOID)
   {
       LED1TaskCreate();
       LED2TaskCreate();
       return 0;
   }
   ```
   
#### 完整代码示例
[main.c](https://support.huaweicloud.com/porting-LiteOS/resource/main.c)
![](https://support.huaweicloud.com/porting-LiteOS/public_sys-resources/note_3.0-zh-cn.png)
此代码示例只完成了基本任务的创建，开发者可以根据实际需求创建自己的任务。
