2017-10-04 63 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逐字節讀取)發送數據,然後重複此過程。 –