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.
工具/软件:TI C/C++编译器
为什么在 FRAM 中不配置标准段顺序?
需求
//seg1 = const、只读
//seg2 =代码=读取+执行访问
//seg3 =任何读取+写入持久性变量
在该 CMD 中、不会影响自动计算
部分 { .TI.noinit:{}>RAM /*用于#pragma noinit * .bss :{}> RAM /*全局和静态变量 * .data :{}> RAM /*全局和静态变量 * 堆栈 :{}> RAM (high)/*软件系统堆栈 * 组(IPENCAPSULATED_MEMORY) { ipestruct :{} /* IPE 数据结构 * IPE :{} /* IPE * .IPE:_ISR :{} /* IPE ISR */ } PALIGN (0x0400)、RUN_START (FRAM_IPE_START) RUN_END (FRAM_IPE_END)> FRAM 组(只读_存储器) { .cinit :{} /*初始化表 * .pinit :{} /* C++构造函数表 * init_array :{} /* C++构造函数表 * .mspabi.exidx:{} /* C++构造函数表 * .mspabi.extab:{} /* C++构造函数表 * .const :{} /*常量数据 */ } PALIGN (0x0400)、RUN_END (fram_Rx_start)> FRAM GROUP (可执行文件存储器) { .text:_ISR :{} /*代码 ISR * .text :{} /*代码 */ } PALIGN (0x0400)、RUN_END (fram_rw_start)> FRAM 组(READ_WRITE_MEMORY) { .TI.persistent:{} 对于#pragma PERSISTENT * .cio :{} /* C I/O 缓冲器 * sysmem :{} /*动态内存分配区域*/ } PALIGN (0x0400)、RUN_START (FRAM_Rx_END)> FRAM Logger_buff :{}>DATA2 type=NOINIT jtagsignature:{}> JTAGSIGNATURE /* JTAG 签名 * bslsignature:{}> BSLSIGNATURE /* BSL 签名 * 组(signature_SHAREDMEMORY) { ipesignature:{} /* IPE 签名 * .jtagpassword:{} /* JTAG 密码 */ } > IPESIGNATURE 信息 A :{}>INFOA /* MSP430信息 FRAM 内存段*/ 信息 B :{}>INFOB .infoC :{}>INFOC 信息 D :{}>INFOD /* MSP430中断矢量 */ 。 复位 :{} >复位/* MSP430复位矢量 */ }/ ********* //* MPU/IPE 特定内存段定义 */ ********* /..... //段定义 #ifdef _MPU_manual //用于在 GUI 中选择的自定义大小 MPU_SEARD_Border1 =_MPU_SEGB1 >> 4; MPU_SEARD_Border2 =_MPU_SEGB2 >> 4; MPU_SAM_VALUE =(_MPU_SAM0 << 12)|(_MPU_SAM3 << 8)|(_MPU_SAM2 << 4)|_MPU_SAM1; #else //链接器生成的自动大小 //seg1 = const、只读 //seg2 =代码=读取+执行访问 //seg3 =任何读取+写入持久性变量 MPU_SEGM_Border1 = fRAM_Rx_START >> 4; MPU_SEGM_Border2 = fram_rw_start >> 4; MPU_SAM_VALUE = 0x1531;// Info R、Seg3 RW、Seg2 RX、Seg1 R #endif #ifdef _MPU_LOCK #ifdef _MPU_ENABLE_NMI MPU_ctl0_value = MPUPW | MPUENA | MPULOCK | MPUSEGIE; 其他 MPU_ctl0_value = MPUPW | MPUENA | MPULOCK; ENDIF #else #ifdef _MPU_ENABLE_NMI MPU_ctl0_value = MPUPW | MPUENA | MPUSEGIE; 其他 MPU_ctl0_value = MPUPW | MPUENA; #endif #endif
结果映射:
您好、Alexander、
我自己对链接器文件进行了一些修改、并附带了所附文件-请尝试此操作。
e2e.ti.com/.../lnk_5F00_msp430fr5959_5F00_mod.cmd
假设:
请告诉我、这些假设中的任何一个对于您的用例是否正确、我可以帮助进一步调整链接器文件。
有关我必须更改的内容与您在第一个帖子中的版本的一些说明:
在您的代码中、您可以使用以下类似方法将缓冲区放置在读取写入区域中:
#pragma PERSISTENT (Rx_buffer) unsigned char Rx_buffer[16000]={0};
然后、在 CCS 中的 MPU 工具中、只需将其设置为使用自动配置-使用此链接器文件、它应该会为您提供正确的边界。
请告诉我这是否对您有用、或者我是否可以做更多的事情来帮助您!
此致、
Katie
我选择其他方式
加载旧的链接器 comman 文件并启用 MPU
在函数中写入 FRAM2 I 禁用 MPU、写入阵列、启用 MPU
/***读取远缓冲区的记录***/ void writePacketBuff (unsigned int num、unsigned char* buf){ unsigned int block=(packet_LEN>>2)-1; unsigned int i=block; unsigned int k=0; unsigned char MPU_on = false; if (mpUCTL0)(mpu+up_long );unsigned mpu+ mpu+ tum_unsigned mpu20*(while)+ mpu+ mpu+ rum_unsigned mpu20+ mpu+ rk=u+ mpu+(unsigned mpu+);unsigned mpu+ mpu+ mpu+ mpu+ tu+ tu+ tu+ rk+ tu+ tu+ tu+ tu20+(unt
第二天进行变体测试并解决您的问题。
非常感谢。
配置出现104个错误
我只将 FRAM2用于数据包缓冲器(缓冲器大小100% FRAM2)
FRAM 中的其他 RW 值(包括.persistent)
问题-可提供3个部分
需要在最后一节中输入 RW 数据以增加 RW 数据区域的大小
但 const 和其他 I/O 数据编译器放置在 FRAM 的末尾、使不可用的代码创建较大的 RW 区域
您好、Alexander、
您是否说您在.persistent 中有其他数据、因此您还需要在 FRAM2和部分较低 FRAM 中进行 RW 访问? 我想我现在理解了-这将解释我的第一个版本不起作用的原因。
您是否考虑改为使用3个段、这样您有2个 R+W 段(一个用于所有 FRAM2、一个位于下部 FRAM 的开头)、然后有1个读取+执行存储器段(将常量和代码放在一起)? 在此配置中、常量仍将受到写保护、这是最重要的。
0x13FFF-------------------------------------------------------
接收缓冲器区域、R + W
0x10000 --------------------------------------------------
Code + consts、R + X
0x4800 --------------------------------
其他 FRAM 数据(.persistent)、R + W
0x4400 -------------------------------------------------------
最好 将地址保留 在之前并且包含0xFFFF 的地址保留为不可写、因为中断矢量表、JTAG 签名和复位矢量位于那里并且必须在那里(固定地址)-例如、对复位矢量的错误写入可能 会使您的代码无法正常工作。
此致、
Katie
您好、Alexander、
我修改了链接器文件以匹配此变体(使用 MPU 工具集让编译器和链接器处理它)。 附件如下:
e2e.ti.com/.../5340.lnk_5F00_msp430fr5959_5F00_mod.cmd
下面是用于测试和展示如何放置数据的 C 代码中的内容。 persistent 位于较低的 RW 区域中、而.receiveData 是我为接收缓冲区的 FRAM2段提供的名称。
const unsigned char const_data[40000]={0xAA}; #pragma DATA_SECTION (receiveBuffer、".receiveData") unsigned char receiveBuffer[16000]={0}; #pragma PERSISTENT (otherData) unsigned char otherData[1000]={0};
此致、
Katie