打印

原程序被中断打断之后???

[复制链接]
2798|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ma1986|  楼主 | 2009-10-21 08:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
sufeng983| | 2009-10-21 09:53 | 只看该作者
堆栈

使用特权

评论回复
板凳
ma1986|  楼主 | 2009-10-21 10:22 | 只看该作者
2# sufeng983
中断程序前加__irq不是自动的处理堆栈吗???怎么还会有堆栈的问题呢???

使用特权

评论回复
地板
sufeng983| | 2009-10-21 14:56 | 只看该作者
自动处理?谁自动处理?编译器?那你也要给编译器一个地盘,让他做系统堆栈处理吧?看是否是这个堆栈问题小了点的问题,
以前经常遇见中断了不回去,多数是堆栈情况,至于你的是不是我就不知道,我只能提醒你可能有这个原因,解决他,还得靠你自己跟踪,查找。

使用特权

评论回复
5
DC_BOY| | 2009-10-22 09:38 | 只看该作者
因为你放在中断的变量 尽量用关键字volatile

使用特权

评论回复
6
ma1986|  楼主 | 2009-10-23 13:22 | 只看该作者
4# sufeng983
这个堆栈是我们程序初始化的时候设置的吗???

使用特权

评论回复
7
sufeng983| | 2009-10-26 10:19 | 只看该作者
#define __STACK_SIZE    512                                (大小是512)
static INT32U __GpulStack[__STACK_SIZE] @ ".noinit";

__root const __VECTOR_ENTRY __vector_table[] @ ".intvec" = {
    { .ulPtr = (INT32U)__GpulStack + sizeof(__GpulStack) },
这个是LM3S69938在IAR下面的设置。

使用特权

评论回复
8
sufeng983| | 2009-10-26 10:25 | 只看该作者
本帖最后由 sufeng983 于 2009-10-26 11:32 编辑

;定义堆栈的大小

IRQ_STACK_LEGTH         EQU         9*8             ;每层嵌套需要9个字堆栈,允许8层嵌套

////////////
设置中断模式堆栈
        MSR     CPSR_c, #0xd2
        LDR     SP, StackIrq
这个是ARM7内核,LPC22XX系列在KEIL下的中断堆栈设置

使用特权

评论回复
9
ma1986|  楼主 | 2009-10-26 17:07 | 只看该作者
8# sufeng983

DRAM_END EQU 0x0c800000
AREA RamData, DATA, READWRITE
^ (DRAM_END - 0x800)
UserStack # 256
SVCStack # 256
UndefStack # 256
AbortStack # 256
IRQStack # 256
FIQStack # 256
EXPORT UserStack
EXPORT SVCStack
EXPORT UndefStack
EXPORT AbortStack
EXPORT IRQStack
EXPORT FIQStack
MAP (DRAM_END - 0x100)
SysRstVector # 4
UdfInsVector # 4
SwiSvcVector # 4
InsAbtVector # 4
DatAbtVector # 4
ReservedVector # 4
IrqSvcVector # 4
FiqSvcVector # 4
EXPORT SysRstVector
EXPORT UdfInsVector
EXPORT SwiSvcVector
EXPORT InsAbtVector
EXPORT DatAbtVector
EXPORT ReservedVector
EXPORT IrqSvcVector
EXPORT FiqSvcVector

;****************************************************
;初始化堆栈
;Do not use DRAM,such as stmfd,ldmfd......
;SVCstack is initialized before
;Under toolkit ver 2.50, 'msr cpsr,r1' can be used instead of 'msr cpsr_cxsf,r1'

mrs r0, cpsr
bic r0, r0, #(MODEMASK|NOINT)

orr r1, r0, #UNDEFMODE|NOINT
msr cpsr_cxsf, r1  ;UndefMode
ldr sp, =UndefStack

orr r1, r0, #ABORTMODE|NOINT
msr cpsr_cxsf, r1  ;AbortMode
ldr sp, =AbortStack

orr r1, r0, #IRQMODE|NOINT
msr cpsr_cxsf, r1  ;IRQMode
ldr sp, =IRQStack

orr r1, r0, #FIQMODE|NOINT
msr cpsr_cxsf, r1  ;FIQMode
ldr sp, =FIQStack
  
orr r1, r0, #SVCMODE  ;enable irq,fiq
; orr r1, r0, #SVCMODE|NOINT ;disable irq, fiq
msr cpsr_cxsf,r1  ;SVCMode
ldr sp, =SVCStack
;USER mode is not initialized.
;未初始化用户模式栈,程序使用SVC模式
;****************************************************


按照这个初始代码,我是不是还可以给用户模式的堆栈再分配256字节的堆栈空间吗???只需要改成UserStack # 512 就好了吗??
我程序的嵌套比较深,可能有10多层的调用。怕堆栈不够。

使用特权

评论回复
10
yxwsz| | 2009-10-26 22:55 | 只看该作者
C语言里面,函数里面的局部变量、函数参数传递都是放在堆栈(stack)里面的,所以要根据函数的嵌套层数、局部变量的大小来适当分配stack size;

如果设置的堆栈有1K BYTE,但是函数里面声明了一个4K BYTE大小的数组,那这个程序肯定会跑飞,出现莫名其妙的问题的。

使用特权

评论回复
11
sufeng983| | 2009-10-27 08:39 | 只看该作者
UserStack # 256      //用户堆栈是用于程序运行的时候,调用函数对局部变量的压栈使用,这个是函数嵌套调用层数以及每个函数中局部变量多少决定。
SVCStack # 256
UndefStack # 256
AbortStack # 256
IRQStack # 256   //中断堆栈是用于程序运行时候,中断函数调用对局部变量的压栈使用,这个由中断嵌套调用层数以及中断函数局部变量决定。

这个到底是哪个堆栈,要你自己试。

使用特权

评论回复
12
sufeng983| | 2009-10-27 08:44 | 只看该作者
其他堆栈,其实正常运行很少使用
FIQStack # 256
如果你使用了FIQ级别的中断才会使用,如果没有,可以设置得小一点,
这些堆栈都是ARM7,ARM9下面的特殊状态切换的时候压栈的使用。有时间了解下这些状态,就可以根据这些状态来设置堆栈的大小,而不是统一的256,那样有些不够用,有些浪费了。

使用特权

评论回复
13
ma1986|  楼主 | 2009-10-27 09:50 | 只看该作者
10# yxwsz
按照我上面那个都是256字节的分配堆栈的话,那我的程序早就应该溢出了。。因为我函数调用层数有10多层,另外每层的函数肯定有局部变量啊。。这样肯定超过256B了啊~~~

使用特权

评论回复
14
ma1986|  楼主 | 2009-10-27 09:54 | 只看该作者
12# sufeng983

问个问题啊。。我们用户模式下的程序堆栈,我调用函数的过程中,每个函数的局部变量都会加入到该堆栈中吗???比如我在某函数内int a[50];然后在该函数中再调用其他函数的时候,压栈,会将a[50]压到栈里吗???

使用特权

评论回复
15
sufeng983| | 2009-10-27 10:06 | 只看该作者
局部变量,是在分配内存的时候不给予分配的,所以你查看KEIL或者IAR的内存分配的时候,只有全局的,那么局部的一定需要堆栈来保存,因为一旦函数运行完毕,这些是需要释放的。所以要压到堆栈,如果使用操作系统的话,会有任务堆栈,函数调用会压到任务堆栈,中断会压到中断堆栈。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

101

帖子

1

粉丝