Chapter 5
5-2 DETERMINING THE SIZE OF A STACK
The size of the stack required by the task is application specific. When sizing the stack,
however, one must account for the nesting of all the functions called by the task, the
number of local variables to be allocated by all functions called by the task, and the stack
requirements for all nested interrupt service routines. In addition, the stack must be able to
store all CPU registers and possibly Floating-Point Unit (FPU) registers if the processor has a
FPU. As a general rule in embedded systems, avoid writing recursive code.
It is possible to manually figure out the stack space needed by adding all the memory
required by all function call nesting (1 pointer each function call for the return address),
plus all the memory required by all the arguments passed in those function calls, plus
storage for a full CPU context (depends on the CPU), plus another full CPU context for each
nested ISRs (if the CPU doesn’t have a separate stack to handle ISRs), plus whatever stack
space is needed by those ISRs. Adding all this up is a tedious chore and the resulting
number is a minimum requirement. Most likely one would not make the stack size that
precise in order to account for “surprises.” The number arrived at should probably be
multiplied by some safety factor, possibly 1.5 to 2.0. This calculation assumes that the exact
path of the code is known at all times, which is not always possible. Specifically, when
calling a function such as printf() or some other library function, it might be difficult or
nearly impossible to even guess just how much stack space printf() will require. In this
case, start with a fairly large stack space and monitor the stack usage at run-time to see just
how much stack space is actually used after the application runs for a while.
There are really cool and clever compilers/linkers that provide this information in a link
map. For each function, the link map indicates the worst-case stack usage. This feature
clearly enables one to better evaluate stack usage for each task. It is still necessary to add
the stack space for a full CPU context plus, another full CPU context for each nested ISR
(if the CPU does not have a separate stack to handle ISRs), plus whatever stack space is
needed by those ISRs. Again, allow for a safety net and multiply this value by some factor.
Always monitor stack usage at run-time while developing and testing the product as stack
overflows occur often and can lead to some curious behaviors. In fact, whenever someone
mentions that his or her application behaves “strangely,” insufficient stack size is the first
thing that comes to mind.
86
相关PDF资料
AD-UCUSBD-SPRD PRD LIC UCUSB DEV CORE CCES SGL
AD637-EVALZ BOARD EVALUATION FOR AD637
AD736-EVALZ BOARD EVALUATION FOR AD736
AD737-EVALZ BOARD EVALUATION FOR AD737
AD8007AKS-EBZ BOARD EVAL FOR AD8007AKS
AD8018ARU-EVAL BOARD EVAL FOR AD8018
AD8034ART-EBZ BOARD EVAL FOR AD8034ART
AD8040AR-EBZ BOARD EVAL FOR AD8040AR
相关代理商/技术参数
ADUCOSC100 制造商:Analog Devices 功能描述:ADC - Rail/Tube
ADUCOSC100-REEL 功能描述:DAC MICROCONVERTER DUAL TSSOP 制造商:analog devices inc. 系列:* 零件状态:上次购买时间 标准包装:1
ADUCOSC100-REEL7 功能描述:DAC MICROCONVERTER DUAL TSSOP 制造商:analog devices inc. 系列:* 零件状态:上次购买时间 标准包装:1
ADUCOSCZ100 制造商:Analog Devices 功能描述:
ADUCOSCZ100-REEL7 制造商:Analog Devices 功能描述:ANAADUCOSCZ100-REEL7 12 BIT ADC WITH EMB
ADuC-P7026 功能描述:开发板和工具包 - ARM PROTOTYPE BRD FOR ADUC7026 ARM7 RoHS:否 制造商:Arduino 产品:Development Boards 工具用于评估:ATSAM3X8EA-AU 核心:ARM Cortex M3 接口类型:DAC, ICSP, JTAG, UART, USB 工作电源电压:3.3 V
ADUCRF101 制造商:Analog Devices 功能描述:PRECISION ANALOG MICRCONTROLLER - Tape and Reel
ADUCRF101BCPZ128 制造商:Analog Devices 功能描述:PRECISION ANALOG MICROCONTROLLER WITH RF TRANSCEIVER, ARM CO - Trays