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.

MSP430FR2676: 如何设置一个合理的stack大小?

Part Number: MSP430FR2676

上图是我应用工程的一个stack空间使用情况,在上图中:

1. 主函数main占用了126字节空间;

2. ADC_ISR是ADC中断,执行时需要28字节空间;

3. __TI_auto_init_nobinit_nopinit_hold_wdt占用20字节;

4. __TI_decompress_none占用20字节;

5. __TI_decompress_lzss占用32字节;

6. abort占用4字节;

其中,ADC_ISR可能随时触发打断main的执行,所以最小stack空间应该要大于126+28=154字节;

请问:

1. __TI_auto_init_nobinit_nopinit_hold_wdt、__TI_decompress_none、__TI_decompress_lzss、abort分别是干什么的?在什么时候运行?计算最小stack使用量是否需要计算他们?

2. 如果启用了2个中断,最小stack应该加上2个中断函数的占用之和,还是加上2个中断函数的占用较大的那个?

  • 您好我们已收到您的问题并升级到英文论坛,温馨提示您由于圣诞节及新年假期,英文论坛回复将稍慢,敬请谅解!

  • 1. __TI_auto_init_nobinit_nopinit_hold_wdt、__TI_decompress_none、__TI_decompress_lzss、abort分别是干什么的?在什么时候运行?计算最小stack使用量是否需要计算他们?

    初始化例程是在调用 main 之前运行,所以不需要添加到所需的堆栈大小。

    2. 如果启用了2个中断,最小stack应该加上2个中断函数的占用之和,还是加上2个中断函数的占用较大的那个?

    Interrupt service routines从禁用中断开始,除非您明确启用 ISR 内的中断,否则不会出现nested interrupts。 所以这个问题是取决于您的代码。

  • __TI_auto_init_nobinit_nopinit_hold_wdt是初始化代码,这个从命名能够看出来;__TI_decompress_none、__TI_decompress_lzss、abort也是初始化时调用的吗?

  • __TI_decompress_none、__TI_decompress_lzss、abort也是初始化时调用的吗?

    是的,前两者也是在初始化时调用,由编译器运行 run-time library 启动代码调用来初始化全局变量。

    关于abort:

    Abort 用来处理异常的程序终止,如果调用它,那么仅仅在loop中旋转。 以下任一情况可以调用 Abort :

    1. main() 函数返回。 如果 main() 返回 exit () ,则在调用 abort () 时调用 exit ()。 在嵌入式应用程序中,单元测试程序可能会返回,但 main()一般不会返回。

    2. 在运行时 EXIT () 或 ABORT () 被调用,无论是直接由应用程序调用,还是当应用程序调用的run-time library function发生错误。