打印

STM32F仿真时提示堆栈溢出,怎么办?

[复制链接]
6571|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sunke9|  楼主 | 2008-5-31 13:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的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****/

沙发
sunke9|  楼主 | 2008-5-31 14:54 | 只看该作者

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

上面集成st-link2只能用在iar环境下啊。

使用特权

评论回复
板凳
sunke9|  楼主 | 2008-5-31 16:39 | 只看该作者

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

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

我编译通过的整个项目

使用特权

评论回复
地板
simon21ic| | 2008-5-31 16:59 | 只看该作者

诶,仿真器正在调试中

不用仿真时运行结果对不对

使用特权

评论回复
5
ijk| | 2008-5-31 17:58 | 只看该作者

不应该有问题

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

使用特权

评论回复
6
ATmega32L| | 2008-5-31 19:27 | 只看该作者

把堆栈改大点不就行了。

把堆栈改大点不就行了。

不喜欢KEIL,IAR用得很好。

51,AVR,MSP430,ARM统统都用IAR。

使用特权

评论回复
7
香水城| | 2008-5-31 20:50 | 只看该作者

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

编译时是如何选择运行空间的(Flash或RAM)?

使用特权

评论回复
8
mcubug| | 2008-5-31 20:57 | 只看该作者

iar

十分不喜欢iar

使用特权

评论回复
9
simon21ic| | 2008-5-31 23:38 | 只看该作者

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

我用的是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地

使用特权

评论回复
10
Swd21ic| | 2008-6-1 00:41 | 只看该作者

个人觉得 IAR比MDK好用



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

使用特权

评论回复
11
sunke9|  楼主 | 2008-6-1 20:43 | 只看该作者

回复

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

使用特权

评论回复
12
running_li| | 2008-6-1 20:51 | 只看该作者

设置堆栈

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

使用特权

评论回复
13
simon21ic| | 2008-6-1 21:03 | 只看该作者

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

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

使用特权

评论回复
14
香水城| | 2008-6-1 21:21 | 只看该作者

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

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

如果要在Flash中调试,请把BOOT0跳线放到'0'的位置,BOOT1跳线放在'0'或'1'都可以。

使用特权

评论回复
15
sunke9|  楼主 | 2008-6-2 08:14 | 只看该作者

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

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

使用特权

评论回复
16
mcubug| | 2008-6-2 10:25 | 只看该作者

MDK 16k

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

呵呵,16k  不是吧,

使用特权

评论回复
17
jackbao| | 2008-6-2 13:26 | 只看该作者

你的配置没有配置对

要定义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
}

使用特权

评论回复
18
sunke9|  楼主 | 2008-6-2 14:24 | 只看该作者

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

谢谢!楼上各位,我发现有这问题,正在修改

使用特权

评论回复
19
sunke9|  楼主 | 2008-6-2 17:35 | 只看该作者

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

我正在分析我出问题的原因.

使用特权

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

本版积分规则

50

主题

355

帖子

1

粉丝