MSP430数组填充越界引起的栈溢出导致程序跑飞如何解决.doc

上传人:白大夫 文档编号:3263329 上传时间:2019-08-06 格式:DOC 页数:4 大小:21.50KB
返回 下载 相关 举报
MSP430数组填充越界引起的栈溢出导致程序跑飞如何解决.doc_第1页
第1页 / 共4页
亲,该文档总共4页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《MSP430数组填充越界引起的栈溢出导致程序跑飞如何解决.doc》由会员分享,可在线阅读,更多相关《MSP430数组填充越界引起的栈溢出导致程序跑飞如何解决.doc(4页珍藏版)》请在三一文库上搜索。

1、MSP430数组填充越界引起的栈溢出导致程序跑飞如何解决一、预备知识1、栈区(stack)由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap)一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。(这是一个前辈写的,非常详细)/main.cppinta=0;全局初始化区char*p1;全局未初始化区main()intb;栈chars=abc;栈char*p2;栈char*p3=123456;1234560在常量区,p3在栈上。staticintc=0;全局(静态)初始化区p

2、1=(char*)malloc(10);p2=(char*)malloc(20);分配得来得10和20字节的区域就在堆区。strcpy(p1,123456);1234560放在常量区,编译器可能会将它与p3所指向的123456优化成一个地方。二、堆和栈的理论知识2.1申请方式stack:由系统自动分配。例如,声明在函数中一个局部变量intb;系统自动在栈中为b开辟空间heap:需要程序员自己申请,并指明大小,在c中malloc函数如p1=(char*)malloc(10);在C+中用new运算符如p2=(char*)malloc(10);但是注意p1、p2本身是在栈中的。MSP430 堆栈溢出

3、 解决MSP430程序在运行的过程中,出现死机的现象,通过IAR编译器观察,死机的原因是栈溢出。因为定义的局部变量是在栈内的,所以分析可能是局部变量导致栈溢出,最有可能导致编译器不能事先判断使用了多少栈的(超出设定值会报警),就是程序中产生新的占用栈的变量,由之前的经验推测是数组越界,因为如果程序不顾数组的边界,越界不断的往里填东西,越界的部分就会被当成局部变量,占用栈的内存。因为栈是从RAM的底部网上长(存数据)的,而其他程序运行的数据是从顶部往下的,所以当栈越存越多,越积越高的时候,栈就会和程序运行时的数据碰头,二者占满整个RAM内存,此时栈再继续消耗,栈再向上长,直接覆盖掉程序运行时所需

4、的变量,程序就要跑飞了。(iar430中定义的变量是从ram的起始地址向上(由小到大),而堆栈是从ram的终止地址向下(由大到小)。以msp430F5438为例,它是16KB的ram,起始地址为0x1C00h,终止地址为005BFFh(data sheet 15页),所以它的变量是从0x1C00h开始,向0x005BFFh方向存放,而堆栈是从0x005BFFh开始,向0x1C00h方向压栈。当变量存储空间和堆栈最大占用空间在中间相遇时,就发生了堆栈溢出。)下面就详细介绍如何查看ram使用情况:1当然是烧程序到目标板里呀2选择view/memory,打开memory窗口3从ram的起始地址0x1

5、C00h开始,输入0x3fff(16KB),再回车4选中0x1C00h0x005BFFh区域,右键选择memory fill5在memory fill中的start写入:0x1C00h,length写:0x3fff,value填入FF(也可填入其他值),被选中的区域全填充FF6运行程序,跑一遍设计的所有功能,再停止cspy,看看memory窗口7如果再填充的区域内已经没有FF存在,就说明已经发生堆栈溢出或是会有溢出的危险(ram刚好够用)。最好保留一定余量的ram不被改变,以防发生溢出验证:定义一个UART0_RX_HEX_BUF400;在程序中加入这个代码。unsigned int i;fo

6、r(i=0;i= UART0_RX_HEX_MAXLen)UART0_RX_HEX_Len = 0;这两句子不能去掉,因为,在没有接收到协议数据(配置数据,FEFA)之前,UART0_RX_HEX_BUF和UART0_RX_BUF一样在接收返回的AT指令返回,数组在不断的填装,UART0_RX_BUF每隔一段时间就会被读取一次,并清空,因而不会出现溢出。但是在没有收到配置数据之前,UART0_RX_HEX_BUF不会清空,且在配置完之后,只要服务站不发协议数据,也不会清空,因而UART0_RX_HEX_BUF基本处于只填装不清空的状态,最后远远越界,最终导致开头分析的结果。加了清零语句:if(

7、UART0_RX_HEX_Len = UART0_RX_HEX_MAXLen)UART0_RX_HEX_Len = 0;后,死机在12小时内在没有出现,其他比对机器全部死机,初步证明分析应该是正确的。#pragma vector=USCI_A0_VECTOR_interrupt void USCI_A0_ISR()UCA3TXBUF=UCA0RXBUF;/把接收的数据发到U3便于观察(LCX注)/接收字符数据时UART0_RX_BUFUART0_RX_Len = UCA0RXBUF;UART0_RX_Len+;ReadUART0_new=Read_Cycle;/接收协议数据时(16进制)UAR

8、T0_RX_HEX_BUFUART0_RX_HEX_Len = UCA0RXBUF;if(UART0_RX_HEX_BUFUART0_RX_HEX_Len=0xFF)UART0_RX_HEX_BUF0=UART0_RX_HEX_BUFUART0_RX_HEX_Len-1;UART0_RX_HEX_BUF1=UART0_RX_HEX_BUFUART0_RX_HEX_Len;UART0_RX_HEX_Len=1;else if(UART0_RX_HEX_BUFUART0_RX_HEX_Len=0xFA)ReadUART0_Permit=1;UCA0IE UART0_RX_HEX_Len+;if(UART0_RX_HEX_Len = UART0_RX_HEX_MAXLen)UART0_RX_HEX_Len = 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1