From 8f424dc533b3e67af495005f3ee76ccbd79d37ee Mon Sep 17 00:00:00 2001 From: ReservedField Date: Tue, 12 Jul 2016 21:00:19 +0200 Subject: [PATCH] Make ADC thread-safe --- src/adc/ADC.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/adc/ADC.c b/src/adc/ADC.c index f9f22f9..a6e7b4c 100644 --- a/src/adc/ADC.c +++ b/src/adc/ADC.c @@ -19,6 +19,7 @@ #include #include +#include /** * \file @@ -62,14 +63,13 @@ ADC_DEFINE_IRQ_HANDLER(3); void ADC_UpdateCache(const uint8_t moduleNum[], uint8_t len, uint8_t isBlocking) { uint8_t i, j, finishFlag; - - // Enter critical section - __set_PRIMASK(1); + uint32_t primask; for(i = 0; i < len; i++) { // Find interrupt number for module number for(j = 0; j < 4 && moduleNum[i] != ADC_moduleNum[j]; j++); + primask = Thread_IrqDisable(); if(!(EADC_GET_PENDING_CONV(EADC) & (1 << moduleNum[i]))) { // Configure module EADC_ConfigSampleModule(EADC, moduleNum[i], EADC_SOFTWARE_TRIGGER, moduleNum[i]); @@ -81,11 +81,9 @@ void ADC_UpdateCache(const uint8_t moduleNum[], uint8_t len, uint8_t isBlocking) // Start conversion EADC_START_CONV(EADC, 1 << moduleNum[i]); } + Thread_IrqRestore(primask); } - // Exit critical section - __set_PRIMASK(0); - if(isBlocking) { // Wait for modules to finish // Keep in mind they could be restarted by another concurrent