cubemx配置FreeRTOS串口输出任务信息

74 篇文章 0 订阅
73 篇文章 1 订阅

cubemx配置FreeRTOS串口输出任务信息

 
  1. 关键步骤:

  2. 1. cubemx中使能任务信息相关宏(3个);

  3. 2. 配置2个宏定义

  4. 3. 开启一个定时器,作为计算任务信息的时钟;

  5. 4. 调用函数输出任务信息

1.环境:

  • packages版本(STM32F4 1.21)

  • cubemx版本(version4.27.0 && STM32Cube v1.0)

  • MDK版本(KEIL6 V5.23.0.0)

 

 

2. cubemx配置

 
  1. 主要配置

  2. 1. 配置时钟源

  3. 2. 配置系统debug与系统时钟

  4. 3. 配置定时器5

  5. 4. 配置串口1

  6. 5. 使能FreeRTOS,配置相关宏,添加3个任务

  7. 6. 生成工程代码

3. 代码修改

 
  1. 主要工作:

  2. 1. 定义定时器5的溢出次数计算任务信息

  3. 2. 在相关宏定义函数内添加定时器溢出次数变量

  4. 3. 修改定时器中断函数

  5. 4. 启动定时器5

  6. 5. 修改串口1到标准输出

  7. 6. 布置led闪烁与打印任务信息

在 freertos.c定义定时器5的溢出次数变量 ulHighFrequencyTimerTicks

 
  1. volatile unsigned long ulHighFrequencyTimerTicks = 0ul;

在cubemx勾选图示三个宏后会在 freertos.c中生成两个函数,在其中添加信息如下 

 
  1. void configureTimerForRunTimeStats(void)

  2. {

  3. ulHighFrequencyTimerTicks = 0ul;

  4. }

  5.  

  6. unsigned long getRunTimeCounterValue(void)

  7. {

  8. return ulHighFrequencyTimerTicks;

  9. }

在中断管理文件中 stm32f4xx_it.c修改定时器5的中断函数, 声明定时器溢出次数变量为外部定义变量,

 
  1. /* USER CODE BEGIN 0 */

  2. extern volatile unsigned long ulHighFrequencyTimerTicks;

  3. /* USER CODE END 0 */

在中断函数里添加 ulHighFrequencyTimerTicks自加操作

 
  1. void TIM5_IRQHandler(void)

  2. {

  3. /* USER CODE BEGIN TIM5_IRQn 0 */

  4.  

  5. /* USER CODE END TIM5_IRQn 0 */

  6. HAL_TIM_IRQHandler(&htim5);

  7. /* USER CODE BEGIN TIM5_IRQn 1 */

  8. ulHighFrequencyTimerTicks++;

  9. /* USER CODE END TIM5_IRQn 1 */

  10. }

主函数里启动定时器5

 
  1. /* Initialize all configured peripherals */

  2. MX_GPIO_Init();

  3. MX_USART1_UART_Init();

  4. MX_TIM5_Init();

  5. /* USER CODE BEGIN 2 */

  6. HAL_TIM_Base_Start_IT(&htim5);

  7. /* USER CODE END 2 */

usart.c文件中修改串口1到标准输出

 
  1. /* USER CODE BEGIN 1 */

  2. //实现printf函数重定向到串口1,即支持printf信息到USART1

  3. #ifdef __GNUC__

  4. /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf

  5. set to "Yes") calls __io_putchar() */

  6. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

  7. #else

  8. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

  9. #endif /* __GNUC__ */

  10. /**

  11. * @brief Retargets the C library printf function to the USART.

  12. * @param None

  13. * @retval None

  14. */

  15. PUTCHAR_PROTOTYPE

  16. {

  17. /* Place your implementation of fputc here */

  18. /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */

  19. HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  20.  

  21. return ch;

  22. }

  23. /* USER CODE END 1 */

添加任务内代码实现任务信息输出

 
  1. /* USER CODE BEGIN Header_StartPrintfTask */

  2. /**

  3. * @brief Function implementing the PrintfTask thread.

  4. * @param argument: Not used

  5. * @retval None

  6. */

  7. /* USER CODE END Header_StartPrintfTask */

  8. void StartPrintfTask(void const * argument)

  9. {

  10.  

  11. /* USER CODE BEGIN StartPrintfTask */

  12. uint8_t pcWriteBuffer[200];

  13. /* Infinite loop */

  14. for(;;)

  15. {

  16. printf("=================================================\r\n");

  17. printf("\r\ntask_name \tstate\t prior\trtack\t Id\r\n");

  18. vTaskList((char *)&pcWriteBuffer);

  19. printf("%s\r\n", pcWriteBuffer);

  20.  

  21. printf("\r\ntask_name time_count(10us) usage_pec\r\n");

  22. vTaskGetRunTimeStats((char *)&pcWriteBuffer);

  23. printf("%s\r\n", pcWriteBuffer);

  24.  

  25. osDelay(1000);

  26. }

  27. /* USER CODE END StartPrintfTask */

  28. }

  29.  

  30. /* USER CODE BEGIN Header_StartTask02 */

  31. /**

  32. * @brief Function implementing the myTask02 thread.

  33. * @param argument: Not used

  34. * @retval None

  35. */

  36. /* USER CODE END Header_StartTask02 */

  37. void StartTask02(void const * argument)

  38. {

  39. /* USER CODE BEGIN StartTask02 */

  40. /* Infinite loop */

  41. for(;;)

  42. {

  43. HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);

  44. osDelay(500);

  45. }

  46. /* USER CODE END StartTask02 */

  47. }

  48.  

  49. /* USER CODE BEGIN Header_StartTask03 */

  50. /**

  51. * @brief Function implementing the myTask03 thread.

  52. * @param argument: Not used

  53. * @retval None

  54. */

  55. /* USER CODE END Header_StartTask03 */

  56. void StartTask03(void const * argument)

  57. {

  58. /* USER CODE BEGIN StartTask03 */

  59. /* Infinite loop */

  60. for(;;)

  61. {

  62. HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);

  63. osDelay(500);

  64. }

  65. /* USER CODE END StartTask03 */

  66. }

实际串口输出效果如下 

代码修改效果如下: 

 

源代码上传github

品略图书馆 http://www.pinlue.com/ http://m.pinlue.com/

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值