• 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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    经过以上的初始化代码后,在需要的地方加上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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

  • 相关阅读:
    支付宝sdk商户私钥 如何生成?
    Eigen中三维位姿表示方式以及相互转换
    MB51选择屏幕与报表增强
    链表(2)——带头双向循环链表
    自定义一个中间件(功能:解析POST提交到服务器的表单数据)
    SOC-hello world
    Spring详解(三)—— IOC 和 DI 区别
    探索 Linux 命令 `yum`:软件包管理器的奥秘
    面对200多人演讲是一种什么体验?
    本地Image Registry Harbor安装
  • 原文地址:https://blog.csdn.net/qq_29506411/article/details/133902195