TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] TM4C129ENCPDT:有关地址和堆栈的 SRAM 问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/640196/tm4c129encpdt-sram-questions-with-addresses-and-stack

器件型号:TM4C129ENCPDT

你(们)好 我想把头缠绕在一些东西上。

1) 1)数据表显示 SRAM 从0x2000.0000开始、到0x2006.FFFF 结束、但这远远超过了该芯片应有的256KB。 我不担心、但是否有特定原因或我看不到的东西?

2) 2)链接器命令文件显示:
    SRAM (rwx):origin = 0x20000000,length = 0x00040000
    .vtable  :>0x20000000
    然后、我将尝试堆栈大小、在这里、我尝试一个非常小的堆栈:
     __STACK_TOP =__STACK + 128;
    当我进行调试时、_stack 看起来位于0x2001.98B8、并取消引用它指向0x2001.9634。
    那么、为什么它不会更接近0x2000.0000呢? 堆栈不应该"太多了?" 矢量表后面?

3)  3)程序启动时、SP = __STACK_TOP = 0x2001.9938、这恰好比0x2001.98B8高128字节(我的堆栈大小)、但我感到困惑    的是,我认为0x2001.98B8是__STACK 存储器中的位置,但值为0x2001.9634,值应该是什么。
  在我的观察窗口中、它显示:
  值为0x2001.98b8{0x2001.9634}的 int*类型的"__STACT"、未提供地址
  然后、我展开该表达式、它说:
  值为0x2001.9634且地址 为0x2001.98b8的 int 类型的"(x)=*(_stack)"。
  我知道这听起来非常令人困惑、但我想观察窗口会混淆地址和价值。

4) 4)  当我选择的变量被写入或更改为某个值时、我可以设置断点、还是无法设置断点?
5) 5)  当 SP 达到或低于_stack 时、如何设置断点

供参考我没有堆栈溢出问题,但我想更详细地理解这些内容,以便我成为一个优秀的程序员:)

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

    这个特定器件型号器件中只执行了256KB。 0x2000.0000 - 0x2006.FFFF 显示了器件可能具有的最大值。 数据表中的这种情况可能有点令人困惑。
    2. VTABLE 从0x20000000开始、后跟.data、.bss 和.system。 这可能是.stack 从您显示的地址开始的原因。 为了更好地了解链接器如何分配不同的段、请阅读 Debug 文件夹下的.map 文件以及.out 和.bin。
    请注意堆栈向下计数而不是向上计数。 它从0x20019928到0x200198B8开始。
    4.如果你知道你所选变量的指针地址、那么你可以设置一个观察点来观察该地址。 写入该地址后、CPU 将停止。 首先打开"Breakpoints"窗口,然后可以通过转至"Breakpoints"->"Hardware Watchpoint"来配置观察点。 指定要监视的地址。
    5.与#4相同。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢 Charles。 如果您不介意、您能进一步澄清一下吗?

    1)这不是令人困惑的、这是我认为但想确保的。

    2) 2)如果 RAM 介于0x2000.0000至0x2003.FFFF 之间、则表示堆栈位于 RAM 的中间。 我相信这是有充分理由的。 有些人似乎更喜欢堆栈位于/接近 RAM 的开头-因此不知道这是什么。
    20000000 20000000 00019938 00000000 Rw-
    20000000 20000000 0001975e 00000000 rw-.bss
    20019760 20019760 00000155 00000000 rw-.data
    200198b8 200198b8 00000080 00000000 rw-.stack

    3) 3)好的、在我的例子中、从0x20019938开始、并且可以向下转到... (这是我的困惑所在)
    较低的限值位于0x200198b8 (给定0x80堆栈大小)是合理的、但是当调试窗口降低到__stack 时、它会显示为0x20019634。 如果你看看我的第一篇帖子中的屏幕截图、你就会知道我的意思。 我是否未阅读此信息?

    4) 4)这似乎对我不起作用、可能是因为我没有为断点设置条件。 顺便说一下、TI wiki 几乎没有涉及这个主题。
    processors.wiki.ti.com/.../Watchpoint
    如果您看下面这条消息的屏幕截图、我将展示堆栈完全超出范围的外观(这是为了更好地理解堆栈)。 我在该区域中设置了多个断点、它们不会触发。
    另请注意、在存储器视图中、变量_stack 位于0x2001998b8、 这会返回到#2、在这里、我感觉__stack 应该指向0x2001998b8可能是错误的、因为我认为__stack 是一个指针、其值表示堆栈的底部。

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

    您好!

     2.您的代码的.vtable 段的起始地址为0x20000000。 也请检查.text 段的长度。 您是否具有同样从 SRAM 运行的.text 段的加载和运行地址? 这就是将.stack 放置在.text 段之后的原因。 选择一个没有将.vtable 映射到 SRAM 的简单 TivaWare 示例、您会发现.stack 从0x20000000开始。 下面是 hello 示例的一个示例。 stack 从0x200000000开始。

    段分配映射

    运行 origin load origin length init length atts members

    ------  ------ ------ ------ ---- ----

    00000000  00000000  000014b8 000014b8  r-x

     00000000  00000000  00000200 00000200  r--.intvecs

     00000200  00000200  00001014 00001014  r-x .text

     00001214  00001214  0000026c 0000026c  r-.const

     00001480  00001480  00000038 00000038  r-.cinit

    20000000  20000000  00000224 00000000  Rw-

     20000000  20000000  00000200 00000000  rw-.stack

     20000200  20000200  00000020 00000000  rw-.data

     20000220  20000220  00000004 00000000  rw-.bss

    3.我不知道你想问什么。 对我来说、值0x20019634是存储在地址0x200198b8的值。 它可能是在您运行代码后或从您之前运行的程序中存储的值。 请注意、复位不会清除 SRAM 内容。 当您到达 main()时,您可以手动将内容清除为0,并查看在运行代码后是否更改了内容。  

    4.您没有按照我的建议设置观察点。

     请参见下图。 第一个映像是为写入地址0x200198b8设置观察点。 第二幅图像显示了配置后应如何在断点窗口中注册。 它应该在 Name 列下显示观察点。

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

    您好、Charles、您非常乐于助人。 我无法找到观察点、但这还可以、再次进行一些研究。

    现在、我更好地了解了堆栈在该器件上的工作方式、并且我实现了一个函数、在其末尾写入一个图形(最低地址)、我将能够对其进行监控、以确保有足够的堆栈空间。

    非常感谢!

    extern uint32_t __stack_top;
    #define stack_size 2048 //字节
    #define stack_guard 128 //字节
    void init_stackguard (void){
    unsigned short int i;
    uint32_t*测试;
    TEST =&_STACK_TOP;
    TEST =(STACK_SIZE / 4);
    对于(i = 0;i < stack_guard / 4;i++)*测试++= 0x5A5A5A5A;
    }
    

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

    您好!

     如果您仍然希望使用观察点、下面是指令。 当光标位于 Breakpoints 窗口中时,右键单击鼠标并选择 Breakpoiint (Code Composer Studio)-> Hardware Watchpoint。