工具/软件: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(); //(用于调试) } } }