在usart上发送大数组

时间:2017-10-04 06:32:16

标签: c memory avr usart progmem

我正在使用具有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上发送存储在闪存中的数据而不会导致内存满错误?

1 个答案:

答案 0 :(得分:1)

静态并不意味着PROGMEM。你需要放置&amp;从闪存中访问它们。从gcc 4.8,您可以使用命名地址空间

 const __flash char raw_data[15361];

 void USART_SendString(const __flash char *str)