Я бы, для работы с АЦП, выделил отдельную задачу. Результаты бы складывал в локальный буфер:
static adc_measure_t adc_results[ADC_CHANNELS]. Для обращения к полученным значениям ADC сделал бы функцию геттер:
adc_task_get_adc_value(int channel). Внутри этой функции я бы делал блокировку, копирование результата в локальную переменную (если много, то memcpy) и разблокировку:
Код
lock(mutex)
int result = adc_results[channel];
unlock(mutex)
return result;
Да, задача ADC Task при складировании результатов от ацп тоже должна выполнять блокировку-разблокировку.