程序调试正确,keil5生成hex文件不正确,编译器优化掉了

在使用keil5写程序时遇到的一个问题,就是自己写的中断服务函数在调试的过程中执行是没有问题的,但是生成.hex文件后在vivado用于cortex-m0软核调试的时候仿真波形不正确,上板验证也不正确,中断只能执行一次然后就跳不出来了,不知道是什么问题,之前考虑到是编译器优化的问题,但是将优化等级降到最低和换编译器版本都没能解决,有没有遇到过此类问题的帮忙解决一下。

附一下程序图
这是启动文件

Stack_Size      EQU     0x00000400                         

                AREA    STACK, NOINIT, READWRITE, ALIGN=4  
Stack_Mem       SPACE   Stack_Size
__initial_sp                                               


Heap_Size       EQU     0x00000F00

                AREA    HEAP, NOINIT, READWRITE, ALIGN=4    
__heap_base                                                 
Heap_Mem        SPACE   Heap_Size
__heap_limit


; Vector Table Mapped to Address 0 at Reset

                PRESERVE8
                THUMB

                AREA    RESET, DATA, READONLY     
                EXPORT  __Vectors                  

__Vectors       DCD     __initial_sp              
                DCD     Reset_Handler             
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0

                ; External Interrupts
                DCD     Int_Handler
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0
                DCD     0

                AREA    |.text|, CODE, READONLY



Reset_Handler   PROC
                GLOBAL  Reset_Handler
                ENTRY
                
                IMPORT __main
                LDR       R0, = __main                
                BX     R0
                ENDP
                    

Int_Handler        PROC
                EXPORT Int_Handler
                IMPORT Int_ISR
                PUSH   {R0,R1,R2,LR}
                BL       Int_ISR    
                POP       {R0,R1,R2,PC}
                ENDP 


                ALIGN    4


                IF      :DEF:__MICROLIB    ; 这个宏在KEIL里定义

                EXPORT  __initial_sp    ;__initial_sp栈顶地址
                EXPORT  __heap_base        ;__heap_base堆的起始地址
                EXPORT  __heap_limit    ;__heap_limit堆的结束地址

                ELSE                    ;否则需要用户自己实现__user_initial_stackheap函数初始化堆栈。

                IMPORT  __use_two_region_memory    ;; 两区堆栈空间,堆和栈有各自的空间地址
                EXPORT  __user_initial_stackheap

__user_initial_stackheap PROC
                LDR     R0, =  Heap_Mem
                LDR     R1, = (Stack_Mem + Stack_Size)
                LDR     R2, = (Heap_Mem +  Heap_Size)
                LDR     R3, =  Stack_Mem
                BX      LR
                ENDP

                ALIGN

                ENDIF


                END


#include "stdio.h"
#include "system.h"
#include "ahbdef.h"
#define        DELAY_LED            0x3
//0x50000000,0x52000000

    
void delay_ms(unsigned int i){

    while(i--);
    
}
void led_repeate(){
        LED = 0x01;
        delay_ms(DELAY_LED);
        LED = 0x02;
        delay_ms(DELAY_LED);
        LED = 0x04;
        delay_ms(DELAY_LED);
        LED = 0x08;    
        delay_ms(DELAY_LED);    
        SEG7_LED ++; 
}

void Int_ISR(){


    LED++;

    
}

int main(void){
        LED = 0;
        SEG7_LED = 0;
        NVIC_EN |=(1<<0);
    while(1){
        

//    led_repeate();
        
    }
}    



img

img


波形图

img

img

不需要清中断吗

问题已解决,原因是在汇编启动代码中开辟了堆栈,但是在FPGA上并没有加实际的RAM,当出栈的时候找不到入栈时的数据。