Tôi gặp sự cố khi nhận giá trị từ địa chỉ ram.
Tôi có một số hạn chế, đó là nó phải là mã C và địa chỉ nơi lưu trữ thông tin được cung cấp bởi giá trị u32, ví dụ 0x001c0080.
Môi trường là ARM và tôi sử dụng sdk nhật thực. Làm cách nào tôi có thể lấy dữ liệu từ địa chỉ này? Tôi có một chức năng không thể thay đổi như thế này:
u32 get_data(địa chỉ u32, trạng thái u16 *)
{
......
u32 return_value;
char cbuf[128];
return_value= địa chỉ ?????;
sprintf(cbuf,"\tA:%x->%x",(int)address,(int)return_value);
in(cbuf);
return return_value; // ở đây dữ liệu u32 được lưu trong ram theo địa chỉ sẽ được trả về
}
Bạn có thể chuyển đổi địa chỉ thành con trỏ.
return_value = *(u32 *) địa chỉ;
Ngoài ra, nên sử dụng
chứ không phải là một loại tùy chỉnh. Mã của bạn có thể trông như thế này:
#include
#include
uint32_t get_data(địa chỉ uint32_t, uint16_t *trạng thái)
{
//…
uint32_t return_value;
char cbuf[128];
return_value = *(uint32_t *) địa chỉ;
sprintf(cbuf, "\tA:%x->%x", địa chỉ (int), (int) return_value);
printf(cbuf);
trả về return_value;
}
Hãy cẩn thận! Sớm hay muộn, dự án của bạn có thể được chuyển sang CPU 64-bit. Mã của bạn sẽ không thể di chuyển được.Truyền địa chỉ dưới dạng số nguyên thay vì con trỏ là một ý tưởng tồi và thậm chí còn tệ hơn khi giả sử kích thước con trỏ. bạn nên kiểm tra get_data()
Hàm môi trường được gọi để đảm bảo rằng địa chỉ có thể được truyền dưới dạng con trỏ. Nếu địa chỉ phải được chuyển dưới dạng giá trị nguyên chứ không phải con trỏ, hãy sử dụng uintptr_t
Thay vào đó, nó sẽ tự động trở thành kích thước chính xác.
Ngoài ra, định dạng của bạn không cần phải chuyển đổi. Bạn có thể sử dụng
format để tránh chuyển đổi đối số chuỗi định dạng.
Ví dụ: cuộc gọi của bạn làgọi_get_data
và địa chỉ0x001c0080
Macro từ các tập tin tiêu đề.
#include // Tiêu đề xác định ĐỊA CHỈ là 0x001c0080 thông qua #define ĐỊA CHỈ 0x001c0080
#include
#include
#include
uint32_t get_data(uint32_t *địa chỉ, uint16_t *trạng thái)
{
//…
uint32_t return_value;
char cbuf[128];
return_value = *địa chỉ;
sprintf(cbuf, "\tA:" PRIxPTR "->" PRIx32, địa chỉ, return_value);
printf(cbuf);
trả về return_value;
}
void call_get_data(void)
{
uint32_t addressValue = ĐỊA CHỈ;
uint32_t *địa chỉ = (uint32_t *) addressValue;
//…
uint32_t returnValue = get_data(địa chỉ, /* … */);
//…
}
Lưu ý: Môi trường là ARM, không thành vấn đề nếu bạn sử dụng Eclipse SDK.
Tôi là một lập trình viên xuất sắc, rất giỏi!