搜索
bottom↓
回复: 6

急!求助……IAR For arm 无法进入main,老是堆栈溢出

[复制链接]

出0入0汤圆

发表于 2010-10-28 16:46:22 | 显示全部楼层 |阅读模式
用的是LPC2220,Jlink+IAR,之前在内部RAM中运行程序完全没问题。但换到外部RAM(IS16LV25616AL),就无法进入mian,老是堆栈溢出。
Thu Oct 28 16:00:05 2010: The stack 'CSTACK' is filled to 100% (1280 bytes used out of 1280). The warning threshold is set to 90.%
Thu Oct 28 16:00:05 2010: The stack 'IRQ_STACK' is filled to 100% (256 bytes used out of 256). The warning threshold is set to 90.%
在启动程序部分,每单步一次就会出来这样的警告,想进入main更是不可能。警告上说的什么堆栈已满,其实根本不是这样,我把 'CSTACK'  'IRQ_STACK' 的分配空间调大了也还是如此。但是我用软仿又不会出现这样的错误,能进入main。不知道是什么原因,真神奇。XCL文件不知道会不会出错(我认为没错),外部RAM接的是,BANK0。望高手给予指点。下面是它的XCL,修改于EWARM安装目录下的例程 phytec_pcm023_xram.xcl
//************************************************************************

*
// XLINK command file template for EWARM/ICCARM
//
// Usage:  xlink  -f lnkarm  <your_object_file(s)>
//                -s <program start label>  <C/C++ runtime library>
//
// $Revision: 1.1 $
//************************************************************************

*

//************************************************************************

*
//
// -------------
// Code segments - may be placed anywhere in memory.
// -------------
//
//   INTVEC     -- Exception vector table.
//   SWITAB     -- Software interrupt vector table.
//   ICODE      -- Startup (cstartup) and exception code.
//   DIFUNCT    -- Dynamic initialization vectors used by C++.
//   CODE       -- Compiler generated code.
//   CODE_I     -- Compiler generated code declared __ramfunc (executes in

RAM)
//   CODE_ID    -- Initializer for CODE_I (ROM).
//
// -------------
// Data segments - may be placed anywhere in memory.
// -------------
//
//   CSTACK     -- The stack used by C/C++ programs (system and user

mode).
//   IRQ_STACK  -- The stack used by IRQ service routines.
//   SVC_STACK  -- The stack used in supervisor mode
//                 (Define other exception stacks as needed for
//                 FIQ, ABT, UND).
//   HEAP       -- The heap used by malloc and free in C and new and
//                 delete in C++.
//   INITTAB    -- Table containing addresses and sizes of segments that
//                 need to be initialized at startup (by cstartup).
//   CHECKSUM   -- The linker places checksum byte(s) in this segment,
//                 when the -J linker command line option is used.
//   DATA_y     -- Data objects.
//
// Where _y can be one of:
//
//   _AN        -- Holds uninitialized located objects, i.e. objects with
//                 an absolute location given by the @ operator or the
//                 #pragma location directive. Since these segments
//                 contain objects which already have a fixed address,
//                 they should not be mentioned in this linker command
//                 file.
//   _C         -- Constants (ROM).
//   _I         -- Initialized data (RAM).
//   _ID        -- The original content of _I (copied to _I by cstartup)

(ROM).
//   _N         -- Uninitialized data (RAM).
//   _Z         -- Zero initialized data (RAM).
//
// Note:  Be sure to use end values for the defined address ranges.
//        Otherwise, the linker may allocate space outside the
//        intended memory range.
//************************************************************************

*


//************************************************
// Inform the linker about the CPU family used.
//************************************************

-carm

//************************************************************************

*
// Segment placement - General information
//
// All numbers in the segment placement command lines below are

interpreted
// as hexadecimal unless they are immediately preceded by a '.', which
// denotes decimal notation.
//
// When specifying the segment placement using the -P instead of the -Z
// option, the linker is free to split each segment into its segment parts
// and randomly place these parts within the given ranges in order to
// achieve a more efficient memory usage. One disadvantage, however, is
// that it is not possible to find the start or end address (using
// the assembler operators .sfb./.sfe.) of a segment which has been split
// and reformed.
//
// When generating an output file which is to be used for programming
// external ROM/Flash devices, the -M linker option is very useful
// (see xlink.pdf for details).
//************************************************************************

*


//************************************************************************

*
// Read-only segments mapped to ROM.
//************************************************************************

*

-DROMSTART=80000040
-DROMEND=8007FFFF

