用C访问AVR寄存器?

时间:2014-07-28 04:40:17

标签: c pointers avr cpu-registers avr-gcc

我最近一直试图学习微控制器的一切。由于这是自学,我花了一些时间来学习如何在裸机上工作。长话短说,我不想在我的C代码中使用AVR库;我想使用C中的指针通过地址专门访问寄存器。我已经在线搜索了到处,查看了AVR头文件,并阅读了一本书。如果有人可以帮助我,那就太好了。

2 个答案:

答案 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;会将变量放入特定的寄存器中。

否则,你可以只为你的指针分配数值,如果你的程序在一个操作系统中运行,这是一个很大的禁忌,但是如果你有一个你知道边界的保证物理内存,它可能是可以接受的。但是,必须注意编译器不会自动使用该寄存器,除非您在汇编中编写大部分代码,否则这很难确定。

因此,变量声明方法(如果你的编译器支持它)是更好的选择,因为它保证没有其他变量占据它的位置。

相关问题