我正在尝试映射一些位置,这是我的代码示例。我想将porta和ddra声明为外部变量,以便我可以在文件之间共享它们。
typedef union _porta
{
byte REGISTER;
struct
{
unsigned PA0:1;
unsigned PA1:1;
unsigned PA2:1;
unsigned PA3:1;
unsigned PA4:1;
unsigned PA5:1;
unsigned PA6:1;
unsigned PA7:1;
};
}PORTA;
typedef union _da
{
byte REGISTER;
struct
{
unsigned DA0:1;
unsigned DA1:1;
unsigned DA2:1;
unsigned DA3:1;
unsigned DA4:1;
unsigned DA5:1;
unsigned DA6:1;
unsigned DA7:1;
};
}DDRA;
#define porta (*(( volatile PORTA *)0x22))
#define ddra ( *(( volatile DDRA *)0x21) )
// Here in the same header want to declare porta and ddra as an extern variables I can use outside
答案 0 :(得分:2)
简单地将定义和typedef放在头文件中并命名为" xxx_registers.h"或某些此类(其中xxx是您的MCU)。这就是通常如何做到的。
但是,您应该将typedef命名为DDRA_t
,然后命名为#define DDRA ... volatile DDRA_t*
。自定义总是使用大写字母表示寄存器名称。
重要说明:确保在编译器中禁用严格别名!否则这样的代码可能以可怕的方式破坏。这主要是gcc编译器的一个问题,但其他编译器可能会以类似的功能失调方式处理严格的别名。对于gcc,在编写嵌入式系统时始终使用-fno-strict-aliasing
进行编译,否则无法使用该编译器。
请注意,位字段是不可移植且危险的,因此无法保证此代码可以在其他编译器上运行。使用按位运算符来访问单个位而不是位域更好更安全。