gpt4 book ai didi

c - STM32 Discovery 在线程之间共享变量

转载 作者:行者123 更新时间:2023-11-30 17:13:17 25 4
gpt4 key购买 nike

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

}

最佳答案

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

关于c - STM32 Discovery 在线程之间共享变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30923279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com