8079|19

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32F仿真时提示堆栈溢出,怎么办? [复制链接]

我的4LED程序终于是编译通过了,可是我用DEBUG功能仿真运行时系统提示"Sat May 31 13:34:45 2008: The stack 'CSTACK' is filled to 100% (2048 bytes used out of 2048). The warning threshold is set to 90.%"看起来好象是堆栈溢出,可是我翻了STM32的手册和Cortex_M3的手册都没看到怎么设置堆栈.似乎这又是IAR搞的鬼,我就纳闷了就我这么简单一个程序怎么能扯到堆栈溢出上去呢?
* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"


vu32 count = GPIO_Pin_4;

void SysTick_Config(void);

void Led_Config(void);

void Led_RW_ON(void);
void Led_RW_OFF(void);

void delay(void);
void delay()
{
  vu32 i,j;
  for (i=0; i<0xfff; i++)
  {
      for (j=0; j<0xff; j++);
  }
}


/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{

#ifdef DEBUG
  debug();
#endif

/* Configure the systick */
  SysTick_Config();

  Led_Config();
  
  while(1)
  {
      Led_RW_ON();
      delay();
  }
}

/*******************************************************************************
* Function Name  : SysTick_Config
* Description    : Configure a SysTick Base time to 10 ms.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SysTick_Config(void)
{
  /* Configure HCLK clock as SysTick clock source */
  SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);

  /* SysTick interrupt each 100 Hz with HCLK equal to 72MHz */
  SysTick_SetReload(720000);

  /* Enable the SysTick Interrupt */
  SysTick_ITConfig(ENABLE);

  /* Enable the SysTick Counter */
  SysTick_CounterCmd(SysTick_Counter_Enable);
}

void Led_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* Enable GPIOC clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  /* Configure PC.06, PC.07, PC.08 and PC.09 as output push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}

void Led_RW_ON(void)
{
  switch(count)
  {
      case GPIO_Pin_4: 
      {
          GPIO_SetBits(GPIOC,GPIO_Pin_4 );
          count = GPIO_Pin_5;
      }break;
      case GPIO_Pin_5: 
      {
          GPIO_SetBits(GPIOC,GPIO_Pin_5 );
          count = GPIO_Pin_6;          
      }break;   
      case GPIO_Pin_6: 
      {
          GPIO_SetBits(GPIOC,GPIO_Pin_6 );
          count = GPIO_Pin_7;
      }break;
      case GPIO_Pin_7: 
      {
          GPIO_SetBits(GPIOC,GPIO_Pin_7 );
          count = GPIO_Pin_4;          
      }break;        
      default : 
      {
          count = GPIO_Pin_4;          
      }break;  
  }
}

void Led_RW_OFF(void)
{
  GPIO_ResetBits(GPIOC, GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_4 | GPIO_Pin_5);
}

#ifdef  DEBUG
/*******************************************************************************
* Function Name  : assert_failed
* Description    : Reports the name of the source file and the source line number
*                  where the assert error has occurred.
* Input          : - file: pointer to the source file name
*                  - line: assert error line source number
* Output         : None
* Return         : None
*******************************************************************************/
void assert_failed(u8* file, u32 line)
{
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  while (1)
  {

  }
}
#endif
/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/

此帖出自stm32/stm8论坛

最新回复

                                 我正在分析我出问题的原因.   详情 回复 发表于 2008-6-2 17:35
点赞 关注
 

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

re

老大,整是搞不懂,为什么要用IAR???MDK不是挺好的吗?不管怎么说,我用MDK,十分爽,一切都很顺利,MDK配带的example我基本都看了,自己建工程,编译,在ram中debug通过。关于MDK,想和我交流的话,用qq:656749469
MSN:********@msn.com这个不能提供,呵呵
此帖出自stm32/stm8论坛
 
 

回复

97

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

我也不想啊,可是我买了一块万利的开发板

                                 上面集成st-link2只能用在iar环境下啊。
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 

麻烦大家仿真运行一下我这个工程

我运行个几圈就跑飞了,可是这程序这么简单不应该有什么问题啊。难道我用的iar有问题?我用的是iar4.42 32k限制版 

我编译通过的整个项目
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

5
 

诶,仿真器正在调试中

                                 不用仿真时运行结果对不对
此帖出自stm32/stm8论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

6
 

