将映射地址声明为extern

时间:2018-03-09 00:07:08

标签: c embedded mapping 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 

1 个答案:

答案 0 :(得分:2)

简单地将定义和typedef放在头文件中并命名为" xxx_registers.h"或某些此类(其中xxx是您的MCU)。这就是通常如何做到的。

但是,您应该将typedef命名为DDRA_t,然后命名为#define DDRA ... volatile DDRA_t*。自定义总是使用大写字母表示寄存器名称。

重要说明:确保在编译器中禁用严格别名!否则这样的代码可能以可怕的方式破坏。这主要是gcc编译器的一个问题,但其他编译器可能会以类似的功能失调方式处理严格的别名。对于gcc,在编写嵌入式系统时始终使用-fno-strict-aliasing进行编译,否则无法使用该编译器。

请注意,位字段是不可移植且危险的,因此无法保证此代码可以在其他编译器上运行。使用按位运算符来访问单个位而不是位域更好更安全。