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.

[参考译文] LP-MSP430FR2476:将FRAM用于大型代码时出现指针问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1087851/lp-msp430fr2476-pointer-troubles-using-fram-for-large-code

部件号:LP-MSP430FR2476
主题中讨论的其他部件:MSP430FR2476

您好,

我在使用大型代码和数据模型时看到了一些使用指针操作的问题。 例如,memcpy实际上不起作用。 如果将指针传递到某个函数,并且在该函数中,我声明一个新指针来引用输入变量,它似乎存储在更高的地址空间中。 例如,我的原始指针位于0x2000和0x8000之间的RAM中,然后新函数中的指针位于FRAM中,例如0xe000。

这会导致指针操作出错,原始变量保持不变。 我是否可以使用其他设置来解决此问题?

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

    您好,Florian:

    您能否提供显示此问题的小代码示例?

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

    当然,下面是一个发生这种情况的代码片段:

    static int32_t mode_app_stop(struct v_mode *self)
    {
        struct i2c_msg_t *i2c_msg;
        struct mode_app *app;
    
        app = member_of(self, struct mode_app, mode);
        i2c_msg = to_i2cmsg(app);
    
        i2c_msg->size = 0;
        .
        . // continues here but irrelevant
        .
    }

    下面是i2c_msg->size =0后调试器值的屏幕截图。 您看不到任何更改。 新分配的指针上的memcpy操作也会发生类似情况。

    我可以肯定,这不是代码,因为它是第三方驱动程序代码,我验证了另一个具有更大连续RAM的MCU上的行为。 在那里,行为与预期一样。

    编辑:

    要在此处添加memcpy问题的示例:

    memcpy(calib->data + calib->calib_len, i2c_msg->buf, len);

    您可以看到,在执行该命令后,calib->data和i2c_msg->buf中的数据仍然不同。 我对此的唯一解释是不同的内存位置,因为这在其他平台上也可以

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

    由于编译器正在将数据放入FRAM,因此FRAM不受写保护非常重要。 或至少用于读/写数据的部分。

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

    我如何确保这一点?

    我猜它与链接器文件的这一部分有关,但我认为此处提到的符号甚至没有定义,因此写保护不应该处于活动状态

    #ifdef _FRWP_ENABLE
        __mpu_enable=1;
        start_protection_offset_address = (fram_rx_start - fram_rw_start) >> 10;
        program_fram_protection = 0x1;
        #ifdef _INFO_FRWP_ENABLE
            info_fram_protection = 0x1;
        #else
            info_fram_protection = 0x0;
        #endif
    #endif

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

    您好,Florian:

    我们已经听过您的意见了一段时间,所以我假设您能够推进您的项目。
    我会将此发布标记为已解决,但如果不是这种情况,请单击"这不能解决我的问题"按钮并回复此主题以了解更多信息。
    如果此线程已锁定,请单击"提出相关问题"按钮,并在新线程中描述您的问题的当前状态以及您可能需要帮助我们解决问题的任何其他详细信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我403.03万我想这与此文件相关,我认为此处不应该提到,但我不应该提到链接器写保护的部分,我不应该在这里提到。

     _FRWP_ENABLE和 _INFO_FRWP_ENABLE宏可由CCS定义。

    使用CCS  ,11.1 使用TI-CGT-MSP430_MSP430_MSP.0.LTS编译器为21.6 430FR2476创建了一个新项目。  在“项目属性”中的“CCS常规-> FRWP”下,启用了“启用FRAM写入保护(FRWP)"和“保护数据FRAM内存(DFWP)"选项:

    从CCS生成控制台可以看到  链接程序命令行中定义了_FRWP_ENABLE和_INFO_FRWP_ENABLE宏:

    Invoking: MSP430 Linker
    "/home/mr_halfword/ti/ccs1110/ccs/tools/compiler/ti-cgt-msp430_21.6.0.LTS/bin/cl430" -vmspx --use_hw_mpy=F5 --advice:power=all --advice:hw_config=all --define=__MSP430FR2476__ --define=_FRWP_ENABLE --define=_INFO_FRWP_ENABLE -g --printf_support=minimal --diag_warning=225 --diag_wrap=off --display_error_number --silicon_errata=CPU21 --silicon_errata=CPU22 --silicon_errata=CPU40 -z -m"MSP430FR2476_large_pointer.map" --heap_size=160 --stack_size=160 --cinit_hold_wdt=on -i"/home/mr_halfword/ti/ccs1110/ccs/ccs_base/msp430/include" -i"/home/mr_halfword/ti/ccs1110/ccs/ccs_base/msp430/lib/FR2xx" -i"/home/mr_halfword/ti/ccs1110/ccs/tools/compiler/ti-cgt-msp430_21.6.0.LTS/lib" -i"/home/mr_halfword/ti/ccs1110/ccs/tools/compiler/ti-cgt-msp430_21.6.0.LTS/include" --priority --reread_libs --define=_FRWP_ENABLE --define=_INFO_FRWP_ENABLE --diag_wrap=off --display_error_number --warn_sections --xml_link_info="MSP430FR2476_large_pointer_linkInfo.xml" --use_hw_mpy=F5 --rom_model -o "MSP430FR2476_large_pointer.out" "./main.obj" "../lnk_msp430fr2476.cmd"  -lfrwp_init.a -llibc.a 
    <Linking>