在使用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();
}
}
不需要清中断吗
问题已解决,原因是在汇编启动代码中开辟了堆栈,但是在FPGA上并没有加实际的RAM,当出栈的时候找不到入栈时的数据。