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.

[参考译文] MSP430F5638:MSP430-F5638-IPZ -全局数组大小太大、并且可以't 访问调试器中没有断点的全局数组

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1170600/msp430f5638-msp430-f5638-ipz---global-array-size-too-large-and-can-t-access-global-arrays-in-debugger-without-a-breakpoint

器件型号:MSP430F5638

// MSP430-F5638-IPZ 上运行的工作应用程序的通用框架代码
// CCS v.10.4.0.00006
//整个程序大约有23,000行代码和22个文件
// ISR = RTC_B、在 P3.0至 P3.6上切换-所有 ISR 正常工作

// 2个问题/问题
//   当前定义的1个数组对于 MCU 内存太大
//   如何正确调整和存储大型全局数据数组?
//   错误编号10099-D
//   程序不能放入可用内存中,或者该段包含一个需要 trampoline 的调用站点,该调用站点不能为该段生成 trampoline。 ".bss"大小为0xd460时、运行定位失败。
//   可用内存范围:lnk_msp430f5638.cmd /DC2-430-all-01第139行 C/C++问题

//#2如果我在无限时间内放置一个断点、我可以查看调试器中的数组并查看数据是否正确加载
//   如果我删除断点并全速运行,我在数组中看不到任何内容,也没有对它们的访问权限
//   CCS 调试器仅显示??? 对于数据、显示了打开单个单元格
//   无法读取0x02C70:执行状态阻止访问
//   无法读取0x02C72:执行状态阻止访问

//调整数据日志数组的大小
//如果四个类似的数组(我需要的)的值为2700,则会出现上面列出的内存错误
//如有必要,可以在更少的时间步长记录数据,但更喜欢更高的保真度
//#define DATA_LOG 2700    //内存过大错误
#define DATA_LOG 180       //内存正常  

//单个全局数组,还需要相同大小的三个以上的数组,它们都是数据与时间的关系
//需要从其他文件访问
unsigned int data_profile[data_log][2];

void main (void)

  //设置 TI MSP430-F5638-IPZ
  // RTC_B ISR 生成一个2Hz 中断
  //开关在按下时生成中断
  LOOP_COUNT = 0;

  //无限循环
  while (1)
  {
    //从虚拟数据与当前时间配置文件生成数据
    DATA_PROFILE[LOOP_COUNT][0]= DATA_TIME;
    DATA_PROFILE[LOOP_COUNT][1]= DATA_VALUE;

    //更新循环计数器
    LOOP_COUNT++;

    //进入低功耗模式,设置 LPM3 + GIE 部分
    // 2秒 RTC_B ISR 唤醒 CPU、恢复 AM (激活模式)并在 main 中无限次恢复
    _bis_SR_register (LPM3_bits + GIE);
    }

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

    尊敬的 Ted:

    问题1: 如何正确调整和存储大型全局数据数组?

    A1:您可以在资源文件夹中定义存储器映射、找到并打开:link_msp430f5638.cmd 文件、然后您可以为大型数组定义扇区大小。

    Q2:如果我删除断点、并以全速运行、我无法在数组中看到任何内容、也无法访问它们

    答2:是的、你是对的。 我知道、在调试模式下、在运行期间无法访问 MSP430。 它仅命中断点、将挂起并更新数据。 这取决于编译器、如果您需要更多详细信息、可以访问此 e2e 论坛并获取支持: https://e2e.ti.com/support/tools/code-composer-studio-group/ 

    此致

    SAL

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

    您好 Sal、

    感谢您的回答。 在 Q2上、这只是编译器调试器的一个限制。 我打开了 lnk_msp430f5638.cmd 文件并看到第139行、还查看了 CCS UG v26.6.0.LTS 中的 Ch 4 Linking C/C++ Code、并且未看到任何有关设置大型阵列大小的信息。 如何以及在何处将其放入 lnk cmd 文件中?

    TED

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

    正如我在阅读数据表(SLAS650G)表6-1时所看到的、F5638只有16KB (+2KB)的 SRAM。 4个这样的数组(行数2700)将占用2700*2*sizeof (unsigned)*4-array=43200字节。 我看不到一种使这些都合适的方法。

    失败消息提示您需要(至少) 0xd640字节的 SRAM。 减去0xd460-43200、有大约11KB 的"其他"变量(不是这些4x 数组的一部分)。 这会将最大行数减少到(16KB-11KB)/4/2/2=326、但会忽略堆栈/堆和.data。

    您有相当多(256KB)的闪存、但写入闪存比您显示的代码复杂得多。

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

    感谢 Bruce 的回答。 请确认、是否在 lnk_msp430f5638.cmd 文件中未设置任何内容? 这是一个数学问题、因为我对有多少传感器 x 采样率 x 采样时间周期过于雄心勃勃。 我必须重新调整数据记录、使其适合。

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

    我能想到的唯一原因是、如果将 SRAM 拆分为不相邻的部分、但根据数据表[表9-4]、我认为 F5638的情况并非如此。  

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

    谢谢、我将解决该问题