STM32 Discovery Partage de variables entre threads

Je suis nouveau pour empiler la communauté Exchange. J'essaie de partager les valeurs de chaînes entre deux threads. Une partie du code a été montrée ci-dessous. les deux contenus de waveplayer.c et main.c et déclarés comme un thread chacun. Et la chaîne buffer1 doit être partagée entre deux threads.

J'ai déclaré le comme extern.

Aidez-nous à trouver une solution

Merci.

//waveplayer.c

uint16_t buffer1[_MAX_SS] ={0x00};
 uint16_t buffer2[_MAX_SS] ={0x00};

extern FATFS fatfs;
 extern FIL file;
 extern FIL fileR;
 extern DIR dir; 

f_lseek(&fileR, WaveCounter);
  f_read (&fileR, buffer1, _MAX_SS, &BytesRead); 

//principal c

void USART3_SendDATA(void const *argument)
{
    while(1)
    {

//  USART_SendData(USART3, 'X');


    if(flagbuffer1)
        {
          f_read (&fileR, buffer1, _MAX_SS, &BytesRead);
            for( j = 0; j< _MAX_SS; j++ )
            USART_SendData(USART3, buffer1[j]);

            flagbuffer1 = 0;
        }

        osThreadYield();
    }

}
0
Oui j'utilise la bibliothèque cmsis_os, pour utiliser les threads et, heres comment je les ai définis dans le main.c void AudioRecordPlayback (void const * argument); void USART3_SendDATA (void const * argument); osThreadId tid_AudoRecordPlayback; osThreadDef (AudioRecordPlayback, osPriorityNormal, 1, 0); osThreadId tid_USART3_SendDATA; osThreadDef (USART3_SendDATA, osPriorityBelowNormal, 1, 0); int main (void) {osKernelInitialize ();
ajouté l'auteur Suhail Moideen, source
Quels fils? Utilisez-vous un système d'exploitation du tout?
ajouté l'auteur Eugene Sh., source

1 Réponses

Déclarez buffer1 comme valeur sur le tas et définissez-le dans un fichier particulier. Par exemple:

/* In common.h file */
extern uint16_t *buffer1;

/* In main.c */
#include "common.h"

extern uint16_t *buffer1;

int main(int argc, char **argv) {
    //your code here
    buffer1 = (uint16_t *)malloc(sizeof(uint16_t) * _MAX_SS);
    //thread starts AFTER this
}

/* In waveplayer.c */
#include "common.h"

extern uint16_t *buffer1;

int foo(...) {
    //use buffer1 here
}

Il vaut la peine de mentionner que (1) cela ne fonctionnera que si le système d'exploitation que vous utilisez supporte malloc (sinon, je ne suis pas sûr de savoir comment faire cela); et (2) vous aurez probablement besoin d'utiliser des mutex ou des sémaphores si vous avez besoin de threads différents pour accéder à ce tampon. Par exemple:

/* In waveplayer.c */
int foo(...) {
    //acquire mutex here
    //use buffer1 here
    //release mutex here
}

For more information on mutexes, check out an article such as this one: http://www.thegeekstuff.com/2012/05/c-mutex-examples/

0
ajouté
Merci beaucoup je vais essayer comme tu l'as dit
ajouté l'auteur Suhail Moideen, source