Closed. This question needs to be more focused. It is not currently accepting answers. Learn more。
想改进这个问题吗?更新问题,使其只关注一个问题editing this post。
5年前关闭。
我最近一直在努力学习有关微控制器的所有知识。因为这是自学,所以我花了一段时间来学习这些东西是如何在裸机上工作的。长话短说,我不想在我的C代码中使用AVR库;我想使用C中的指针通过寄存器的地址访问它们。我在网上到处搜索,查看AVR头文件,并阅读了一本书。如果有人能帮我,那就太好了。
许多编译器提供扩展来指示链接器将对象放置在特定地址:
优点是不引入全局变量来表示指针,但对于硬件寄存器,它可能做不到正确的事情。您需要仔细阅读特定平台的编译器手册。
官方的AVR头可能包含以下内容:
这避免了全局变量和链接器的攻击,但许多人也认为使用预处理器也是一种攻击。
生产代码唯一可行的解决方案是使用官方头。其他的都是指导性的。
想改进这个问题吗?更新问题,使其只关注一个问题editing this post。
5年前关闭。
我最近一直在努力学习有关微控制器的所有知识。因为这是自学,所以我花了一段时间来学习这些东西是如何在裸机上工作的。长话短说,我不想在我的C代码中使用AVR库;我想使用C中的指针通过寄存器的地址访问它们。我在网上到处搜索,查看AVR头文件,并阅读了一本书。如果有人能帮我,那就太好了。
最佳答案
可以从整数转换为指针。这只是一个正常的转换表达式。
volatile char * const port_a = (volatile char *) 0x1B;
许多编译器提供扩展来指示链接器将对象放置在特定地址:
volatile char port_a @ 0x1B; // Or something like this
优点是不引入全局变量来表示指针,但对于硬件寄存器,它可能做不到正确的事情。您需要仔细阅读特定平台的编译器手册。
官方的AVR头可能包含以下内容:
#define PORTA (* (volatile char *) 0x1B)
这避免了全局变量和链接器的攻击,但许多人也认为使用预处理器也是一种攻击。
生产代码唯一可行的解决方案是使用官方头。其他的都是指导性的。
关于c - 用C访问AVR寄存器? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24988522/
10-11 18:31