主题中讨论的其他部件:MSP430FR2476
您好,
我在使用大型代码和数据模型时看到了一些使用指针操作的问题。 例如,memcpy实际上不起作用。 如果将指针传递到某个函数,并且在该函数中,我声明一个新指针来引用输入变量,它似乎存储在更高的地址空间中。 例如,我的原始指针位于0x2000和0x8000之间的RAM中,然后新函数中的指针位于FRAM中,例如0xe000。
这会导致指针操作出错,原始变量保持不变。 我是否可以使用其他设置来解决此问题?
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.
您好,
我在使用大型代码和数据模型时看到了一些使用指针操作的问题。 例如,memcpy实际上不起作用。 如果将指针传递到某个函数,并且在该函数中,我声明一个新指针来引用输入变量,它似乎存储在更高的地址空间中。 例如,我的原始指针位于0x2000和0x8000之间的RAM中,然后新函数中的指针位于FRAM中,例如0xe000。
这会导致指针操作出错,原始变量保持不变。 我是否可以使用其他设置来解决此问题?
当然,下面是一个发生这种情况的代码片段:
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中的数据仍然不同。 我对此的唯一解释是不同的内存位置,因为这在其他平台上也可以
我如何确保这一点?
我猜它与链接器文件的这一部分有关,但我认为此处提到的符号甚至没有定义,因此写保护不应该处于活动状态
#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
我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>