c - 当 ram 地址存储为 u32 时从 ram 内存中获取值
问题描述
我在从 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
}
解决方案
您可以将地址转换为指针。
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
改用它,它将自动成为正确的大小。
此外,您的格式不应该需要演员表。您可以使用格式 from<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 没关系。
推荐阅读
- python - Tensorflow 环境在 python 中工作,但是当我将它转换为 tf 环境时,step 函数什么也不做
- python - 任务之间的异步等待
- c - c语言中使用指针的REVERSE_WORD
- android - 基于主题的 Google Play 图标
- swift - 有没有办法在不指定文件类型的情况下设置 AVPlayer?
- sql - SQL Server:按组的计数和百分比
- grails - 使用 Grails、GORM 和 neo4j 的关系类进行自引用多对多
- amazon-web-services - Terraform 参数块作为地图列表
- sql - 在断电的情况下,如何在事务系统中保持一致性?
- c++ - 如果算法 std::mismatch 的两个范围的大小不同会产生未定义的行为?