
AVRGCC中将变量定义在flash空间的方法(大数据存储)
(1)flash常量:
#include <avr\pgmspace.h>//须增加的头文件
const prog_uchar FlashConst = 3 //定义uchar型的常量n定义在flash里(flash常量)
unsigned char RamVar//定义无符号整型变量(Ram变量)
RamVar = pgm_read_byte(&FlashConst)//读取flash常量到ram变量
(2)flash一维数据:
#include <avr\pgmspace.h>
const prog_uchar s[5] = { 1, 2, 3, 4, 5 }
unsigned char RamVar//定义无符号整型变量(Ram变量)
RamVar = pgm_read_byte( &s[1] ) //读取s[1]的值到RamVar, or RamVar = pgm_read_byte( s+1 )
(3)flash多维数据:
#include <avr\pgmspace.h>
const prog_uchar s[4][16] = { {14, 4,13, 1, 2,15,11, 8, 3,10, 6,12, 5, 9, 0, 7 },
{ 0,15, 7, 4,14, 2,13, 1,10, 6,12,11, 9, 5, 3, 8 },
{ 4, 1,14, 8,13, 6, 2,11,15,12, 9, 7, 3,10, 5, 0 },
{15,12, 8, 2, 4, 9, 1, 7, 5,11, 3,14,10, 0, 6,13 }
}
unsigned char RamVar[4],[16]//定义无符号整型变量(Ram变量)
register char i, j
for(i=0i<4++)
{
for(j=0j<16j++)
{
RamVar[i][j] = pgm_read_byte( &s[i][j] ) //读取数组s的值到RamVar
}//end for 2
}//end for 1
(4)扩展部分
avr对ram和flash是独立编址的,ram是按8位编址,而flash却按16位编址,读ram和读flash的汇编指令也是不同的。
类似flash数据类型还有:prog_void 、prog_char 、prog_int8_t、prog_uint8_t、prog_int16_t、prog_uint16_t、prog_int32_t、prog_uint32_t等。
读取指令pgm_read_xxx宏定义其实就是一段包括了flash读取指令的内联汇编代码。函数原型为:pgm_read_byte(address_short)、pgm_read_word(address_short)、 pgm_read_dword(address_short)、pgm_read_float(address_short)。括号中是地址值。
看来您使用的是智能手机,遇到这种情况处理方法如下:1、删除手机所有安装程序、恢复出厂设置;
2、彻底解决方案、重新刷软件版本
请注意这两项 *** 作都需要首先做好手机上的资料备份!您还要明白一点,内存卡容量不等于系统报的内存容量!
在 C 程序中,经常会遇到段错误(Segment error),这种问题出现的原因可能如下:
对一个 NULL 指针解引用;
访问程序进程以外的内存空间。
实际上,第一个原因可以归到第二个原因。在一个 C 程序的虚拟内存空间中,从低地址到高地址依次是代码区,堆区(向上增长),栈区(向下增长),最上是常量区。其中 NULL 指针的位置正好是虚拟内存中地址为 0 的位置,而这个位置是不属于以上 4 个区域的,同理一些比较低的地址也不属于这四个区,所以造成段错误的原因是访问了程序虚拟内存空间 4 个区以外的地址。在平时的开发中,最大的可能还是对 NULL 进行了解引用。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)