2017-10-04 62 views
0

我与有AVR控制器ATmega16的Flash和Sram.i的1KB的16KB已经存储的数据在一个静态数组即static char raw_data[15361];,并试图在USART发送使用下列函数工作:发送过USART大阵

void USART_TxChar( char data)      /* Data transmitting function */ 
{ 
    UDR = data;          /* Write data to be transmitting in UDR */ 
    while (!(UCSRA & (1<<UDRE)));     /* Wait until data transmit and buffer get empty */ 
} 

void USART_SendString( char *str)     /* Send string of USART data function */ 
{ 
    int i=0;                  
    while (str[i]!=0) 
    { 
     USART_TxChar(str[i]);      /* Send each char of string till the NULL */ 
     i++; 
    } 
} 

我的问题是,当我把我的阵列放入usart时,它显示内存已满。 USART_SendString(raw_data);。我在网上搜索并发现我的函数正在将所有数组加载到RAM中,因此导致错误。我发现有一种方法可以使用PROGMEM attribute将数据存储在闪存中,但它仅适用于const string type 。 所以我应该如何发送我的数据存储在闪存上方,而不会导致内存满错误?

+0

Store中的闪光灯(PROGMEM)阵列和重写你的SendString功能'无效USART_SendString(为const char * STR)'。顺便说一句,'静态字符'并不意味着它将闪光。 – tilz0R

+0

@ tilz0R我也试过,但它说我必须使数组'const'.which我不能因为之前发送数据通过usart我将我的传感器数据存储在该数组中。制作它const我不会能够添加值到该阵列。 –

+2

“Skb的1kb”,然后是“static char raw_data [15361];”。您的阵列比可用RAM大15倍。这对你看起来是否正确? – Lundin

回答

1

static并不意味着PROGMEM。您需要将&存储在闪存中。从GCC 4.8,你可以使用一个名为地址空间

const __flash char raw_data[15361]; 

void USART_SendString(const __flash char *str) 
+0

如果我把'raw_data []'作为'const',我不能修改或写任何东西给它。但我不会存储任何东西。而且'PROGMEM'没有任何写入操作。 –

+3

当然不是。但是没有办法在1k的设备上有15k字节的RAM。没有奇迹。您只需将其中的一部分存储在RAM中,或将设备更改为更现代的设备。 –

+0

,所以没有办法在我的闪存中保存数据(小于或等于15k),然后在运行时通过usart(从Flash Memory逐字节读取)发送数据,然后重复此过程。 –