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.

[参考译文] CCS/TM4C1231H6PGE:除非我将闪存基址设置为0x00000000、否则调试器不会 n't 在 main ()处停止

Guru**** 2468460 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/670671/ccs-tm4c1231h6pge-debugger-doesn-t-stop-at-main-unless-i-set-the-flash-base-address-as-0x00000000

器件型号:TM4C1231H6PGE

工具/软件:Code Composer Studio

大家好,我有一个程序,调试器不会在 main 停止(),它的默认链接器命令文件中的 APP_BASE 为0xA000,如果我将它更改为0x0000,调试器将按预期工作,并且能够在 main 停止()。  有人知道原因吗? 我记得我能够调试不是以0x0000开头的应用程序、所以我很惊讶为什么我不得不为这个更改这个。

谢谢

Richard

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、
    堆栈指针和复位向量必须位于闪存存储器的前两个位置(0x00000000和0x00000004)。 这些位置不能为空。 问题可能是您希望在地址0x00000000处有一个引导加载程序、但它不存在。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    什么是 APP_BASE? 我在.map 文件或链接器文件中看不到此符号(.cmd 文件是链接器正确吗?)。

    我看到我的主从程序计数器0x1F50开始。

    当我将配置更改为不重置为 main 时、程序计数器从0x51BC 开始、在.map 文件中为_c_int00的地址。

    在 main 之前运行的代码位于 main 之后、这与直觉相反。 两者都从0开始。

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

    这在查看存储器时很有意义。 地址4是_c_int00的地址。 我可以看到 PC 使用该地址进行声明。

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

    感谢 Bob 和 Peter 的信赖。 我认为您认为、我的案例适用的情况可能已经有一个引导加载程序、这样当我从0xA000开始调试我的应用程序时、它似乎能够运行。 在本例中,闪存的开头没有任何内容,因此调试器永远不会在 main ()停止,因为永远不会传递控制权。

    谢谢

    Richard

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

    我想 Bob 所指的是什么;如果您使用 app_base=0x00000000 (_ccs.cmd)编译应用程序,则主函数应位于此处。 除非有人以某种方式将串行引导加载程序组合到应用程序中、否则无法确定这一点、因为整个矢量表从 SBL 更改为基于应用程序的表。 然后、确定应用程序的8KB 边界从 SBL 之上的哪个位置开始、通常为0x00004000、这将成为一个更大的挑战。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此论坛网页出现消息、未显示最后一个帖子、甚至已解决、Peter 在我发布之前显示了最后一个帖子。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    TivaWare ROM_functions 是否也固定在与矢量表类似的某个地址? 或者、在编程时、driverlib.lib 是否会将它们加载到只读地址中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ROM_functions 位于 ROM 中的固定地址。 当生成新版本的器件并修复错误时、它们使用 ROM 开头的指针表来支持兼容性。 在器件版本之间、如果在 ROM_FUNCTION 中发现错误、则应使用函数的驱动程序库版本。 要使其自动执行、请调用函数的 MAP_版本。 除非驱动程序库中存在相同函数的固定版本、否则将使用 ROM_VERSION。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Bob Crosby"]除非驱动程序库中存在相同函数的固定版本,否则将使用 ROM_version。

    我们是否可以问: "MAP_VERSION -如何知道或检测到- ROM_FUNCTION 中存在错误-以及(然后)获取驱动程序库函数?   假定-某些"指示符"标记(指定的)驱动程序库(等效)函数-这会阻止(镜像的) ROM 函数被部署。   这是否接近/正确?

    如果这"证明情况"-这可能会启用"快速/脏"对比/执行比较-(正确) ROM 函数与闪存...

    感谢您抽出宝贵的时间给予关注。

    [编辑] 产生这样的"对比/比较"、 即"Rom 调用与驱动程序库调用"-可通过 "rom"的"使用/不使用"轻松实现-在 driverlib 函数名称之前。    额...

    我们仍有兴趣了解(假设)驱动程序库函数(即具有 ROM 的超时函数)是否被识别和触发、以及如何识别和触发。    (s'il vous plaît……)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bob、很高兴知道 DriverLib 包含与 ROM 相同的 API 集(或更新版本)、您知道我在哪里可以找到 ROM API 的实现吗?

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

    尊敬的 Bob:

    令人 感到非常振奋 的是、人们相信  添加到 Tivaware 库函数中的编译 ROM 调用正在  EEROM 中复制、而不是从 闪存中执行。 我们认为 MCU 以某种方式将指针或代码移动到 EEROM 中。  

    它必须执行类似的操作 、因为我更改  了编译后的驱动程序库中缺少的 Tivaware GPIO AHB 端口定义、它们从 ROM 中工作。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    问得好。 我应该更完整地解释一下。

    如果在 ROM 函数中发现错误、该函数将在 TivaWare 驱动程序库的下一版本中修复。 该库包含头文件 ROM_MAP.h 如果 ROM 函数正常、它会将"MAP_xxxx"重新定义为"ROM_xxx"。 如果 ROM 函数应该被替换、它将"MAP_xxx"定义为"xxx"、这会导致函数从 driverlib.lib 中被拉取并被放置在闪存存储器中。

    更详细一点、随 TivaWare 分发的"rom.h"文件定义了我们认为良好的所有 ROM 函数。 为了获得用更新的驱动程序库函数自动替换 BRARY ROM 函数的好处、请使用"map_"前缀并在"rom_map.h"后添加第一个"rom.h"。"rom_map.h"实际上使用"rom.h"中的定义来确定函数的 ROM 版本是否正常。

    现在、为了自动将所有基于 ROM 的函数切换到函数的驱动程序库版本、只需注释掉"rom.h"。 头文件"rom_map.h"未定义 ROM 函数名称、因此它使用使用 map_prefix 编码的每个函数的驱动程序库版本。

    现在、当 TivaWare 的新版本发布时、您可能不希望自动(或更具体地说、您不知道)更新某些工程的功能。 如果您使用 ROM_PREFIX、但包含新版本的"rom.h"、则如果新库中的 ROM 函数已弃用、则会出现链接错误。 然后、您可以检查发行说明以确定 ROM 版本被弃用的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、
    所有基于 ROM 的有效函数的源代码都包含在 TivaWare 库中。 例如、ROM_SysCtlPeripheralEnable()的源位于文件"C:\ti\TivaWare_C_Series-2.1.4.178\driverlib\sysctl.c"中、从845行开始。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 BP101:
    将从 ROM 中执行对带有"ROM_"前缀的库函数的调用。 对不带"ROM_"或"MAP_"前缀的库函数的调用将加载到闪存中。 除非 TivaWare 中弃用了 ROM 版本、否则将从 ROM 中调用带有"map_"前缀的库函数。 在这种情况下、它将从闪存运行。

    在您的情况下、端口定义的校正可能已修改传递给 ROM 函数的参数、从而使其正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Bob、

    在我的(最棒的)猫王... "谢谢-非常感谢!" (在本例中-我的感谢是真的!)

    真的是一个"超越/超越"的回答-描述得很好且详细-非常感谢。

    我(假设)对"检测/校正机制"(即嵌入单个(骑行)驱动程序库函数中)的理解(再次)为"偏离标记"。    您提供的"rom.h"(和朋友)方法因"更快/更轻松的实施"而变得卓越。   (即"一站式"搜索!)

    这种深思熟虑的"纠正机制"----特别是在采用"用户易用性"的情况下----证明是非常值得赞扬的!

    再次感谢您的出色响应-希望能为"许多人"带来好处。

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

    解释了 Snowflake GPIO 更改(gpio.c/hw_memmap.h)的原因、然后允许访问 MCU 嵌入式 ROM 调用高于 K 的 GPIO 端口。怀疑 ROM/map 调用的好处是闪存存储器要求降低了两倍、并且闪存存储器位单元上的读取周期更少、尤其是在 SW 循环中。

    我们如何知道相对于当前 Tivaware SW 驱动程序库版本、MCU 嵌入式库版本可能是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Bob 的回复。 我也很喜欢你对 CB1的答复,这是一个非常有益的答复。

    谢谢

    Richard