我最近一直试图学习微控制器的一切。由于这是自学,我花了一些时间来学习如何在裸机上工作。长话短说,我不想在我的C代码中使用AVR库;我想使用C中的指针通过地址专门访问寄存器。我已经在线搜索了到处,查看了AVR头文件,并阅读了一本书。如果有人可以帮助我,那就太好了。
答案 0 :(得分:3)
您可以从整数转换为指针。它只是一个普通的演员表达。
volatile char * const port_a = (volatile char *) 0x1B;
许多编译器提供扩展来指示链接器将对象放在特定地址:
volatile char port_a @ 0x1B; // Or something like this
优点是您不会引入全局变量来表示指针,但它可能无法为硬件寄存器做正确的事情。您需要仔细阅读您的特定平台的编译器手册。
官方AVR标题可能包含更多类似内容:
#define PORTA (* (volatile char *) 0x1B)
这避免了全局变量和链接器破解,但许多人也考虑使用预处理器也是黑客攻击。
生产代码唯一可行的解决方案是使用官方标题。其他任何东西都只是教学。
答案 1 :(得分:0)
它几乎取决于编译器,有些使用对register
关键字的更严格解释。
例如,
unsigned char a @0x0001;
会将变量放入特定的寄存器中。
否则,你可以只为你的指针分配数值,如果你的程序在一个操作系统中运行,这是一个很大的禁忌,但是如果你有一个你知道边界的保证物理内存,它可能是可以接受的。但是,必须注意编译器不会自动使用该寄存器,除非您在汇编中编写大部分代码,否则这很难确定。
因此,变量声明方法(如果你的编译器支持它)是更好的选择,因为它保证没有其他变量占据它的位置。