RAM 最大使用率监控方案

张开发
2026/4/3 21:14:51 15 分钟阅读
RAM 最大使用率监控方案
RAM 最大使用率监控方案概述本文档详细说明基于 AUTOSAR OS 的 RAM 监控方案包括栈监控机制、实现原理和使用方法。方案对比方案精度开销实时性适用场景OS Meter 机制高低实时任务切换时快速检查填充模式检测中高周期性系统空闲时详细统计硬件监控高低实时需要 MPU/DWT 支持方案一OS Meter 机制推荐核心数据结构Os_MeterInfoType/* 文件: GetIsrMaxExecutionTime.c 第 410-413 行 */typedefstructOs_MeterInfoType_s{Os_StackValueType stackbase;/* 栈底地址 (高地址) */Os_StackValueType saved_stackbase;/* 保存的栈底地址 */}Os_MeterInfoType;使用位置/* Task 动态数据结构 */typedefstructOs_TaskDynType_s{Os_jmp_buf terminate_jump_buf;Os_MeterInfoType meter;/* 栈监控信息 */Os_ActivationCountType activation_count;...}Os_TaskDynType;/* ISR 动态数据结构 */typedefstructOs_ISRDynType_s{SpinlockIdType spinlock_count;boolean terminating;Os_MeterInfoType meter;/* 栈监控信息 */}Os_ISRDynType;计算原理栈增长方向 (ARM Cortex-M): 高地址 ──────────────────────────────→ 低地址 ↑ ↑ stackbase SP │ │ └──────── 栈使用量 stackbase - SP ─┘实际使用代码/* Performance.c 第 448-449 行 */ptask-StackUsage[task_index].maxOs_dyn_tasks[task_index].meter.stackmax;ptask-StackUsage[task_index].budgetOs_dyn_tasks[task_index].meter.stackbudget;优点✅ 低开销直接计算✅ 高精度基于实际 SP 值✅ OS 自动维护✅ 支持 Task 和 ISR方案二填充模式检测实现文件PerfCalc_StackMeasurement.cdemo_ram_monitor.c核心原理/* 1. 初始化时填充栈区域 */#defineSTACK_FILL_PATTERN0xDEADBEEFUfor(ptrstack_bottom;ptrstack_top;ptr){*ptrSTACK_FILL_PATTERN;}/* 2. 运行时扫描填充模式 */while(*ptrSTACK_FILL_PATTERN){ptr;/* 向上扫描找到第一个被修改的位置 */}/* 3. 计算使用率 */unusedBytes(ptr-stack_bottom)*4;stkUsage100u-((unusedBytes*100u)/stack_size);代码实现/* PerfCalc_StackMeasurement.c 第 93-141 行 */FUNC(uint8,PERFCALC_CODE)PerfCalc_MeasureStackUsage(P2VAR(uint8,AUTOMATIC,PERFCALC_APPL_DATA)Stack_Usage){VAR(uint16,AUTOMATIC)unusedBytes0u;P2CONST(uint32,AUTOMATIC,OS_APPL_DATA)current_position;VAR(uint32,AUTOMATIC)stack_size0u;VAR(uint32,AUTOMATIC)offset_correction0u;VAR(uint32,AUTOMATIC)array_size0u;/* 从栈顶开始搜索 */current_position__ghsbegin_stack;stack_size(uint32)__ghsend_stack-(uint32)__ghsbegin_stack;/* 计算 OS 使用偏移 */offset_correction(uint32)__ghsend_stack-(uint32)Os_StackBase;array_sizestack_size-offset_correction;/* 扫描填充模式 */while((byteindex(array_size/sizeof(uint32)))(current_position[byteindex]PERFCALC_STACK_FILL_PATTERN)){unusedBytes;byteindex;}/* 计算使用率 */unusedBytesunusedBytes*4u;stkUsage100u-(((uint32)unusedBytes*100u)/stack_size);*Stack_Usage(uint8)stkUsage;returnE_OK;}Extended Task 栈偏移处理/* 第 119-132 行: 处理 ECC Task */for(ecc_task_index0;ecc_task_indexPERFCALC_EXTENDED_TASK_NR;ecc_task_index){byteindex0u;/* 使用 stack_offset 定位 ECC Task 栈区 */current_position(uint32*)(((uint8*)__ghsend_stack)-Os_const_ecc_tasks[ecc_task_index].stack_offset);extendedtask_stacksizearray_size-(Os_const_ecc_tasks[ecc_task_index].stack_offset);/* 扫描该 Task 的栈区 */while((byteindex(extendedtask_stacksize/sizeof(uint32)))(current_position[byteindex]PERFCALC_STACK_FILL_PATTERN)){unusedBytes;byteindex;}}栈布局高地址 ┌─────────────────────────┐ ← __ghsend_stack (栈顶/栈底) │ OS 内部使用区 │ ← offset_correction ├─────────────────────────┤ │ Extended Task 0 栈区 │ ← stack_offset[0] ├─────────────────────────┤ │ Extended Task 1 栈区 │ ← stack_offset[1] ├─────────────────────────┤ │ Extended Task 2 栈区 │ ← stack_offset[2] ├─────────────────────────┤ │ 剩余共享栈区 │ └─────────────────────────┘ ← __ghsbegin_stack 低地址方案三自定义 RAM 监控模块文件结构demo_ram_monitor.h # 头文件 demo_ram_monitor.c # 核心实现 demo_ram_monitor_example.c # 使用示例核心数据结构/* 栈填充模式 */#defineSTACK_FILL_PATTERN0xDEADBEEFU/* RAM 监控信息 */typedefstruct{uint32 maxStackUsage;/* 最大栈使用量 (字节) */uint32 currentStackUsage;/* 当前栈使用量 (字节) */uint32 maxRamUsage;/* 最大 RAM 使用量 (字节) */uint32 currentRamUsage;/* 当前 RAM 使用量 (字节) */uint8 stackUsagePercent;/* 栈使用率百分比 */uint8 ramUsagePercent;/* RAM 使用率百分比 */uint32 overflowCount;/* 溢出次数计数 */boolean warningTriggered;/* 警告已触发标志 */boolean criticalTriggered;/* 严重警告已触发标志 */}RamMonitorInfoType;关键 API函数功能RamMonitor_Init()初始化监控模块填充栈模式RamMonitor_CyclicTask()周期性监控10ms 任务RamMonitor_GetInfo()获取监控信息RamMonitor_GetStackUsagePercent()获取当前使用率RamMonitor_ResetMaxValues()重置最大记录使用步骤1. 系统启动时初始化voidStartupHook(void){RamMonitor_Init();}2. 创建周期性监控任务TASK(RamMonitorTask){RamMonitor_CyclicTask();TerminateTask();}3. 自定义警告处理voidRamMonitor_OnWarning(uint8 usagePercent){/* 记录 DTC 或发送 CAN 报文 */Dtc_SetEvent(DTC_ID_STACK_HIGH_USAGE,DTC_EVENT_FAILED);}voidRamMonitor_OnCritical(uint8 usagePercent){/* 进入安全模式或复位 */System_EnterDegradedMode();}4. 集成 OS 钩子voidOs_Cbk_StackOverrunHook(Os_StackSizeType Overrun,Os_StackOverrunType Reason){RamMonitor_OnStackOverrun(Overrun,Reason);}方案对比与选择对比表特性OS Meter填充模式自定义模块实现复杂度低中高运行时开销极低高扫描内存中精度高中受填充粒度影响高实时性实时周期性可配置功能丰富度基础中等丰富可扩展性低中高适用阶段生产调测全周期推荐方案场景推荐方案生产环境监控OS Meter系统调优分析填充模式完整监控方案自定义模块快速集成OS Meter PreTaskHook集成示例在 PreTaskHook 中集成栈监控voidPreTaskHook(void){/* 1. 调用 PerfCalc 的监控 */PerfCalc_PreTaskHook();/* 2. 添加自定义栈检查 */#if(STACK_MONITOR_ENABLEDSTD_ON)TaskType currentTask;GetTaskID(currentTask);uint32 taskIndexOS_TASKTYPE_TO_INDEX(currentTask);/* 检查栈使用是否超过阈值 */if(Os_dyn_tasks[taskIndex].meter.stackmaxOs_dyn_tasks[taskIndex].meter.stackbudget*80/100){/* 预警栈使用超过 80% */Log_Warning(Task %d stack usage high: %d/%d,taskIndex,Os_dyn_tasks[taskIndex].meter.stackmax,Os_dyn_tasks[taskIndex].meter.stackbudget);}#endif}诊断服务集成/* 读取数据服务 (0x22) 处理 */voidDiagService_ReadRamUsage(void){RamMonitorInfoType info;uint8 responseData[8];if(RamMonitor_GetInfo(info)!E_OK){/* 发送否定响应 */return;}/* 构造响应数据 */responseData[0]info.stackUsagePercent;responseData[1](uint8)(info.maxStackUsage24);responseData[2](uint8)(info.maxStackUsage16);responseData[3](uint8)(info.maxStackUsage8);responseData[4](uint8)(info.maxStackUsage);responseData[5](uint8)(info.overflowCount8);responseData[6](uint8)(info.overflowCount);responseData[7]info.warningTriggered?0x01:0x00;/* 发送响应 */Dcm_SendResponse(responseData,8);}优化建议1. 栈大小优化/* 优化前固定大栈 */#defineTASK_STACK_SIZE8192/* 8KB *//* 优化后根据任务分级 */#defineTASK_STACK_SMALL1024/* 1KB - 简单任务 */#defineTASK_STACK_MEDIUM2048/* 2KB - 一般任务 */#defineTASK_STACK_LARGE4096/* 4KB - 复杂任务 */2. WaitBudget 优化/* ECC Task 配置 */Os_ECCTaskType Os_const_ecc_tasks[]{/* Task0: 简单等待小预算 */{...,.waitbudget1024,.stack_offset1024},/* Task1: 复杂处理大预算 */{...,.waitbudget3072,.stack_offset4096},};3. 运行时监控优化/* 分层监控 */voidPreTaskHook(void){/* 快速路径只记录时间戳 */ptrCore-TaskLoad_EnterTimeStamp[lRunningTask_Index]SystemTime_Read_us_32bits();}/* 慢速路径详细统计在空闲任务中执行*/voidPerfCalc_DetailedStats(void){/* 计算周期、抖动、栈使用等 */}相关文件文件说明GetIsrMaxExecutionTime.cOS Meter 机制实现PerfCalc_StackMeasurement.c填充模式检测实现demo_ram_monitor.c自定义监控模块实现WaitEvent.cECC Task 栈处理Performance.c性能统计集成参考文档AUTOSAR OS SpecificationRTA-OS User GuideARM Cortex-M 栈管理指南嵌入式系统栈溢出防护最佳实践版本历史版本日期修改内容1.02026初始版本整合三种监控方案

更多文章