【问题标题】:STM32 Discovery Sharing variables between threadsSTM32 Discovery 线程间共享变量
【发布时间】:2023-03-04 00:49:01
【问题描述】:

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

我已将其声明为外部。

请帮忙寻找解决办法

谢谢你。

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

}

【问题讨论】:

  • 什么线程?你在使用任何操作系统吗?
  • 是的,我正在使用 cmsis_os 库来使用线程,这就是我在 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 ();

标签: c string multithreading stm32f4discovery


【解决方案1】:

将 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/

【讨论】:

  • 非常感谢,我会按照你说的尝试
猜你喜欢
  • 1970-01-01
  • 2017-07-22
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多