//************************************************
// Address range for reset and exception
// vectors (INTVEC).
// The vector area is 32 bytes,
// an additional 32 bytes is allocated for the
// constant table used by ldr PC in cstartup.s79.
//************************************************

-Z(CODE)INTVEC=40000000-4000003F

//************************************************
// Startup code and exception routines (ICODE).
//************************************************

-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND
-Z(CODE)SWITAB=ROMSTART-ROMEND

//************************************************
// Code segments may be placed anywhere.
//************************************************

-Z(CODE)CODE=ROMSTART-ROMEND

//************************************************
// Original ROM location for __ramfunc code copied
// to and executed from RAM.
//************************************************

-Z(CONST)CODE_ID=ROMSTART-ROMEND

//************************************************
// Various constants and initializers.
//************************************************

-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND
-Z(CONST)CHECKSUM=ROMSTART-ROMEND

//************************************************************************

*
// Read/write segments mapped to RAM.
//************************************************************************

*

-DRAMSTART=81000000
-DRAMEND=8107FFFF

//************************************************
// Data segments.
//************************************************

-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND

//************************************************
// __ramfunc code copied to and executed from RAM.
//************************************************

-Z(DATA)CODE_I=RAMSTART-RAMEND

//************************************************
// ICCARM produces code for __ramfunc functions in
// CODE_I segments. The -Q XLINK command line
// option redirects XLINK to emit the code in the
// CODE_ID segment instead, but to keep symbol and
// debug information associated with the CODE_I
// segment, where the code will execute.
//************************************************

-QCODE_I=CODE_ID

//************************************************************************

*
// Stack and heap segments.
//************************************************************************

*

-D_CSTACK_SIZE=1000
// -D_SVC_STACK_SIZE=10
-D_IRQ_STACK_SIZE=100
-D_HEAP_SIZE=100

-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
// -Z(DATA)SVC_STACK+_SVC_STACK_SIZE=RAMSTART-RAMEND
-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE,HEAP+_HEAP_SIZE=RAMSTART-RAMEND

//************************************************************************

*
// ELF/DWARF support.
//
// Uncomment the line "-Felf" below to generate ELF/DWARF output.
// Available format specifiers are:
//
//   "-yn": Suppress DWARF debug output
//   "-yp": Multiple ELF program sections
//   "-yas": Format suitable for debuggers from ARM Ltd (also sets -p

flag)
//
// "-Felf" and the format specifiers can also be supplied directly as
// command line options, or selected from the Xlink Output tab in the
// IAR Embedded Workbench.
//************************************************************************

*

// -Felf

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-10-28 17:33:02 | 显示全部楼层
在内部RAM中运行程序完全没问题。但换到外部RAM(IS16LV25616AL),就无法进入mian

这句比较费解,是你的程序在内部ram跑呢,还是原来的程序里面用的内部ram做存储。。。。

另外  -Z(CODE)INTVEC=40000000-4000003F
你中断向量弄到ram里面去了干嘛

出0入0汤圆

 楼主| 发表于 2010-10-29 09:53:22 | 显示全部楼层
回复【1楼】yuhui
-----------------------------------------------------------------------

我的意思是在内部RAM中运行没问题,在外部RAM中不能运行,我把中断向量搬到外部去结果还是一样,还是出现堆栈溢出的错误.

出0入0汤圆

发表于 2010-10-29 10:40:21 | 显示全部楼层
你把启动代码贴出来看看,你这个IAR版本好像是4.xx的,启动代码估计是.s79文件

出0入0汤圆

 楼主| 发表于 2010-10-31 15:40:41 | 显示全部楼层
回复【3楼】yuhui
-----------------------------------------------------------------------

问题解决,在MAC文件里没有对CPU的外部存储器接口进行设置。现在又有一个新的问题了,想把程序下到外部flash中。要通过什么flashloader,看了它的例程,还是不知道怎么写自己的flashloadder,请教下阁下!

出0入0汤圆

发表于 2010-10-31 19:00:11 | 显示全部楼层
lpc2xxx系列有现成的loader吧,只要你的device选的正确,loader都是现成的,都不需要你自己选。。。。

出0入0汤圆

 楼主| 发表于 2010-11-4 15:23:05 | 显示全部楼层
回复【5楼】yuhui
-----------------------------------------------------------------------

我用的是外部flash,SST系列的,自己写了个flashloader,写出来,也下进去了,能正常仿真,仿真的时候又有  program flash 的界面,就是不能脱机运行。不知道我的程序有没有烧进外部flash中?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 10:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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