Как отследить переполнение стека в KEIL UVISION.

Как отследить переполнение стека в 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).
Как отследить переполнение стека в KEIL UVISION.

Как отследить переполнение стека в KEIL UVISION.

В принципе на этом можно было закончить, но есть одно неудобство, каждый раз при создании нового проекта надо лезть в map файл, смотреть адреса и держать их в голове. Гораздо удобнее было бы как-то обозначить границы стека, чтобы не делать лишних действий.
Как это можно сделать?

Изначально оперативка и стек заполнены нулями, поэтому если заполнить стек какими-то данными, например буквами СС, он будет визуально выделяться и его не составит труда найти в оперативной памяти.
Для этого надо в конце файла стартапа удалить следующий кусок
Как отследить переполнение стека в KEIL UVISION.

И вставить на его место другой

__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.

На этом всё, в следующей статье опишу как средствами KEIL UVISION прошить микроконтроллер.
комментарии
0