STM32 Discovery在线程之间共享变量

时间:2015-06-18 18:42:26

标签: c string multithreading stm32f4discovery

我是Stack社区的新手。我试图在两个线程之间共享字符串的值。代码的一部分如下所示。 waveplayer.c和main.c的内容,并声明为每个线程。字符串buffer1需要在两个线程之间共享。

我已宣布为extern。

请帮助找到解决方案

谢谢你。

// 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); 

// main.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();
    }

}

1 个答案:

答案 0 :(得分:0)

将buffer1声明为堆上的值,并在一个特定文件中定义它。例如:

/* 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
}

值得一提的是(1)这只有在您使用的操作系统支持malloc时才有效(如果没有,我不知道该怎么做); (2)如果你需要不同的线程来访问这个缓冲区,你可能需要使用互斥锁或信号量。例如:

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

有关互斥锁的更多信息,请查看以下文章:http://www.thegeekstuff.com/2012/05/c-mutex-examples/