1. 函数接口在freertos.c文件中已经默认创建了一个任务defaultTaskHandleosThreadNew(StartDefaultTask,NULL,defaultTask_attributes);osThreadNew函数位于cmsis_os2.c文件中cmsis_os2.c其实提供了统一的RTOS接口在FreeRTOS中创建任务的接口与RT-Thread使用的接口可能不一样FreerRTOS可能使用xTaskCreateRT-Thread可能使用rt_thread_createcmsis_os2.c把这两者统一在一个接口下osThreadNew下当然在使用FreeRTOS时也可以使用两个原生接口xTaskCreate与xTaskCreateStaticBaseType_txTaskCreate(TaskFunction_t pxTaskCode,// 函数指针, 任务函数constchar*constpcName,// 任务的名字constconfigSTACK_DEPTH_TYPE usStackDepth,// 栈大小,单位为word,10表示40字节void*constpvParameters,// 调用任务函数时传入的参数UBaseType_t uxPriority,// 优先级TaskHandle_t*constpxCreatedTask);// 任务句柄, 以后使用它来操作这个任务参数作用TaskFunction_t pxTaskCode传入一个任务函数其函数指针为typedef void (*osThreadFunc_t) (void *argument);下面一节中的伪代码const char * const pcName给任务取一个名字这个无所谓自己取一个自己喜欢的就可以了const configSTACK_DEPTH_TYPE usStackDepth栈深度不理解也不要紧可以认为是一个任务中的变量、数据等需要一定的空间来存放这里的栈空间大小要比需要的大 才可以void * const pvParameters传入参数可以向任务中传入参数比如说UART任务可以传入波特率等一般取NULL就可以(如果不用的话)UBaseType_t uxPriority任务具有优先级 如果对优先级比较熟悉的话 可以使用数字 也可以使用cmsis_os2.h中提供的宏osPriorityAboveNormal,osPriorityHigh都可以TaskHandle_t * const pxCreatedTask返回任务句柄 句柄在C语言中可以用结构体理解 里面的参数在任务调度时被使用 可以通过句柄来修改任务的特性等(比如说 : 任务级等)返回值自已go define看一下吧也可以静态分配内存xTaskCreateStatic只不过要手动分配任务栈与任务控制块其实cmsis_ov2统一的接口就可以了 也就是osThreadNew2. 创建新的任务使用osThreadNew去创建任务这种方式简单 而且也方便移植 当然也可以使用FreeRTOS的源码这也是没有问题的2.1 任务添加在哪在main.c中具有启动FreeRTOS的代码对于1 3可以不需要去管 1是去配置FreeRTOS的一些基本参数 3是去启动FreeRTOS的调度对于FreeRTOS的调度 就是去协调每一个任务 让每一个任务都可以正常地执行 如果说没有接触过操作系统或者是只是简单学习过一些编程语言的话 可能会好奇 main下的函数不是顺序执行吗 那么是怎么每个任务都会好依次都可以执行的其实是一个任务运行一会退出 然后上另一个任务运行一会儿退出 而决定哪个任务上CPU运行 是由任务调度决定的在MX_FREERTOS_Init()中初始化任务 也就是在这里面添加任务在MX_FREERTOS_Init()中可以添加自定义的初始化函数User_Tasks_Init()可以在User_Tasks_Init()中添加自己的任务 这样也方便管理在MX_FREERTOS_Init()的下面有 一个默认任务使用任务函数StartDefaultTask不向任务中传入参数NULL使用参数defaultTask_attributesdefaultTaskHandleosThreadNew(StartDefaultTask,NULL,defaultTask_attributes);defaultTask_attributes查看一下给任务设置的参数可以看到起的名字申请的栈空间设置的优先constosThreadAttr_tdefaultTask_attributes{.namedefaultTask,.stack_size128*4,.priority(osPriority_t)osPriorityNormal,};定义了一个句柄来承接返回值osThreadId_tdefaultTaskHandle;同样 给出StartDefaultTask这个默认任务默认任务为 每隔500ms 对PC13端口的电平进行翻转for(;;)不是陷入了死循环了吗 其实不需要担心 任务就是不会停止(当然除非 主动停止)不需要担心死循环 因为FreeRTOS会不断地调度任务也可以写为while(1) { /*task任务*/ }voidStartDefaultTask(void*argument){/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);osDelay(500);}/* USER CODE END StartDefaultTask */}给一个添加LVGL任务的例子如果在参数中没有给 任务栈空间 与 任务控制块的话 会自动动态分配在创建了新的进程之后 启动FreeROTS调度器之后 就可以正常运行LvHandlerTask任务也会上调度器运行osThreadId_tLvHandlerTaskHandle;constosThreadAttr_tLvHandlerTask_attributes{.nameLvHandlerTask,.stack_size128*24,.priority(osPriority_t)osPriorityLow,};voidUser_Tasks_Init(void){LvHandlerTaskHandleosThreadNew(LvHandlerTask,NULL,LvHandlerTask_attributes);}