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.

[参考译文] MSP430FR5989:确定堆栈空间的使用

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1423204/msp430fr5989-determining-stack-space-usage

器件型号:MSP430FR5989

工具与软件:

我尝试 使用一个小函数 来确定我的应用程序在运行时使用了多少栈空间。

我遇到的一个重大问题是、当我读取 SP/R1时、这个值就没有意义了。 它返回报告>128k。 纵观所有32位、它显示的值远超过1M、这对于该器件是错误的、因为它具有128KB 的板载 FRAM。

相关的代码片段

```μ A

uint32_t get_SP_register (void)
uint32_t sp_value

//使用`movx`指令处理大存储器模型中的20位寻址
__ASM____volatile__("movx.a sp,%0":"=r"(sp_value):"memory")

返回 sp_value0xFFFFF
}
extern uint32_t _stack_start[]

void fill_stack_space()
uint32_t sp = get_SP_register ();
uint32_t fill_size = sp -(uint32_t)_stack_start;

logger.info("Stack 指针值:%lu 字节"sp);
logger.info("Stack 启动:%lu 字节"、(uint32_t)_stack_start);
logger.info("fill 大小:%lu 字节"fill_size);
 
}
```μ A
找到此示例
```μ A
.stack
. = align (2);
_stack_start =./*定义堆栈的起始*/
. += STACK_SIZE;
_stack_end =./*定义堆栈的末尾*/
provide (__stack =.);
*(.stack)
}> HIFRAM
```μ A
在测试中、STACK_SIZE 等于40K
我使用大型内存模型并使用-os 进行编译
我不知道为什么堆栈指针会关闭这么多,但用任何已知值替换函数的返回值确实显示出我的记录器语句正确地输出了我返回的内容。  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    一些不良数据的示例会很有帮助。

    我看到 GCC 包含一个字大小的版本:

    #define _get_SP_register() \
    ({ \
            unsigned int __x; \
            __asm__ __volatile__( \
            "mov SP, %0" \
            : "=r" ((unsigned int) __x) \
            :); \
            __x; \
    })
    
    

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

    将其全部删除并重试后、执行以下操作

      uintptr_t sp_value;
      // Using the `movx` instruction to handle 20-bit addressing in large memory model
      __asm__ __volatile__("movx.a SP, %0" : "=r"(sp_value) : : "memory");
      uint32_t stack_pointer = (uint32_t)sp_value;

    可以可靠地工作。

    之后转换到 uint32_t 是为了获得简单/已知的格式与 uintptr_t 个人偏好。

    似乎数据类型本身的大小必须为 uintptr_t、而不是任何任意值。