从ram地址获取值时遇到问题。
我有一些限制,即它必须是C代码,并且所存储信息的地址由u32值(例如0x001c0080)给出。
该环境适用于ARM,我使用Eclipse SDK。 如何从该地址获取数据? 我有一个功能,无法更改,例如:
u32 get_data(u32 address, u16 *status)
{
......
u32 return_value ;
char cbuf[128];
return_value= ????? address ?????;
sprintf(cbuf,"\tA:%x->%x",(int)address,(int)return_value);
print (cbuf);
return return_value; //here the u32 data stored in ram on address should be returned
}
答案 0 :(得分:2)
您可以将地址转换为指针。
return_value = *(u32 *) address;
此外,建议使用<stdint.h>
代替自定义类型。您的代码可能如下所示:
#include <stdint.h>
#include <stdio.h>
uint32_t get_data(uint32_t address, uint16_t *status)
{
// …
uint32_t return_value;
char cbuf[128];
return_value = *(uint32_t *) address;
sprintf(cbuf, "\tA:%x->%x", (int) address, (int) return_value);
printf(cbuf);
return return_value;
}
被警告!迟早,您的项目可能会迁移到64位CPU。 您的代码将不可移植。将地址作为整数而不是指针传递是一个坏主意,并且在假设指针大小的情况下甚至更糟。您应该检查get_data()
函数的调用环境,以确保可以将地址作为指针传递。如果必须将地址作为整数值而不是指针进行传递,请改用uintptr_t
,它将自动为正确的大小。
此外,您的格式不需要强制转换。您可以使用<inttypes.h>
中的格式来避免强制转换格式字符串参数。
说,您的呼叫者是call_get_data
,地址0x001c0080
来自头文件中的宏。
#include <foo.h> // Header which defines ADDRESS to be 0x001c0080 via #define ADDRESS 0x001c0080
#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>
uint32_t get_data(uint32_t *address, uint16_t *status)
{
// …
uint32_t return_value;
char cbuf[128];
return_value = *address;
sprintf(cbuf, "\tA:" PRIxPTR "->" PRIx32, address, return_value);
printf(cbuf);
return return_value;
}
void call_get_data(void)
{
uint32_t addressValue = ADDRESS;
uint32_t *address = (uint32_t *) addressValue;
// …
uint32_t returnValue = get_data(address, /* … */);
// …
}
注意:环境适用于ARM,并且您使用Eclipse SDK没关系。
答案 1 :(得分:0)
您可以将u32 address
“类型转换”为所需类型的指针:
char *ptr = (char *)address;
sprint(cbuf, "\tC:%c", *ptr);
或
u32 *ptr = (u32 *)address;
return_value = *ptr;
答案 2 :(得分:0)
问题解决了, u32 * ptr =(u32 *)地址; return_value = * ptr; 工作正常。