首页 理论教育 程序存储器和常量数据

程序存储器和常量数据

时间:2023-11-20 理论教育 版权反馈
【摘要】:AVR单片机是哈佛结构的MCU,它的程序存储器和数据存储器是分开的,这样的设计是有一些优点的。例如,分开的地址空间允许AVR单片机装置比传统结构访问更多的存储器;例如,ATmega系列允许有超过64KW(字)的程序存储器和64KB的数据存储器。将来的MCU装置可能用到更多的程序存储器,而程序计数器仍保留在16位上。非标准C解决了这个问题,ImageCraft AVR编译器使用“const”限定词表示项目是在程序存储器中。

程序存储器和常量数据

AVR单片机是哈佛结构的MCU,它的程序存储器和数据存储器是分开的,这样的设计是有一些优点的。例如,分开的地址空间允许AVR单片机装置比传统结构访问更多的存储器;例如,ATmega系列允许有超过64KW(字)的程序存储器和64KB的数据存储器。将来的MCU装置可能用到更多的程序存储器,而程序计数器仍保留在16位上。

不幸的是,C不是在这种机器上发明的。特别地,C指针是任意一个数据指针或函数指针,C规则已经指定不可以假设数据和函数指针能被向前和向后修改,可是同是哈佛结构的AVR单片机,要求数据指针能指向任一个数据内存和程序内存。

非标准C解决了这个问题,ImageCraft AVR编译器使用“const”限定词表示项目是在程序存储器中。注意对指针描述,这个const限定词可以应用于不同的场合,不管是限定指针变量自己还是指向项目的指针。例如:

“table”是表格式样分配在程序存储器,“ptr1”是一个项目在数据存储器而指向数据的指针在程序存储器,“ptr2”是一个项目在程序存储器而指向数据的指针在数据存储器,最后“ptr3”是项目在程序存储器而指向数据的指针也在程序存储器,在大多数的例子中“ta-ble”和“ptr1”是很典型的,C编译器生成LPM指令来访问程序存储器。(www.xing528.com)

注意,C标准不要求“const”数据是放入只读存储器中,而且在传统结构中,除了正确访问就没有要紧的了。因而在承认参数的C标准中使用const限定是非传统的,无论如何这样做与标准C函数定义是有一定冲突的。

例如,标准“strcpy”的原型是strcpy(char*dst,const char*src),带有const限定的第2个参数表示函数不能修改参数,然而在ICCAVR下,const限定词表示第2个参数指向程序存储器是不合适的。因此这些函数定义设有const限制。

最后,注意只有常数变量以文件存储类型放入FLASH中,例如定义在函数体外的变量或有静态存储类型限制的变量,如果使用有const限制的局部变量,将不被放入FLASH中而可能导致不明确的结果。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