Файл запуска процессора Cortex M3 позволяет указать объем оперативной памяти, выделенной для стека и кучи.
Это не функция Cortex-M3, а скореестартовый код, предоставляемый вашим набором инструментов разработки.Это способ запуска по умолчанию файлов запуска Keil ARM-MDK для M3.Это немного необычно;чаще вы указали бы размер стека, и любая оставшаяся память после стека и статическое выделение памяти компоновщиком становится кучей;это, возможно, лучше, так как у вас нет пула неиспользуемой памяти.Вы можете изменить это и использовать альтернативную схему, но вам нужно знать, что вы делаете.
Если вы используете Keil ARM-MDK, опции компоновщика --info =stack и --callgraph добавляют информацию в файл карты, которая помогает анализировать требования стека.Эти и другие методы описаны здесь .
Если вы используете RTOS или многозадачное ядро, у каждой задачи будет свой стек.Операционная система может предоставлять инструменты для анализа стека, в средстве просмотра ядра RTX Keil отображается текущее использование стека, но не пиковое использование стека (поэтому оно в основном бесполезно и работает корректно только для задач с длиной стека по умолчанию).
Если вам нужноРеализуйте инструменты проверки стека самостоятельно, нормальный метод - заполнить стек известным значением, и, начиная с старшего адреса, проверять значение, пока не найдете первое значение, которое не является байтом заполнения, это даст высокую оценку Ликли.стека.Для этого можно реализовать код или вручную заполнить память из отладчика, а затем отслеживать использование стека в окне памяти отладчика.
Требование кучи будет зависеть от поведения вашего кода во время выполнения;вам придется проанализировать это самостоятельно, однако в ARM / Keil Realview обработчик исключений MemManage будет вызываться, когда C ++ new
генерирует исключение;Я не уверен, что malloc()
делает это или просто возвращает NULL.Вы можете поместить точку останова в обработчик исключений или изменить обработчик так, чтобы он выдавал сообщение об ошибке, чтобы обнаружить исчерпание кучи во время тестирования.Существует также функция __ heapstats () , которую можно использовать для вывода информации о куче.У него несколько громоздкий интерфейс, я обернул его так:
void heapinfo()
{
typedef int (*__heapprt)(void *, char const *, ...);
__heapstats( (__heapprt)std::fprintf, stdout ) ;
}