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:如何验证这个数据是否被存储在 RAM 中而不是闪存/FRAM 中?

Guru**** 2533390 points
Other Parts Discussed in Thread: MSP430F2274

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/703421/compiler-msp430f2274-how-to-verify-that-this-data-is-being-stored-in-ram-and-not-flash-fram

器件型号:MSP430F2274

工具/软件:TI C/C++编译器

调试以下代码时、"Expressions"视图显示指针变量`cur_loc`和`dest_loc`存储在值0x236和0x238上、分别为0x240和0x2C0。 这应该与链接器文件的 RAM 部分相对应、因为 MSP430F2274的 RAM 空间为0x200至0x5FF。 虽然在将程序下载到器件后查看控制台输出时、它表示闪存/FRAM 的使用量为1016字节、RAM 的使用量为37字节。 是否有办法验证指针变量(及其各自的值)是否保存在 RAM 中而不是闪存/FRAM 中? 如果这些值包含在 RAM 中、为什么在考虑额外的两个指针变量时、RAM 使用量不会增加它们分配给的字节数? 谢谢你。

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

#define INTERRUPT_VALUE 0x32 //中断计数器(计算请见上面)
#define array_data 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


int main (void)
{的中断数进行计数
/*初始化全局变量*/
TOGGLE_LED = 0;
INP_Flg = 0;
静态 char reverse_dataaflow = 0;


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

/*初始化要在整个 RAM 中移动的数据数组*/
int dest = RAM_DATA_START_ADDR; //起始位置是可用 RAM 的起始位置
uint32_t * cur_loc =(void *) dest; //指向 RAM 中初始位置的指针(dest)
memset (cur_loc、"X"、array_data); //用任意数据填充存储器(用于调试)
dest += array_data; //数据的下一个存储器位置距离起始位置128字节)
uint32_t * dest_loc =(void *) dest; //指向 RAM 中下一个内存位置的指针
memset (dest_loc、'\0'、RAM_DATA_END_ADDR - RAM_DATA_START_ADDR + array_data);//清除剩余的 RAM_DATA sapce
__no_operation(); //(用于调试)


/*
*在程序的持续时间内保持在此循环中
*>进入低功耗模式、直至通过中断数
*>退出低功耗模式、将数据移动到 RAM 中的新位置
*>重新进入低功耗模式
*
while (1)
{
_bis_SR_register (LPM3_bits + GIE); //进入 LPM3
if (toggle_LED)
{
P1OUT ^= BIT0;
if (!reverse_dataaflow) //将数据移动到更高的存储器地址
{
dest += array_data; //按数据大小增加 RAM 中的新内存位置
if (RAM_DATA_START_ADDR <= dest && dest <= RAM_DATA_END_ADDR) //检查下一个内存位置是否在 RAM 数据空间的范围内
{
CUR_loc = memory_copy (dest_loc、cur_loc、reverse_dataflow); //将内存从当前位置复制到新位置
dest_loc =(void *) dest; //新内存位置是当前位置+数据大小(128字节)
__no_operation(); //(用于调试)
}
否则、如果(dest >= RAM_DATA_END_ADDR){ //下一个内存位置在可用 RAM 空间的上方
dest -= array_data * 2; //将新目标递减到当前位置以下128个字节
Revele_dataaflow = 1; //通过 RAM 反向移动数据(用于调试)
__no_operation(); //(用于调试)
}
}
其他
{
dest -= array_data; //按数据大小减少 RAM 中的新内存位置
if (RAM_DATA_START_ADDR <= dest && dest <= RAM_DATA_END_ADDR) //检查下一个内存位置是否在 RAM 数据空间的范围内
{
dest_loc =(void *) dest; //新内存位置是当前位置-数据大小(128字节)
CUR_loc = memory_copy (dest_loc、cur_loc、reverse_dataflow); //将内存从当前位置复制到新位置
__no_operation(); //(用于调试)
}
否则、如果(dest <= RAM_DATA_START_ADDR) //下一个内存位置低于可用 RAM 空间
{
dest += array_data * 2;
dest_loc =(void *) dest;
REVERY_DATaflow = 0; //通过 RAM 反向移动数据(用于调试)
__no_operation(); //(用于调试)
}
}

}

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

    变量 cur_loc 和 dest_loc 是函数 main 中的局部变量。  局部变量在函数启动时在栈上动态分配空间。  同样、当函数结束时、它们会被取消分配。  cur_loc 和 dest_loc 的地址在分配给堆栈的内存范围内。

    谢谢、此致、

    乔治

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

    这些存储在堆栈上、堆栈是 RAM 的一部分。 因此、假设这些存储在 RAM 中、我是否错误? 如果它们不是、我如何强制它们进入 RAM? 我已经尝试使用 LOCATION 和 DATA_SECTION pragma 指令、但无法像在上面列出的代码中那样更改这些值。

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

    函数的局部变量始终在栈上动态分配位置。  没有办法改变这种情况。  如果要控制它们在存储器中的位置、则应考虑将它们设置为全局或静态。

    谢谢、此致、

    乔治