拓冰建站拓冰建站
首页 / 资讯中心 / 正文

STM32HAL库FreeRTOS-1.创建任务

1.FreeRTOS的状态1-1 freerots状态示意图freertos有四种状态如上图1-1所示1.1创建任务首先在CubeMX选择HAL库的FREERTOS界面选择V1版本V2版本多了一个内存池。然后点击Tasks and Queues,之后编辑任务名称(Task Name)和任务接口函数名称Entry Function其他的没有特殊需求默认即可。接着检查一下freertos使用的时钟源是什么如果是系统滴答计时器就看看系统时钟使用的定时器是否与freertos冲突了。如果冲突了就在此处修改时钟源改为别的定时器作为系统时钟基准。注意当该时钟源作为系统时钟后其时钟源就不可作为定时器资源使用了1.2查看任务程序在配置好cubemx的设定后就可以开始使用freertos进行程序编写cubemx自动导入了freertos的相关文件免去了很多不必要的精力。int main(void) { SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_TIM1_Init(); MX_TIM4_Init(); MX_USART2_UART_Init(); MX_USART1_UART_Init(); MX_IWDG_Init(); /* USER CODE BEGIN 2 */ PWM_Init(); UART_DMA_Init(); /* USER CODE END 2 */ /* Call init function for freertos objects (in freertos.c) */ MX_FREERTOS_Init(); //freertos任务初始化目前此处为任务创建的位置随着后续深入了解freertos,此处也会发生相应的改变 /* Start scheduler */ osKernelStart(); //开始任务调度 while (1) { } }此时点击main.c文件就能看到FreeRtos任务创建函数了然后下面我们看看freertos.c文件里对这个函数的描写。osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128); // 宏展开后实际定义了一个静态结构体 const osThreadDef_t os_thread_def_defaultTask { defaultTask, // 名称 StartDefaultTask, // 函数指针 osPriorityNormal, // 优先级 0, // 实例数 128 // 堆栈大小 };对比原来的FreeRtos// osThread 宏展开为 os_thread_def_defaultTask // osThreadCreate 内部最终调用 xTaskCreate( os_thread_def_defaultTask-pthread, os_thread_def_defaultTask-name, os_thread_def_defaultTask-stacksize, argument, os_thread_def_defaultTask-tpriority, defaultTaskHandle );接下来举一个简单的例子在任务内进行点灯操作void Motor_Task(void const * argument) { /* USER CODE BEGIN Motor_Task */ for(;;) { // 点亮 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); osDelay(500); // 亮 500ms // 熄灭 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); osDelay(500); // 灭 500ms } /* USER CODE END Motor_Task */ }直接在创建的任务接口函数内编写点灯程序即可不过要注意该任务的优先级。1.3 任务优先级FreeRtos也有任务优先级不同的任务对应不同的任务优先级从idle最低至Realtime最高是从低到高的优先级排列顺序根据自己的需要选择配置即可。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门