FreeRTOS使用总结

目录

  • 配置项说明
  • 初始化代码
    • 计数信号量初始化
    • 定时器初始化

配置项说明

  1. configUSE_DAEMON_TASK_STARTUP_HOOK
    如果使能这个选项,需要定义void vApplicationDaemonTaskStartupHook(void)函数,用于完成用户级的初始化代码,使用这个选项的优点是在初始化过程中就可以使用FreeRTOS的功能,并且可以将初始化过程集中在一起完成。这个函数在初始化FreeRTOS内核完成之后,调用用户任务之前会且只会被执行一遍。

初始化代码

如果每次需要信号量,定时器时都由cubeMx配置再重新生成代码,会很麻烦,会很麻烦,不如自己写以下初始化代码。

计数信号量初始化

// FILE NAME: freertos.c

/* USER CODE BEGIN Variables */
/* Definitions for sem_cmd_cnt */
osSemaphoreId_t sem_cmd_cnt;
const osSemaphoreAttr_t sem_cmd_cnt_attributes = {
  .name = "sem_cmd_cnt"
};
/* USER CODE END Variables */

/* USER CODE BEGIN RTOS_SEMAPHORES */
sem_cmd_cnt = osSemaphoreNew(1, 0, &sem_cmd_cnt_attributes);	// max_cnt=1, init_cnt=0
/* USER CODE END RTOS_SEMAPHORES */

经过以上的初始化代码后,在需要的地方加上osSemaphoreRelease(sem_cmd_cnt);以及osSemaphoreAcquire(sem_cmd_cnt, osWaitForever);就可以了。

定时器初始化

// FILE NAME: freertos.c

/* USER CODE BEGIN Variables */
/* Definitions for timer_10ms */
osTimerId_t timer_10ms;
const osTimerAttr_t timer_10ms_attributes = {
  .name = "timer_10ms"
};
/* USER CODE END Variables */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */
void timer_10ms_cb(void *argument);
/* USER CODE END FunctionPrototypes */

/* USER CODE BEGIN RTOS_TIMERS */
timer_10ms = osTimerNew(timer_10ms_cb, osTimerPeriodic, NULL, &timer_10ms_attributes);	// 指定回调函数,周期性调用
/* USER CODE END RTOS_TIMERS */

/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */
/* timer_10ms_cb function */
__weak void timer_10ms_cb(void *argument)		// 定义回调函数,也可以在其他适当的地方定义
{
    // timer task
}
/* USER CODE END Application */

然后在需要的时候调用osTimerStart(timer_10ms, 10);就可以了。

你可能感兴趣的:(FreeRTOS,freertos)