OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4332|回复: 12

stm32L152 程序莫名堆栈溢出

[复制链接]

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-9-18
在线时间
2 小时
发表于 2015-9-18 15:18:23 | 显示全部楼层 |阅读模式
5金钱
现在是stm32L在spi数据线上一直读取外设的采集数据,我把数组声明为了全局变量 (看有些帖子说局部变量容易溢出),现在存在一个情况就是当我只读取一个或者两个时系统怎么运行都没事,一旦超过三个就不可以了,部分代码如下,(我也修改了下Stack_Size      EQU     0x00000400 -》C00,效果怎么说呐,就是五个同时读取时以前所有数据只更新一次,现在能更新几次...然后的然后还是不更新了


float Capacitance_ratio[N+1],result,E;//?¨????????????×é ?? ×??????????????

主函数里面是
while(1)
        {Capacitance_ratio[1] = Read_Results_32Bit_Opcode(0x40, 0x01, 21);  //?????? ????

                Capacitance_ratio[2] = Read_Results_32Bit_Opcode(0x40, 0x02, 21);  //?????? ????

                  Capacitance_ratio[3] = Read_Results_32Bit_Opcode(0x40, 0x03, 21);  //?????? ????

                Capacitance_ratio[4] = Read_Results_32Bit_Opcode(0x40, 0x04, 21);  //?????? ????

                Capacitance_ratio[5] = Read_Results_32Bit_Opcode(0x40, 0x05, 21);  //?????? ????
}

请问各位前辈,这个问题是我哪里不对的   

生成的project.html 如下
Maximum Stack Usage = 2024 bytes + Unknown(Cycles, Untraceable Function Pointers)

Call chain for Maximum Stack Depth:

main ? Read_Results_32Bit_Opcode ? pow ? __kernel_poly ? __aeabi_dmul ? _double_epilogue ? _double_round

最佳答案

查看完整内容[请看2#楼]

用同一个SPI2接口操作不同对象? 怎么区分它们? 找这个问题需要了解你的硬件、软件全部内容, 1、操作完成后加上清除标志的语句,试试。 2、可能与硬件时序有关。 不要往溢出、堆呀栈呀这些方面想了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11553
金钱
11553
注册时间
2014-4-1
在线时间
1317 小时
发表于 2015-9-18 15:18:24 | 显示全部楼层
用同一个SPI2接口操作不同对象?
怎么区分它们?

找这个问题需要了解你的硬件、软件全部内容,
1、操作完成后加上清除标志的语句,试试。
2、可能与硬件时序有关。

不要往溢出、堆呀栈呀这些方面想了。
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-9-19 23:57:40 | 显示全部楼层
Read_Results_32Bit_Opcode()是你写的函数,还是调用的库?个人觉得这个函数出问题的可能性最大,如果是自己写的最好仿真单步跟一下,看看那个地方溢出了;栈大小一般不用修改,除非你确定真的不够大。
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-9-20 00:01:40 | 显示全部楼层
kei因为是仿真芯片里面的程序,所以内存情况不容易反映出来,建议你把这个工程移植到VS平台或者其他PC上面的编译环境,如果出现堆栈被破坏的情况程序会报错
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-9-18
在线时间
2 小时
 楼主| 发表于 2015-9-21 09:42:07 | 显示全部楼层
回复【2楼】shimengdacs:
---------------------------------
嗯 我试下 谢谢
回复

使用道具 举报

19

主题

702

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3339
金钱
3339
注册时间
2013-7-30
在线时间
708 小时
发表于 2015-9-21 15:57:14 | 显示全部楼层
数组声明为全局,这个数组就没有占用栈空间,以上的代码执行不会导致栈溢出,一般不用修改栈空间,检查一下Read_Results_32Bit_Opcode函数
思想很重要,无论做人还是编程!
我的技术公众号【微联智控工作室】
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-9-18
在线时间
2 小时
 楼主| 发表于 2015-9-22 11:28:40 | 显示全部楼层
回复【5楼】小温:
---------------------------------
这个函数单步调试多久都没问题。。为何一全速跑就有事...如果只读取一个地址的数据 也没问题,两个也没问题?
可能是系统速度太低?
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-9-18
在线时间
2 小时
 楼主| 发表于 2015-9-22 11:29:21 | 显示全部楼层
回复【2楼】shimengdacs:
---------------------------------
这个函数单步调试多久都没问题。。为何一全速跑就有事...如果只读取一个地址的数据 也没问题,两个也没问题?
可能是系统速度太低?
回复

使用道具 举报

19

主题

702

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3339
金钱
3339
注册时间
2013-7-30
在线时间
708 小时
发表于 2015-9-22 12:36:37 | 显示全部楼层
回复【6楼】普莱斯队长:
---------------------------------
不懂你说的“系统速度太低”是什么意思
思想很重要,无论做人还是编程!
我的技术公众号【微联智控工作室】
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-9-18
在线时间
2 小时
 楼主| 发表于 2015-9-22 13:26:34 | 显示全部楼层
回复【8楼】小温:
---------------------------------
就是我设置断点 一个个读没事,一让他全速跑就一会就不行。我意思是是不是可能处理太慢。但是我用F103 24M甚至4M跑都没事,为什么到了L152就不行了。。。。
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-9-18
在线时间
2 小时
 楼主| 发表于 2015-9-22 14:54:06 | 显示全部楼层
现在是系统时钟4M,用F103没事,为何L152就出问题....
回复

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-9-22 22:16:31 | 显示全部楼层
回复【7楼】普莱斯队长:
---------------------------------
方便把Read_Results_32Bit_Opcode函数的代码贴一下吗?
回复

使用道具 举报

4

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-9-18
在线时间
2 小时
 楼主| 发表于 2015-9-23 09:25:26 | 显示全部楼层
[mw_shl_code=c,true]float Read_Results_32Bit_Opcode(unsigned char read_opcode, unsigned char read_addr, unsigned char fractional_bits) { unsigned char n_bytes = 3; unsigned char n; unsigned int Result_read = 0; float Result = 0; unsigned char read_opcode_addr = read_opcode | read_addr; //.............. Result = n Byte = n x 8 bits...................... // Deactivating Reset SPIx //GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_RESET); GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET); SPI_I2S_SendData(SPI2, read_opcode_addr); // READ OPCODE + Address·?????×÷·? while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET) {};//????·????ê±? Simple_delay_43ns((void*)10); // important delay (16) at SPI freq.=750kHz???? //Compulsory reads to DR and SR to clear OVR, //so that next incoming data is saved SPI_I2S_ReceiveData(SPI2); // To clear OVR????×?·? SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE); // To clear OVR?????????ê±?±ê?? //Reading byte1 SPI_I2S_SendData(SPI2, 0x00FF); // DUMMY WRITE·???8??1 // Wait until RX buffer is not empty, then read the received data while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)==0) {} // ?????????ê±? Result_read = SPI_I2S_ReceiveData(SPI2); // Read???á?? for (n = 1; n < n_bytes; n++) { //Reading byte2 .. byte.n SPI_I2S_SendData(SPI2, 0x00FF); // DUMMY WRITE·???8??1 // Wait until RX buffer is not empty, then read the received data while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)==0) {} //?????????ê±? Result_read = Result_read<<8; Result_read |= SPI_I2S_ReceiveData(SPI2); // Read } //GPIO_WriteBit(GPIOA, GPIO_Pin_4, Bit_SET); GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_SET); Result = Result_read / pow(2, fractional_bits); return Result; } [/mw_shl_code]
您看下,就是先写一个类似标志位,然后写地址 返回数据
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 12:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表