不应该有问题

                                 不管用 IAR 还是 ARM/KEIL MDK,都不应该有问题,因为它们应该都带有STM32的例子,使用这些例子作为模板应该很容易做的
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

7
 

把堆栈改大点不就行了。

把堆栈改大点不就行了。

不喜欢KEIL,IAR用得很好。

51,AVR,MSP430,ARM统统都用IAR。
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 

请问你是在Flash中调试还是在RAM中调试

                                 编译时是如何选择运行空间的(Flash或RAM)?
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

9
 

iar

                                 十分不喜欢iar
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

10
 

调试器终于调试成功,可以帮你测试一下了

我用的是IAR 5.11 + OpenOCD调试
下载程序时,OpenOCD收到了"m7FFFF00,80"命令,是要从0x07FFFF00读取128直接,由于该地址没有数据,所以JTAG操作出错
另外,你的项目中是否少了几个文件啊?cortexm3_macro.s和stm32f10x_vector.c去那里了?
stm32f10x_vector.c文件很重要,Flash第一个32位数据是堆栈地址,你的项目编译后,第一个32位数据是0x00102000,这个不在RAM里吧

to LS:
偶也不稀饭IAR,不过没办法,IAR提供的Kickstart免费版本可以使用32K,而MDK只有16K,所以才选IAR地
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

11
 

个人觉得 IAR比MDK好用



无论是51 AVR 430 ARM7 ARM9都能用IAR. 很专业的编译器.
连堆栈都不知道怎么设置就不要埋怨IDE
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 

回复

回5楼:我不仿真时候也不对,程序走不下去.
回6楼;我就是想知道我做的项目和例子区别在什么地方才自己建的项目.
回7楼:我把堆栈的容量改成2K结果还是出错.
回8楼:我是在FLASH里运行的,我在IAR的设置里选了那个什么**_FLASH.XCL
回10楼:cortexm3_macro.s和stm32f10x_vector.c都在PROJECT文件夹里.
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(中级)

13
 

设置堆栈

                                 设置堆栈是在lnkarm_ram.xcl或lnkarm_flash.xcl文件中。根据调试的方式选相对应文件,改变文件中-D_CSTACK_SIZE的大小,即可设置栈的大小。默认flash调试的栈是2k,ram调试的栈是1k.一般是够用的。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

14
 

这2个文件没看到你加在项目中

可惜我用的IAR版本和你的不同,没法给你直接使用
Vector中定义的__vector_table很重要,即使不用中断,但这张表的第一个32位为{ .__ptr = __sfe( "CSTACK" ) },也就是堆栈地址,所以你的程序每次设置的堆栈地址都是错的(你编译生成bin文件,看看第一个32位数据是什么),所以一旦程序读写中断,会引起异常
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

15
 

请注意正确地设置BOOT0和BOOT1跳线的位置

如果要在RAM中调试,请把BOOT0和BOOT1跳线都放到'1'的位置。

如果要在Flash中调试,请把BOOT0跳线放到'0'的位置,BOOT1跳线放在'0'或'1'都可以。
此帖出自stm32/stm8论坛
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(初级)

16
 

首先感谢楼上几位朋友的指点

回13楼:我尝试过修改lnkarm_ram.xcl或lnkarm_flash.xcl两个文件,没什么效果.
回14楼:我现在就去看看Vector文件
回15楼:我用的是FLASH调试,BOOT跳线都在0位置.
此帖出自stm32/stm8论坛
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

17
 

MDK 16k

偶也不稀饭IAR,不过没办法,IAR提供的Kickstart免费版本可以使用32K,而MDK只有16K,所以才选IAR地

呵呵,16k  不是吧,
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

18
 

你的配置没有配置对

要定义VECT_TAB_FLASH在配置里
应该在main 主函数里加入
void NVIC_Configuration(void)

#ifdef  VECT_TAB_RAM  
  /* Set the Vector Table base location at 0x20000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else  /* VECT_TAB_FLASH  */
  /* Set the Vector Table base location at 0x08000000 */ 
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
}
此帖出自stm32/stm8论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

19
 

我的程序里缺少NVIC的初始化

                                 谢谢!楼上各位,我发现有这问题,正在修改
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

20
 

我对照ST的例程修改了我的程序,现在程序已经正常运行了.

                                 我正在分析我出问题的原因.
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表