Многопоточность в микроконтроллерах - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть переменная volatile unsigned char array LedState[5], которая распределяется между потоками.Каждый индекс в массиве обозначает состояние.В соответствии с каждым состоянием светодиод будет мигать в различной последовательности.Один поток устанавливает состояние в массиве, а другой поток на основе индекса массива будет мигать светодиодами.

void TurnOnled(state) {
   LedState[state] =1;
}
void TurnOffLed(state) {
   LedState[state] = 0;
}
int CheckLedState(state) {
   return LedState[state]? 1 : 0;
}
Thread 1
---------
TurnOnLed(3);
/*Set of instructions*/
TurnOffLed(3);

Thread 2
--------
if (CheckLedState(3)) {
   /*Flash LEDS according to state*/
else {/*do nothing*/}

Проблема, с которой я иногда сталкиваюсь, в потоке 1, мне нужно TurnOnLed и TurnOffLedнемедленно.Как я могу убедиться, что поток 2 видит TurnOnLed до вызова TurnOffLed.Выше приведен простой пример, но в действительности переменная LedState устанавливается и сбрасывается из более чем одного потока.Но разные потоки не устанавливают одно и то же состояние.

1 Ответ

0 голосов
/ 30 ноября 2018

Вы должны использовать семафор для каждого светодиода, который устанавливает функция Set, и функции чтения отключаются, как только он получает состояние.Функция set должна изменять состояние только тогда, когда семафор очищен.Например:

char LedState[5];
char LedSema [5];

void TurnOnled(state) {
   while (LedSema[state]) { /* wait until earlier change processed */ ; }
   LedState[state]= 1;      /* turn LED on */
   LedSema [state]= 1;      /* indicate state change */
}
void TurnOffLed(state) {
   while (LedSema[state]) { /* wait until earlier change processed */ ; }
   LedState[state]= 0;      /* turn LED off */
   LedSema [state]= 1;      /* indicate state change */
}
//Thread 1
//---------
TurnOnLed(3);
/*Set of instructions*/
TurnOffLed(3);

//Thread 2
//--------
if (LedSema[3]==1) {
    /* a change occured */
    if (LedState[3]) {
        /* turn on LED */
    }
    else {
        /* turn off LED */
    }
    LedSema[3]=0;  /* indicate change processed */
}
...