c - 通过 usart 发送大数组

标签 c memory avr usart progmem

我正在使用具有 16kb 闪存和 1kb Sram 的 AVR Controller 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,因此导致错误。我发现有一种方法可以发送存储在使用PROGMEM属性闪过usart,但它仅适用于const字符串类型。 那么我应该如何通过usart发送存储在闪存中的数据而不导致内存已满错误?

最佳答案

静态并不意味着PROGMEM。您需要将它们放入闪存中或从闪存中访问它们。从 gcc 4.8 开始,您可以使用命名地址空间

 const __flash char raw_data[15361];

 void USART_SendString(const __flash char *str)  

关于c - 通过 usart 发送大数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46558391/

相关文章:

c++ - 在 AVR 中逻辑右移 2 次方的速度更快吗?

php - PHP 脚本可以与 C 程序对话吗?

python - 如何知道数组和字典等python对象的字节大小? - 简单的方法

arduino - 加速 AVR 函数指针

循环中的 C++ 对象引用

performance - CPU速度是否受从内存中获取指令的速度限制?

c - 如何将 .o 文件转换为 .elf 文件?

c - 如何在 C 中向自身添加一个 int 变量?

C malloc valgrind 大小的无效写入

c - int 矩阵中的段错误