This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/CCStudio-MSP:监控峰值堆栈使用情况的简单方法...

Guru**** 2540720 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/580473/compiler-ccstudio-msp-easy-way-to-monitor-peak-stack-usage

部件号:CCStudio-MSP

工具/软件:TI C/C++编译器

您好,

我需要一种方法来查看我的MSP应用程序中使用了多少C++堆栈-传统的方法是使用已知模式"毒化"堆栈,然后查看其中多少被烧毁。

所以我写了以下几句--希望人们认为它是有用的:

以下代码允许您执行此操作,并随时检查在高峰使用期间消耗了多少预分配的堆栈,即您的应用程序与堆栈底部的距离有多近,或者实际上是否过度运行。 TI CCS文档为定义堆栈大小和起始点的全局符号提供的名称完全错误-需要更新,

将此代码(或类似代码)粘贴到要报告/检查堆栈使用情况的任何位置<初始化后堆栈上剩余的最小边数>/<堆栈的配置大小>。

#if defined(stack_check)
	std::printf("Stack:%d/%d\n", stackMinFreeCount(),stackMaxSize());
#endif

然后,在主代码中,您需要尽早使堆栈中毒,然后定义报告例程:

//定义stack_check以包括堆栈使用诊断
#define stack_check

#if defined (stack_check)
#define stack_init 0xBEEF				//模式,用于最初使堆栈
外部中毒uint16_t _stack; //堆栈开始(低地址)

uint16_t stackMinFreeCount(void);
uint16_t stackMaxSize(void);
#endif

#if defined(__cplusplusplusplusplus)
extern "C"
{
#endif
#if defined(__TI_Compiler_version__)||\defined (__gplus_)
	





	

#if defined (stack_check)
	////
	使用定义的模式逐字放置堆栈
	////
	请注意,_system_pre_init是最早的,我们可以
	//执行此操作,并且在TI-RTOS中可能无法执行
	此操作
	,当我们调用__GET_SP_CCS内在过程时(在IAR和寄存器上相同), 它将返回
	此例程调用方RET地址的地址//。 确保我们不会将其丢弃!!
	//
	register uint16_t *stack =&_stack;//在.stack部分中的最低地址
	register uint16_t *stack_top = redefendere_cast<uint16_t *>(__GET_SP_register());

	做{*stack++
		= stack_init;//			poison stack addresses
	while (stack <stack_top)		


	返回<stack_stack_return 1;<1
;要退出堆栈<1
#if defined(__cplusplusplusplusplus)
}
#endif

#if defined(stack_check)
/**
检查堆栈使用的深度
*
*\return	\c uint16_t		堆栈底部的最小字节数
*/

extern uint16_t	__stack_end;		//数据
外部末尾_uint16_t	__stack_size; 		//堆栈

uint16_t stackMinFreeCount(void)
{
	const uint16_t *stack =&_stack;
	uint16_t freeCount = 0;

	while (*stack == stack_init && stack++<=&__stack_end)
	{
		freeCount++;
	
	





链接器返回freeCount+<1;}/+*返回堆栈大小设置为C**的返回堆栈大小 stack_size选项
*
*\return	\c uint16_t		已配置堆栈的最大大小(以字节为单位
)*/
uint16_t stackMaxSize (void)
{
	return static_cast<uint16_t>(_symval(&__stack_size)));
}
#endif


int main(std)
{...
stackstackf)#if
defined(stackf_check