gpt4 book ai didi

c - 从另一个线程使用 va_list

转载 作者:太空狗 更新时间:2023-10-29 15:04:35 26 4
gpt4 key购买 nike

我在一个小型嵌入式系统上使用 FreeRTOS (newlib),发现 printf 和 family 浪费了大量的堆栈空间。我有很多任务,但我没有足够的 ram 来使每个任务的堆栈足够大以支持 printf() 调用。为了解决这个问题,我正在努力创建一个“printf 服务器”任务,它将有一个大堆栈并代表其他任务执行所有 printf()。

所以我的问题是,将 va_list 传输到另一个线程(任务)的正确方法是什么?下面的例子产生垃圾参数。

简单介绍一下它是如何工作的:task_printf() 会将其参数放入静态变量中,然后向 server_task 发出信号以执行实际打印。当 server_task 完成时,它会向客户端发出继续的信号。

// printf parameters
static va_list static_args;
static const char *static_format;
static int static_result;


// printf server task. Processes printf requests forever
void server_task(void *pvParameters)
{
while(1)
{
xSemaphoreTake(printf_start, portMAX_DELAY); // wait for start command
static_result = vprintf(static_format, static_args);
xSemaphoreGive(printf_finished); // give finish signal
}
}


// get server task to print something for us
int task_printf(const char *format, ...)
{
int result;

xSemaphoreTake(printf_mutex, portMAX_DELAY); // lock

va_start(static_args, format);
static_format = format;

xSemaphoreGive(printf_start); // give start signal
xSemaphoreTake(printf_finished, portMAX_DELAY); // wait for completion

va_end(static_args);

...
}

最佳答案

好吧,上面的内容现在确实有效了。我搞砸了信号量初始化(未显示),这允许调用者的堆栈在 printf 服务器可以使用它们之前将 args 丢弃。

关于c - 从另一个线程使用 va_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11586625/

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