任务堆栈大小确定
任务堆栈大小确定
任务堆栈大小确定方案
MDK-htm文件分析
堆栈检测API
栈溢出检测
任务状态信息打印
任务堆栈检测应用
栈溢出检测方案一
cubemx配置
使能下面的两个宏
代码
/* USER CODE BEGIN Header_Usart_Task */
void vStackOverFlowTest(void)
{
uint8_t u8TestBuff[128];
int16_t i;
(void)u8TestBuff;
for(i=360;i>=0;i--){
u8TestBuff[i] = 0x88;
}
}
/* USER CODE END Header_Usart_Task */
void Usart_Task(void const * argument)
{
/* USER CODE BEGIN Usart_Task */
/* Infinite loop */
for(;;)
{
vStackOverFlowTest();
osDelay(2);
}
/* USER CODE END Usart_Task */
}
/* USER CODE BEGIN 4 */
__weak void vApplicationStackOverflowHook(xTaskHandle xTask, signed char *pcTaskName)
{
/* Run time stack overflow checking is performed if
configCHECK_FOR_STACK_OVERFLOW is defined to 1 or 2. This hook function is
called if a stack overflow is detected. */
printf("%s is stack over flow\r\n",pcTaskName);
}
/* USER CODE END 4 */
实验现象
栈溢出检测方案二
其他操作以及代码和方案一相同
将这个宏修改为2
实验现象
获取任务状态方案
代码
/* USER CODE BEGIN Header_Key_Task */
uint8_t u8TaskListBuff[400];
/**
* @brief Function implementing the KeyTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Key_Task */
void Key_Task(void const * argument)
{
/* USER CODE BEGIN Key_Task */
KeyStatus = Key_RESET;
/* Infinite loop */
for(;;)
{
if(KeyStatus == Key_DOWN){
//挂起LED任务
memset(u8TaskListBuff, 0, 400);
vTaskList((char *)u8TaskListBuff);
printf("Name Data Priority Stack Num\r\n");
printf("***************************************\r\n");
printf("%s",u8TaskListBuff);
printf("***************************************\r\n");
KeyStatus = Key_RESET;
}
if(KeyStatus == Key_UP){
//恢复LED任务
KeyStatus = Key_RESET;
}
osDelay(10);
}
/* USER CODE END Key_Task */
}
实验现象
任务名称Name
任务状态Data
任务优先级Priority
任务剩余堆栈Stack
任务序号Num
CPU利用率统计应用
CPU利用率统计的作用
CPU利用率
CPU利用率统计API
CPU利用率统计实现
CPU利用率统计业务流程
cubemx配置
打开tim6并使能中断,计时50us
使能该宏定义
代码
在main函数中
/* USER CODE BEGIN Header_Key_Task */
uint8_t u8TaskListBuff[400];
/**
* @brief Function implementing the KeyTask thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_Key_Task */
void Key_Task(void const * argument)
{
/* USER CODE BEGIN Key_Task */
KeyStatus = Key_RESET;
/* Infinite loop */
for(;;)
{
if(KeyStatus == Key_DOWN){
//挂起LED任务
memset(u8TaskListBuff, 0, 400);
vTaskGetRunTimeStats((char *)u8TaskListBuff);
printf("任务名 运行计数 使用率\r\n");
printf("***************************************\r\n");
printf("%s",u8TaskListBuff);
printf("***************************************\r\n");
KeyStatus = Key_RESET;
}
if(KeyStatus == Key_UP){
//恢复LED任务
KeyStatus = Key_RESET;
}
osDelay(10);
}
/* USER CODE END Key_Task */
}