中断里面开数组以及sprintf函数的解决办法

来源:互联网 发布:淘宝中青旅怎么样 编辑:程序博客网 时间:2024/06/05 15:51

     前天遇到了中断里面开不了数组的问题,经验证果然是堆栈内存的问题,然后经过我查资料,终于找到了编译文件里面的一个.map文件

里面就是内存分配的表格,部分如下:

SECTION                            START      END         SIZE   ALIGN

R
                                  00002100  00002453       354   4
SU
                                  00002454  00002753       300   4
SI
                                  00002754  00002853       100   4

     可以看到其中SI是中断堆栈,SU是用户数据堆栈。中断堆栈只有100(16进制)字节的大小。这个大小其实也不小了,但是如果开大的数组的话还是不够的,因为中断启动后本身会占用一些(我猜测),但是sprintf函数居然有100都不够,确实让我惊讶。我之后开到了800,问题立刻解决了。sprintf可以用了,开数组开到1000大小都没问题。

      我用的是瑞萨的单片机,HEW开发环境,它里面想要对堆栈操作,我目前发现可以有两个半办法。一是在新建工程时有提示,二是里面有个stacksct.h的头文件可以设置。然后还有半个办法是里面在编译选项里面有个对堆栈地址顺序的调整,不能调整大小,但能调整地址值。

     准确的说中断数据是SI栈,栈向上增长,会碰到SU用户数据,导致数据冲突,程序乱飞。我开始时只找到了调整地址值的方法,将SI移到了SU上面,结果也暂时解决了冲突的问题,可是之后在执行程序时,有地方出现了bug,看来是冲突到了R。

    但是旧的问题解决了,新的问题出来了。

    关于uip这个tcp建议协议的问题。

    

0 0
原创粉丝点击