zoukankan      html  css  js  c++  java
  • 如何使用cubemx 配置freertos,实时查看FreeRTOS任务列表和运行状态

    ---------------------------------------------------------------------------------------------------------------------------

    cubemx版本:version_4.20

    stm32型号:stm32f103rct6

    ---------------------------------------------------------------------------------------------------------------------------

    关键点:

      在FreeRTOSConfig.h文件中使能如下宏:
    (1)*       #define configUSE_TRACE_FACILITY                    1
    (2)*       #define configGENERATE_RUN_TIME_STATS               1
    (3)*       #define configUSE_STATS_FORMATTING_FUNCTIONS        1
    (4)*       #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()    (ulHighFrequencyTimerTicks = 0ul)
    (5)*       #define portGET_RUN_TIME_COUNTER_VALUE()            ulHighFrequencyTimerTicks
    (6) 然后开启一个定时器5,作为计算任务信息的时钟。

    --------------------------------------------------------------------------------------------------------------------------

    关键点中:

    这五个宏定义,第一个是自动生成的,第二个在cube里勾选某个选项后也是自动生成的。
    第三个是自己手动添加的。
    第四个和第五个,配置GENERATE_RUN_TIME_STATS后会自动生成。生成的是这样的:


    #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS configureTimerForRunTimeStats
    #define portGET_RUN_TIME_COUNTER_VALUE getRunTimeCounterValue
    而后边的其实是对应着各自的__weak前饰的函数。在函数体里加入了对应的语句:

    __weak void configureTimerForRunTimeStats(void)
    {
            ulHighFrequencyTimerTicks = 0ul;
    }
    __weak unsigned long getRunTimeCounterValue(void)
    {
            return ulHighFrequencyTimerTicks;
    //        return 0;
    }

    除此之外,又用TIM5作为基本定时器,定时值位10us,开启定时器5,在其回调函数里:

    void TIM5_IRQHandler(void)
    {
      /* USER CODE BEGIN TIM5_IRQn 0 */
    
      /* USER CODE END TIM5_IRQn 0 */
      HAL_TIM_IRQHandler(&htim5);
      /* USER CODE BEGIN TIM5_IRQn 1 */
    
       ulHighFrequencyTimerTicks++;
    
      /* USER CODE END TIM5_IRQn 1 */
    }

     ---------------------------------------------------------------------------------------------------------------------

     执行效果如下:

    ---------------------------------------------------------------------------------------------------------------------

    需要注意的地方:

    (1)cubemx 4.20这个版本的有个bug:

    stm32cubemx生成的main文件里面的void SystemClock_Config(void)函数里面的这部分代码

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; 

    出现了这个bug,会生成下面这样的代码,,会导致程序执行不下去。

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSE;

    用前者,替代掉后者即可。

    (2)另外,执行打印任务列表和运行状态的任务的堆栈需要大于256bype,否者可能会造成程序分配空间失败,

    导致程序卡死。

    (3)记得在主循环里面开启定时器TIM5

    HAL_TIM_Base_Start_IT(&htim5);

    ---------------------------------------------------------------------------------------------------------------------------

    源码已上传到github:源码地址

    ---------------------------------------------------------------------------------------------------------------------------

    参考blog:

    http://www.ing10bbs.com/forum.php?mod=viewthread&tid=498

  • 相关阅读:
    【译】x86程序员手册30-8.2 I/O指令
    【译】x86程序员手册29-第8章 输入输出
    【译】x86程序员手册28-7.7任务地址空间
    【译】x86程序员手册27-7.6任务链
    【译】x86程序员手册26-7.5任务切换
    【译】x86程序员手册25-7.1任务状态段
    【译】x86程序员手册23-6.5组合页与段保护
    【译】x86程序员手册24-第7章 多任务
    【译】x86程序员手册22-6.4页级保护
    WPF Blend Grid 布局
  • 原文地址:https://www.cnblogs.com/sshbit/p/10304009.html
Copyright © 2011-2022 走看看