二、模板中设置向量中断堆栈大小为256
即:IRQ_STACK_LEGTH         EQU         256
但是为什么我将其大小变为零,即:IRQ_STACK_LEGTH         EQU         0
也照样可以运行程序?程序中通过SPI中断收发数据。谢谢!

 

既然中断堆栈是为进入中断后局部变量和函数调用开辟的存储区,那如果将堆栈大小设为0,进入中断后也不可能进行其他处理。哪怕我只定义一个局部变量或调用一个函数,中断处理也不可能发生。例如:

void f1(void);

 void __irq SSP_IRQ( void )
 {
      unsigned char ch;
      f1();
 }


我按照你的方法,IRQ_STACK_LEGTH  EQU  0,在中断处理函数中调用了5个函数,增加了几个数组,仍然能够正常运行,好像跟堆栈大小没有关系。
怀疑是不是如果在IRQ_STACK_LEGTH  EQU  0的条件下,还有其他程序自动设置中断堆栈的大小?

 

当堆栈设置为0时,说明提供给IRQ堆栈专门使用的空间是0。但是当IRQ堆栈使用的空间没有被其他程序或数据使用时,程序还是可以正常运行的。而如果被其他程序或数据使用时,那么就可能会导致程序运行不正常。

 

通过试验验证有以下结论,如有错误,万望各位指出:

在Startup.s中有
     AREA    Stacks, DATA, NOINIT
 StackUsr   
 在mem_c.scf中有
 STACKS 0x40008000 UNINIT  ; 
     {
         Startup.o (Stacks)
     }


上面两段实际是将分配给RW,ZI和Heap后剩余的RAM全部设置为堆栈(Stacks)。
若IRQ专门使用的堆栈大小不足时,系统自动将Stacks作为堆栈使用。即使IRQ专门使用的堆栈为0,只要Stacks容量足够大,程序就可以正常运行。
若IRQ专门使用的堆栈+Stacks的总量小于IRQ实际需要的内存大小,程序就会出问题。
例如我的IRQ中断实际需要的堆栈大小约为1.5K,但是定义的IRQ专门堆栈为256*4=1K,以前程序运行正常是因为我的32K RAM只用了30K,余量足够大,IRQ实际可以使用的堆栈有1K+2k=3K。如果不满足1K+RAM余量>=1.5K,就会出错。
但是还有一个问题,应该按照什么原则来估算专用堆栈的大小呢?