基于STM32的CPU利用率计算的代码实现
时间: 2024-05-03 12:22:17 浏览: 22
以下是基于STM32的CPU利用率计算的代码实现:
```c
#include "stm32f4xx.h"
#include "stm32f4xx_hal.h"
#include "cmsis_os.h"
#define IDLE_TASK_STACK_SIZE 128
#define TASK_1_STACK_SIZE 128
#define TASK_2_STACK_SIZE 128
#define IDLE_TASK_PRIORITY osPriorityIdle
#define TASK_1_PRIORITY osPriorityNormal
#define TASK_2_PRIORITY osPriorityNormal
#define IDLE_TASK_NAME "IdleTask"
#define TASK_1_NAME "Task1"
#define TASK_2_NAME "Task2"
void idle_task(void const * argument);
void task1(void const * argument);
void task2(void const * argument);
osThreadId idleTaskHandle;
osThreadId task1Handle;
osThreadId task2Handle;
uint32_t idleTaskCpuTime;
uint32_t task1CpuTime;
uint32_t task2CpuTime;
uint32_t totalCpuTime;
int main(void)
{
HAL_Init();
SystemClock_Config();
osThreadDef(idleTask, idle_task, IDLE_TASK_PRIORITY, 0, IDLE_TASK_STACK_SIZE);
idleTaskHandle = osThreadCreate(osThread(idleTask), NULL);
osThreadSetName(idleTaskHandle, IDLE_TASK_NAME);
osThreadDef(task1, task1, TASK_1_PRIORITY, 0, TASK_1_STACK_SIZE);
task1Handle = osThreadCreate(osThread(task1), NULL);
osThreadSetName(task1Handle, TASK_1_NAME);
osThreadDef(task2, task2, TASK_2_PRIORITY, 0, TASK_2_STACK_SIZE);
task2Handle = osThreadCreate(osThread(task2), NULL);
osThreadSetName(task2Handle, TASK_2_NAME);
osKernelStart();
}
void idle_task(void const * argument)
{
for (;;)
{
idleTaskCpuTime++;
}
}
void task1(void const * argument)
{
for (;;)
{
task1CpuTime++;
osDelay(100);
}
}
void task2(void const * argument)
{
for (;;)
{
task2CpuTime++;
osDelay(50);
}
}
void SysTick_Handler(void)
{
totalCpuTime++;
}
void HAL_MspInit(void)
{
__HAL_RCC_SYSCFG_CLK_ENABLE();
__HAL_RCC_PWR_CLK_ENABLE();
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 360;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
}
```
该代码利用了FreeRTOS操作系统来创建三个任务:一个空闲任务和两个周期性任务。空闲任务将会一直运行,计算CPU空闲时间。两个周期性任务分别每隔100ms和50ms运行一次,计算CPU占用时间。同时,SysTick中断被用来计算总CPU时间。最终,可以通过简单的计算来计算CPU利用率。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)