在AVR GCC中如何使用C语言在程序空间申请常量数组?就像在KEIL中使用CODE或者PCODE的功能。

在AVR GCC中如何使用C语言在程序空间申请常量数组?就像在KEIL中使用CODE或者PCODE的功能。,第1张

GCC中把大数组存入flash区的方法大全

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 进行了解引用。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11838061.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存