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.

[参考译文] 编译器/MSP430FR5959:MPU 无标准配置部分

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/599699/compiler-msp430fr5959-mpu-no-standart-configure-section

器件型号:MSP430FR5959

工具/软件: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、

    感谢您发帖。 我将对此进行研究、但我想确保我理解您的问题。 您似乎已经修改了链接器文件、将 MPU 段的顺序更改为只读、然后是读取+执行、再是读取+写入。 您是否在使该配置正常工作时遇到问题? 或者、您是否在问为什么不将此顺序用作我们为器件提供的默认链接器配置?

    此致、
    Katie
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    配置中出现问题。
    MPU -仅3部分
    我将 FRAM2 (重命名为 DATA2)用于取消发送数据包缓冲区- RW 区域、默认情况下用于 const 和只读。
    函数__data20_write_char ()未写入此区域。
    如果禁用 MPU -功能正常-我认为更改了段顺序-删除了 RW 段并将 FRAM2设置为 RW
    我的创意订单部分:
    1个部分- RO:const (FRAM)
    2部分- RX:代码(FRAM)
    3段- RW:数据(FRAM)和大阵列(FRAM2)
    1变体-在 GUI 边框中手动选择-不自动重新计算:(((
    2变体-将 FRAM 剪切为2个区域,并将 RO 移到第一个部分和其他部分-不自动重新计算:(
    3变体-更改链接器 CMD -如果可行、最好是使用-自动重新计算器
    我在互联网上读了所有链接,但我不需要:((
    写入许多型号的 CMD、而不是将常量段添加到 FRAM 中
    所有变体中的常量段 CMD 移至 FRAM 末尾并忽略 CMD
    帮助我获取需要订购的命令部分/
    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    2变体不起作用
    切断 FRAM
    FRAMRO:origin = 0x4400,length = 0x1000
    FRAM:origin = 0x5400、length = 0xAB80
    并将 GROUP (READ_ONLY _MEMORY)移动到 FRAMRO
    结果-无链接、无复杂文件
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    .const :{}> FRAM /*常量数据 *
    .cinit :{}> FRAM /*初始化表 *
    .pinit :{}> FRAM /* C++构造函数表 *
    init_array:{}> FRAM /* C++构造函数表 *
    .mspabi.exidx:{}> FRAM /* C++构造函数表 *
    .mspabi.extab:{}> FRAM /* C++构造函数表 *

    不像此部分移动到任何组

    决定一-如果使用对 FRAM2的读/写操作,则将来禁用 MPU?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Alexander、

    我自己对链接器文件进行了一些修改、并附带了所附文件-请尝试此操作。

    e2e.ti.com/.../lnk_5F00_msp430fr5959_5F00_mod.cmd

    假设:

    1. 我认为您不需要 IPE、因此我将其取出
    2. 所有 FRAM2 0x10000+都用于读取+写入存储器
    3. 读取+写入存储器不需要低于0x10000的任何内容

    请告诉我、这些假设中的任何一个对于您的用例是否正确、我可以帮助进一步调整链接器文件。

    有关我必须更改的内容与您在第一个帖子中的版本的一些说明:

    1. 将 MPUSAM 值更改为0x1351以正确地将段3设置为读取+写入访问、将段2设置为读取+执行访问
    2. 将 GROUP (READ_WRITE_MEMORY)放在 FRAM2中、而不是 FRAM 中、以便将.persistent 放在上部存储器中

    在您的代码中、您可以使用以下类似方法将缓冲区放置在读取写入区域中:

    #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
    
    

    第二天进行变体测试并解决您的问题。

    非常感谢。

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

    感谢您的回复。 我对备用方法的一个担心是、这会在您写入数据的时间段内完全禁用 MPU、这可能会带来风险、因为如果指针出错、会发生意外事件、使您跳过此例程等 在此期间、您的代码完全不受保护、您最终可能会覆盖您的应用程序代码、从而破坏您的功能。 希望如果您能够尝试我提供的链接器文件、它将帮助您解决该问题、因此您不必这样做。

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

    配置出现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