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);
就可以了。