AVR单片机中有三种存储器,Flash, RAM, EEPROM。这篇讨论的是RAM。
RAM编址
AVR单片机的RAM编址是这样的,最先的是32个通用寄存器,然后是64个I/O寄存器,然后是扩展I/O寄存器,最后才是Internal SRAM。以ATmega2560为例,内存为8192字节。通用寄存器地址范围是0x00到0x1f,I/O寄存器地址范围是0x20到0x5f,扩展I/O寄存器地址范围是0x60到0x1ff,内存地址范围是0x200到0x2200。如图所示。图为ATmega2560的datasheet中内容。
RAM地址是16位的,最多能寻址64k字节的地址空间。要进行RAM扩展的话,最多能扩展多大内存呢?
16位地址寻址能力是64k字节,其中已经编址了0x2200的地址空间,只能扩展剩余的地址空间,因此最多能扩展的内存为0xffff - 0x21ff = 0xde00的内存。如果使用64kB的存储器来扩展的话,那么存储器的高字节部分将会访问不到。
I/O寄存器
尽管Arduino提供了大量的函数和宏,而且大部分效率很高且使用安全,使得开发者不需要关心底层的硬件。但也会有一些特定的情况,Arduino做的不好的。例如要将某个端口全部设置为输出,例如用某个端口并行传输数据。这时候,直接对寄存器操作就比用arduino函数效率高得多。
第一个问题,将端口C全部设置为输出的话,直接对寄存器操作代码将会很简单,而且效率很高: