STM32 CubeMX (第四步Freertos内存管理和CPU使用率)

STM32 CubeMX


STM32 CubeMX (第四步Freertos内存管理和CPU使用率)


学习使用Freertos第四步
在 FreeRTOS 中,中断管理和软件定时:

  1. ·taskENTER_CRITICAL()·; 是一个函数在 FreeRTOS 中使用的,用于进入临界区(critical section)。在临界区内,中断会被禁用,这样可以确保在多任务环境下共享资源的安全性。你可以在需要保护共享资源的代码段中使用
  2. · taskENTER_CRITICAL()·; 来禁用中断,然后在临界区结束时使用 taskEXIT_CRITICAL();
    来重新启用中断。这样可以防止多个任务同时访问共享资源而导致的竞态条件。

一、STM32 CubeMX设置

时钟配置

HAL时基选择TIM1(不要选择滴答定时器;滴答定时器留给OS系统做时基)

使用STM32 CubeMX 库,配置Freertos

选择CMISS_V1接口就可以满足Freertos接口;且代码量比CMISS_V2小(CMISS_V2支持更多的RTOS接口,所以代码量比CMISS_V1多)

使能定时器,计时0.1中断

使能宏定义

二、实验一,CPU使用率

设置时基

配置代码

c 复制代码
__weak void configureTimerForRunTimeStats(void)
{
 g_osRuntimeCounter=0;
}

__weak unsigned long getRunTimeCounterValue(void)
{
return g_osRuntimeCounter;
}

任务代码

c 复制代码
void StartDefaultTask1(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask1 */
  /* Infinite loop */
  for(;;)
  {
		printf("Task01 \r\n");		// printf输出字符串
    osDelay(1000);
  }
  /* USER CODE END StartDefaultTask1 */
}

/* USER CODE BEGIN Header_StartTask02 */
/**
* @brief Function implementing the Task02 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
  /* USER CODE BEGIN StartTask02 */
  /* Infinite loop */
  for(;;)
  {
    printf("Task02 \r\n");		// printf输出字符串
    osDelay(1000);
  }
  /* USER CODE END StartTask02 */
}

/* USER CODE BEGIN Header_CpuStartTask03 */
/**
* @brief Function implementing the CpuTask03 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_CpuStartTask03 */
 uint8_t CPU_RunInfo[400];		            //保存任务运行时间信息
void CpuStartTask03(void const * argument)
{
  
  /* Infinite loop */
  for(;;)
  {
	  printf("  B:阻塞  R:就绪  D:删除  S:暂停  X:运行 \r\n");
    memset(CPU_RunInfo,0,400);				//信息缓冲区清零
    osThreadList(CPU_RunInfo);              //获取任务运行时间信息

    printf("---------------------------------------------\r\n");
    printf("Task      Task_Status Priority  Remaining_Stack Task_No\r\n");
    printf("%s", CPU_RunInfo);
    printf("---------------------------------------------\r\n");
    
//    memset(CPU_RunInfo,0,400);				//信息缓冲区清零
//    
//    vTaskGetRunTimeStats((char *)&CPU_RunInfo);
//    
//    printf("Task       Running_Count        Utilization\r\n");
//    printf("%s", CPU_RunInfo);
//    printf("---------------------------------------------\r\n\n");
    osDelay(1000);
  }
 
}

实验现象

相关推荐
xiangw@GZ1 小时前
802.11全系列标准调制编码与速率档对应关系
网络·单片机·嵌入式硬件·架构
希希之光2 小时前
Aurix Tc3xx Port&Dio模块总结
单片机·嵌入式硬件
三品吉他手会点灯2 小时前
STM32F103 学习笔记-24-I2C-读写EEPROM(第1节)-I2C物理层介绍
笔记·stm32·学习
日拱一卒的小田2 小时前
ZYNQ学习笔记2-ZYNQ的UART控制器1
单片机·嵌入式硬件
我想走路带风2 小时前
OPENWRT-Day01
stm32·单片机·嵌入式硬件
ACP广源盛139246256733 小时前
GSV2221@ACP#DP 1.4 MST 多屏转换芯片,物理 AI 多模态交互的视觉中枢
大数据·人工智能·嵌入式硬件·gpt·spark
云栖梦泽4 小时前
Linux内核与驱动:pinctl子系统和GPIO子系统
linux·单片机·嵌入式硬件
电气_空空4 小时前
基于 LabVIEW 的单片机串口通信设计
单片机·嵌入式硬件·毕业设计·labview
逻极5 小时前
Windows 平台 Ollama AMD GPU 一键编译指南:基于 ROCm 7.1 的自动化实战
人工智能·windows·stm32·自动化·gpu·amd·ollama
caimouse6 小时前
Reactos 第 9 章 设备驱动 — 9.10 磁盘的Miniport驱动模块
windows·嵌入式硬件