【发布时间】:2013-12-04 20:43:23
【问题描述】:
我正在编写一个基于 Altera 软处理器的应用程序。 API 提供对 VHDL 中定义的寄存器的访问,如下所示。
#define __IO_CALC_ADDRESS_DYNAMIC(BASE, OFFSET) \
((void *)(((alt_u8*)BASE) + (OFFSET)))
#define IOWR_32DIRECT(BASE, OFFSET, DATA) \
__builtin_stwio (__IO_CALC_ADDRESS_DYNAMIC ((BASE), (OFFSET)), (DATA))
根据我在编写与硬件或寄存器直接接口的代码方面所学到的一切,我编写了这样的代码,
typedef uint8_t volatile reg; /* special type to access registers */
typedef struct reg_one /* access to base and offsets */
{
reg data_0; /* first 8 bits */
reg data_1; /* second 8 bits */
.
.
} reg_one;
static reg_one *const reg_ptr = (reg_one *)SOME_BASE_ADDRESS;
uint32_t data;
data = 0;
__builtin_stwio(&(reg_ptr->data_0), data);
但是,地址被转换为 void * 并且 volatile 和 const 限定符被立即丢弃。有没有办法解决这个问题,还是我只是缺少一些简单的东西?
我了解使用宏定义指针是一种选择,
#define reg_ptr ((reg_one *)SOME_ADDRESS)
但我更喜欢使用常量对象作为范围和类型。
提前感谢您的帮助!
【问题讨论】: