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.
工具/软件: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};