将映射地址声明为外部
Declaring mapped address as an extern
我正在尝试绘制一些位置的地图,这是我的代码示例。我想将 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
简单地将定义和 typedef 放在头文件中并将其命名为 "xxx_registers.h" 或类似名称(其中 xxx 是您的 MCU)。这就是通常的做法。
但是,您应该将 typedef 命名为 DDRA_t
,然后再命名为 #define DDRA ... volatile DDRA_t*
。注册名称始终使用大写字母是一种习惯。
重要提示:确保在您的编译器中禁用严格别名!否则像这样的代码可能会以可怕的方式崩溃。这主要是 gcc 编译器的问题,但其他编译器可能会以类似的功能失调方式处理严格的别名。对于 gcc,在编写嵌入式系统代码时始终使用 -fno-strict-aliasing
进行编译,否则无法使用该编译器。
请注意 bit-fields 是 non-portable 和危险的,因此不能保证此代码可以在其他编译器上运行。使用按位运算符访问单个位比 bit-fields.
更好更安全
我正在尝试绘制一些位置的地图,这是我的代码示例。我想将 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
简单地将定义和 typedef 放在头文件中并将其命名为 "xxx_registers.h" 或类似名称(其中 xxx 是您的 MCU)。这就是通常的做法。
但是,您应该将 typedef 命名为 DDRA_t
,然后再命名为 #define DDRA ... volatile DDRA_t*
。注册名称始终使用大写字母是一种习惯。
重要提示:确保在您的编译器中禁用严格别名!否则像这样的代码可能会以可怕的方式崩溃。这主要是 gcc 编译器的问题,但其他编译器可能会以类似的功能失调方式处理严格的别名。对于 gcc,在编写嵌入式系统代码时始终使用 -fno-strict-aliasing
进行编译,否则无法使用该编译器。
请注意 bit-fields 是 non-portable 和危险的,因此不能保证此代码可以在其他编译器上运行。使用按位运算符访问单个位比 bit-fields.
更好更安全