2017-10-04 6 views
0

je travaille avec le contrôleur AVR ATMEGA16 ayant 16kb du flash et 1kb de Sram.i ont stocké des données dans un tableau statique static char raw_data[15361];-à-dire et d'essayer de l'envoyer sur USART en utilisant la fonction suivante:Envoi grand tableau sur 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++; 
    } 
} 

mon problème est quand jamais je mets mon tableau dans usart il montre la mémoire pleine. USART_SendString(raw_data); .i recherché en ligne et de découvrir que ma fonction est de charger tout le tableau en RAM, conduisant à une erreur.je trouve il y a un moyen cependant que vous pouvez envoyer des données stockées en flash sur usart en utilisant PROGMEM attribute mais cela fonctionne uniquement pour const string type . alors comment dois-je envoyer mes données stockées dans la mémoire flash sur usart sans entraîner une erreur mémoire pleine ??

+0

Rangez votre tableau en flash (PROGMEM) et réécrire votre fonction SendString à 'vide USART_SendString (const char * str)'. Btw, 'statique char' ne signifie pas qu'il sera en flash. – tilz0R

+0

@ tilz0R j'ai essayé cela aussi mais il dit que je dois faire le tableau 'const'.qui je ne peux pas parce qu'avant d'envoyer des données sur usart je stocke mes données de capteur dans ce tableau.fait je ne peux pas ajouter des valeurs à ce tableau. –

+2

"1kb de Sram" puis "statique char raw_data [15361];". Votre tableau est 15 fois plus grand que votre RAM disponible. Cela vous semble-t-il correct? – Lundin

Répondre

1

statique ne signifie pas PROGMEM. Vous devez placer & accéder à/dans la mémoire flash. De gcc 4.8, vous pouvez utiliser des espaces d'adressage nommés

const __flash char raw_data[15361]; 

et

void USART_SendString(const __flash char *str) 
+0

si je rends '' raw_data [] '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' je ne peux rien y modifier. De plus, PROGMEM n'a aucune opération d'écriture. –

+3

bien sûr que non. Mais il n'y a aucun moyen d'avoir 15k octets dans la RAM sur l'appareil qui a 1k. Il n'y a pas de miracles. Vous devez n'en stocker qu'une partie dans la RAM ou changer l'appareil pour quelque chose de plus moderne. –

+0

donc il n'y a aucun moyen d'enregistrer des données dans mon flash (15k ou moins que cela), et plus tard sur l'envoi sur usart (lecture octet par octet de la mémoire Flash) à l'exécution.et répéter ce processus encore et encore. –