将映射地址声明为外部

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.

更好更安全