Во-первых, предостережение: то, что вы пытаетесь сделать — получить доступ к локальным переменным одной задачи из другой — может быть подвержено ошибкам. В частности, если локальный объект объявлен в Задаче А и выходит за рамки до того, как Задача Б получит к нему доступ. Поскольку память стека может повторно использоваться для разных переменных в разных функциях, задача B может обращаться к какой-то другой переменной.
Но на самом деле я использовал этот шаблон на практике — в частности, чтобы позволить одной задаче выделять в стеке буфер для связи, обслуживаемой другой задачей. Поэтому я просто предполагаю, что вы знаете, что делаете. :-)
Заранее вычислить адрес локальной переменной сложно. Если вы получите его сегодня, он, скорее всего, изменится, если вы измените код или версию компилятора. Что вы, вероятно, захотите сделать, так это захватить его адрес во время выполнения и каким-то образом сделать его доступным для другой задачи. Однако это может оказаться сложной задачей: другая задача может попытаться использовать локальный объект до того, как запустится ваша задача, и ничто не мешает другим задачам добраться до него.
Чуть более чистым подходом было бы предоставление адреса другой задаче через сегмент очереди двумя задачами.
QueueHandle_t shared_queue;
void common_startup() {
// This code might go in main, or wherever you initialize things.
shared_queue = xQueueCreate(1, sizeof(unsigned *));
}
void task_a() {
// This task wants to share the address of 'local' with task_b.
unsigned local;
// Stuff the address of our local in the queue. We use a
// non-blocking send here because the queue will be empty (nobody
// else puts things in it). In real code you'd probably do some
// error checking!
unsigned * ptr = &local;
xQueueSend(shared_queue, &ptr, 0);
while (1) {
do_stuff();
}
}
void task_b() {
// This task wants to use task_a's 'local'.
// Real code would do error checking!
unsigned * ptr;
xQueueReceive(shared_queue, &ptr, portMAX_DELAY);
while (1) {
// Just increment the shared variable
(*ptr)++;
}
}
person
Cliff L. Biffle
schedule
01.07.2015