Как отследить переполнение стека в KEIL UVISION.
В интернете достаточно информации про стек поэтому вряд ли смогу рассказать что-то новое. Если кто-то всё-таки не в курсе, то стек — это область в оперативной памяти, которая работает по принципу стопки тарелок. Что это за принцип такой?
Принцип заключается в том, что если перед нами стоит стопка одинаковых тарелок и нам надо взять одну, то мы возьмём верхнюю, её взять проще всего. Этот же принцип лежит в основе работы стека, в любой момент можно извлечь только те данные, которые находятся на вершине стека.
В KEIL размер стека задаётся в файле стартапа, следующей строкой.
Посмотреть адрес начала и вершины стека можно в map файле
Здесь __initial_sp — это указатель на вершину стека.
Теперь, когда у нас есть информация о расположении стека и его размере, за ним можно наблюдать, указав нужные адреса во вкладке Memory(View->Memory Windows->Memory).
В принципе на этом можно было закончить, но есть одно неудобство, каждый раз при создании нового проекта надо лезть в map файл, смотреть адреса и держать их в голове. Гораздо удобнее было бы как-то обозначить границы стека, чтобы не делать лишних действий.
Как это можно сделать?
Изначально оперативка и стек заполнены нулями, поэтому если заполнить стек какими-то данными, например буквами СС, он будет визуально выделяться и его не составит труда найти в оперативной памяти.
Для этого надо в конце файла стартапа удалить следующий кусок
И вставить на его место другой
На этом всё, в следующей статье опишу как средствами KEIL UVISION прошить микроконтроллер.
Принцип заключается в том, что если перед нами стоит стопка одинаковых тарелок и нам надо взять одну, то мы возьмём верхнюю, её взять проще всего. Этот же принцип лежит в основе работы стека, в любой момент можно извлечь только те данные, которые находятся на вершине стека.
В KEIL размер стека задаётся в файле стартапа, следующей строкой.
Stack_Size EQU 0x00000400
Посмотреть адрес начала и вершины стека можно в map файле
STACK 0x20000260 Section 1024 startup_stm32f10x_hd.o(STACK)
Stack_Mem 0x20000260 Data 1024 startup_stm32f10x_hd.o(STACK)
__initial_sp 0x20000660 Data 0 startup_stm32f10x_hd.o(STACK)
Здесь __initial_sp — это указатель на вершину стека.
Теперь, когда у нас есть информация о расположении стека и его размере, за ним можно наблюдать, указав нужные адреса во вкладке Memory(View->Memory Windows->Memory).
В принципе на этом можно было закончить, но есть одно неудобство, каждый раз при создании нового проекта надо лезть в map файл, смотреть адреса и держать их в голове. Гораздо удобнее было бы как-то обозначить границы стека, чтобы не делать лишних действий.
Как это можно сделать?
Изначально оперативка и стек заполнены нулями, поэтому если заполнить стек какими-то данными, например буквами СС, он будет визуально выделяться и его не составит труда найти в оперативной памяти.
Для этого надо в конце файла стартапа удалить следующий кусок
И вставить на его место другой
__user_initial_stackheap
; debug - fill stack area with check pattern
LDR R0, =Stack_Mem ; Test stack
LDR R1, =Stack_Size ;
LDR R2, =0xCCCCCCCC ;
Fill STR R2, [R0], #4 ;
SUBS R1,#4 ;
BNE Fill ;
; end of debug
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
На этом всё, в следующей статье опишу как средствами KEIL UVISION прошить микроконтроллер.
Похожие статьи