我正在使用具有16kb闪存和1kb Sram.i的AVR控制器atmega16将数据存储在静态数组中,即static char raw_data[15361];
并尝试使用以下函数通过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中,从而导致错误。我发现有一种方法可以使用{{1}通过usart发送存储在flash中的数据但它仅适用于PROGMEM attribute
。
那么如何在usart上发送存储在闪存中的数据而不会导致内存满错误?
答案 0 :(得分:1)
静态并不意味着PROGMEM。你需要放置&amp;从闪存中访问它们。从gcc 4.8,您可以使用命名地址空间
const __flash char raw_data[15361];
和
void USART_SendString(const __flash char *str)