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.

[参考译文] MSP430F2274:使用`#pragma LOCATION`后更改数组值的存储器地址

Guru**** 2553260 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/703353/msp430f2274-changing-the-memory-address-of-an-array-value-after-using-pragma-location

器件型号:MSP430F2274

因此、在我设置的代码中、我担心的部分是容纳两个128字节数组。 为了将它们放置在特定的 RAM 部分(称作".ram_data")中、我使用了`#pragma 位置`并使用`memset`设置它们的内容。 接下来、我要将数据从一个数组复制到另一个数组、这可以通过`memcpy`来完成、但随后将初始数据数组移动到`.ram_data`段中的新位置。 当程序中已使用 LOCATION pragma 时、是否可以执行此操作? 我`的另一个选项是使用`` pragma DATA_SECTION`、但随后我遇到了一些问题、其中`.bss`段的大小不够大、即使我没有将数组放置在`.bss`段中、而是我创建的.ram_data 段中。

通过使用#pragma 指令设置数据数组后如何更改其存储器地址、可以总结我的问题。 下面列出了我的代码的一部分。 谢谢!

#include 
#include 
#include 
#include "ram_data_ccs_mem.h"

#define INTERRUPT_VALUE 0x0A //中断计数器(计算请见上面)
#define array_step 0x80 //增加/减少数据移动(128字节)
#define array_size 0x80 //数据大小(128字节)


//函数声明*/
void configWDT (void); //停止看门狗计时
器 void configClocks(void); //选择 ACLK/8作为频率
空 CONFIGGPIO (空); //禁用/启用 GPIO 引脚
void configTimerA (void); //为中断计数器
uint32_t * memory_copy (uint32_t *、uint32_t *、char)配置 TimerA;//在 RAM 周围移动数据并清除以前的位置


//全局变量*/
静态易失性 unsigned char toggle_LED; //切换红色 LED (用于调试)
静态易失性无符号短整型 intr_flg; //计数 TimerA 的中断数

//强制处理器将数据数组放置在 RAM 中*//
#pragma DATA_SECTION (dest_loc、".ram_data")
//curch_loc[128]; // RAM 中数组的当前位置
// char dest_loc[128]; // RAM 中针对数组

#pragma LOCATION (cur_loc、0x220)
char cur_loc[128]的下一个内存位置;

#pragma LOCATION (dest_loc、0x2A0)
char dest_loc[128];


int main (void)
{
/*初始化全局变量*/
TOGGLE_LED = 0;
INP_Flg = 0;
//static char reverse_dataaflow = 0;

/*配置处理器的看门狗计时器、时钟、GPIO 引脚和 TimerA */
configWDT();
configClocks();
configGPIO();
configTimerA();

/*初始化要在整个 RAM 中移动的数据数组*/
int dest = RAM_DATA_START_ADDR + array_step; //起始位置是可用 RAM 的起始位置
memset (cur_loc、'#'、array_size); //用任意数据填充存储器(用于调试)
memset (dest_loc、'\0'、RAM_DATA_END_ADDR - RAM_DATA_START_ADDR + array_step);//清除剩余的 RAM_DATA sapce
__no_operation(); //(用于调试)


。} 

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

    [引用 user="Sean Kramer"]然后将初始数据数组移动到`.ram_data`部分的新位置

    这很不寻常。  C 语言本身不支持它。

    在这一点上,我怀疑在执行的低层次细节方面继续考虑这一点没有什么帮助。  考虑到这一点、请描述您想要解决的首要问题。  尽可能多地忽略解决方法的细节。

    谢谢、此致、

    乔治

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

    该项目要求我将数据阵列或"密钥"放入 RAM、并每24小时移动到 RAM 中的随机位置一次。  

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

    此"密钥"数据数组不能随时分配给静态地址。  也就是说、它不能是一个全局函数、甚至是一个静态函数。  需要一个指针,类似于...

    int *key_data; 

    此指针将包含关键数据数组的地址。  根据需要、分配一个新数组、并将旧数组中的数据复制到新数组中。

    作为初始实现、请考虑使用 malloc。  呼叫看起来类似于...

    key_data = malloc (sizeof (int)* number_of_elements);
    if (key_data = NULL){//处理内存不足错误*} 

    由于 malloc 可能不够随机、因此必须用一个自定义解决方案来替换它、该解决方案以类似的方式返回合适存储器位置的地址。

    谢谢、此致、

    乔治