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/MSP430FR5994:将 Array [100]设置为绝对 FRAM 存储器

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/909936/ccs-msp430fr5994-setting-an-array-100-into-absolute-fram-memory

器件型号:MSP430FR5994

工具/软件:Code Composer Studio

我将从 IAR 迁移到 CCS 版本10、并尝试在地址0x20000的 FRAM 中放置一个100字节的阵列

在 IAR 中、我将执行以下操作:

_no_init uint8_t CONFIG_BUFFER[100]@ 0x20000; 

如何使用 CCS 实现这一点。 我尝试过:
#pragma LOCATION = 0x20000
uint8_t CONFIG_BUFFER[100];

我得到以下结果:

"./source/main.c、第112行:警告#17003-D:从函数"main"重定位到符号"config_buffer"溢出;18位重定位地址0x20000太大、无法在16位字段中进行编码(类型='R_MSP430X_ABS16'(15)、文件="./source/main.obj "、偏移= 0x00000044、部分=".main")

如何修改 C 代码或 lnk_msp430fr5994.cmd 文件?

谢谢、

-Jim

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

    我尝试过的时候

    #pragma NOINIT (CONFIG_BUFFER)
    #pragma LOCATION (CONFIG_BUFFER、0x20000)
    >uint8_t CONFIG_BUFFER[100];

    我还必须设置--near_data=none ("build Settings->CCS build->Compiler->Processor Options")以避免该错误。

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

    非常感谢您的帮助。 如果没有您的输入,我就无法完成。 我已经查看了 Code Composer V10.x,它似乎只是在线版本,而不是 PDF 版本,我已经检查了“TI 链接器命令文件入门”,我已经检查了“高级链接器技术以方便高效地使用内存(AP 注释 SPRAA46A Dec2008)”, 我已经检查了用于 MSP430的 CCS IDE v10.x–SLAU157AS,但我找不到您提供的信息。 这种问题看起来很基本、作为一个新手 CCS 用户、我觉得很愚蠢、我可以找到这个问题。 如果它在这些文档中、我找不到信息。 您在哪里可以找到它? 无论如何、谢谢。

    关于错误消息、您知道如何将 MSP 编译器->处理器选项->(--near_data)更改为无? 为什么这很重要?

     

    但我的下一个问题是,我正在尝试将缓冲区初始化为 for 循环中的所有零-我附加屏幕快照,以拍摄从0xFF 到0x0的内存。 请您或其他人帮助我解释原因。

    要初始化的循环:

     

    存储器

    请注意、索引为5、前5个存储器地址应该已经被初始化。

    谢谢、Jim

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

    [引用 user="Jim Patten2">但我的下一个问题是,我尝试将缓冲区初始化为循环中的所有零-我附加屏幕快照以拍摄内存从0xFF 变为0x0。 MSP430FR5994具有 MPU (内存保护单元) 这允许为 FRAM 的段提供不同的权限、例如受写保护。 其目的是保护程序不受 FRAM 中包含只读数据(例如代码中的数据)变化的影响。

    创建新工程时、默认情况下启用 MPU、编译器会处理存储器分区:

    启用 MPU 并由编译  器处理存储器分区后、我认为可能会发生的情况是、位于固定位置的 CONFIG_BUFFER 最终位于只读存储器段中、因为编译器/链接器尚未处理 CONFIG_BUFFER 的放置。

    如果在项目中启用了 MPU、您是否可以尝试禁用它以查看正在运行的程序是否可以修改 CONFIG_BUFFER?

    编辑:这只是为了查看 MPU 是否是问题的原因;我还没有考虑如何使 MPU 保持启用状态以连接只读 FRAM 内容、同时允许对配置数据进行写入访问。

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

    [引用 user="Jim Patten2">关于错误消息,您如何知道如何将 MSP 编译器->处理器选项->(--near_data)更改为无? 为什么这很重要?不确定是否看到过它、但  《MSP430优化 C/C++编译器 v20.2.0.LTS 用户指南 》中的第6.1.2节"数据存储器模型"解释了数据指针可以是16位或32位。 在 地址 0x20000处配置缓冲区时、需要一个32位数据指针来访问 CONFIG_BUFFER。

    这就是您的第一个帖子中有点隐秘的"18位重定位地址0x20000太大、无法在16位字段中编码"错误消息的含义。

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

    这就是诀窍! 只需添加一点、是否有方法更改或使用链接器文件将 conf_buffer[100]放置在0x20000位置、而不是在 C 代码中使用#pragma 语句?

    感谢你的所有帮助。 你们太棒了!

    -Jim

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

    是否可以在链接器文件而不是 C 代码中执行此操作?

    谢谢、

    -Jim

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

    [引用 user="Jim Patten2"]是否有方法可以更改或使用链接器文件将 conf_buffer[100]放置在0x20000位置

    请参阅文章 链接器命令文件入门。  通读上半部分。  子章 节将输出段分配到存储器 中有两个示例、说明如何将输出段分配到硬编码地址。

    谢谢、此致、

    乔治

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

    谢谢 George。 但是、该手册不是为尝试学习 CCS 链接器语法的人员编写的、而是为已经了解 CCS 链接器工作原理的人员编写的。

    我的观点是、有人首次进入 CCS 并使用 IAR 多年。 IAR 具有非常好的文档和很好的示例。

    目前、我正在尝试使用 JTAG Signature1和 Signature2锁定 JTAG。

    下面是我在 IAR 中执行它的方式。 您能否指导我 CCS 的工作原理?

    C 代码文件:

    const uint16_t JTAG_signature1 @"JTAG_SIGNATURE1"= 0xAAAA;
    const uint16_t JTAG_signature2 @"JTAG_SIGNATURE2"= 0x0004;
    const uint64_t JTAG_password @"JTAG_password"= 0x0123456789abcdef;
    //--- 有关如何使用 JTAG 的说明用密码锁定:
    // 88=ef、89=CD --> 8D=45、8F=01 IAR JTAG PW:0xcdef89ab45670123
    // cdef | 89ab | 4567 | 0123
    // 8988 | 8B8A | 8D8C | 8F8E <- FF88 - FF8F 

    #pragma required=JTAG_signature1
    #pragma required=JTAG_signature2
    #pragma required=JTAG_password
    

    此致、
    -Jim



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

    让我来回答我自己的问题:这是您在 CCS 中执行它的方法

    #pragma RETAIN (JTAG_signature)
    #pragma DATA_SECTION (JTAG_signature、".jtagsignature")
    const uint16_t JTAG_signature[]={0xAAAA、0x0004};
    

    #pragma RETAIN (JTAG_PASSWORD)
    #pragma DATA_SECTION (JTAG_PASSWORD、".jtagpassword")
    const uint8_t JTAG_password[]={0xEF、0xCD、0xAB、0x89、0x67、 0x45、0x23、0x01};
    //JTAG PW:0xcdef89ab45670123
    
    将 JTAG PW 放入: