2015-08-06 8 views
6

Biorąc pod uwagę następujący kod:Dlaczego w jednym punkcie sekwencyjnym nie może być więcej niż jedno zezwolenie na odczyt z typem o kwalifikacjach lotnych?

static volatile float32_t tst_mtr_dutycycle; 
static volatile uint8_t tst_mtr_direction; 
static volatile uint32_t tst_mtr_update; 

void TST_MTR_Task(void) 
{ 
    if (tst_mtr_update == 1U) 
    { 
     tst_mtr_update = 0; 

     MTR_SetDC(tst_mtr_dutycycle, tst_mtr_direction); 
    } 
} 

znalazłem problemów z MISRA C 2012 Rule-13,2 i postanowiłem zrobić kilka badań. Znalazłem tu (http://archive.redlizards.com/docs/misrac2012-datasheet.pdf), że:

nie będzie dostęp do więcej niż jednego odczytu z rodzaju lotnych wykwalifikowanych w ciągu jednego punktu sekwencji

Chodzi o to, że przystań” • byli w stanie znaleźć przykład lub wyjaśnienie, które wyjaśnia, dlaczego w jednym punkcie sekwencyjnym powinno być nie więcej niż jedno zezwolenie na odczyt z typem o kwalifikacjach lotnych.

Potrzebuję znaleźć rozwiązanie dla naruszającego kod, ale nie jest dla mnie jasne, co robić.

Wiem, że w ramach jednego punktu sekwencyjnego nie będzie więcej niż jeden dostęp do odczytu z typem o zmiennej lotności. Pytanie brzmi: dlaczego? i muszę wiedzieć, dlaczego, aby wdrożyć rozwiązanie i wyjaśnić tutaj wszystkim, dlaczego zmieniam kod.

Pozdrawiam.

Odpowiedz

4

Uzasadnieniem tej zasady jest:

(Wymagane) Wartość wyrażenia i jej trwałych efektów ubocznych powinna być taka sama pod wszystko jest dozwolone zlecenia ewaluacji

Jeśli więcej niż jedna zmienna o wartościach zmiennopozycyjnych jest odczytywana między punktami sekwencji, a następnie jest nieokreślona, ​​co jest odczytywane jako pierwsze. Odczytywanie zmiennej lotnej jest efektem ubocznym.

Rozwiązaniem jest wyraźnie zamówić brzmi:

void TST_MTR_Task(void) 
{ 
    if (tst_mtr_update == 1U) 
    { 
     tst_mtr_update = 0; 

     float32_t dutycycle = tst_mtr_dutycycle; 
     uint8_t direction = tst_mtr_direction; 
     MTR_SetDC(dutycycle, direction); 
    } 
} 
+0

Perfect !! Dzięki! Ta odpowiedź może mi również pomóc w innych sprawach. Brakowało mi efektów ubocznych w regule. – m4l490n

+0

Jest coś, co nie jest dla mnie jasne. Dlaczego czytanie zmiennej lotnej jest efektem ubocznym? – m4l490n

+1

@ m4l490n, ponieważ do tego służy słowo "volatile" - określa, że ​​zapisy i odczyty nie mogą być buforowane ani zamieniane.Przykładem może być rejestr sprzętowy, w którym odczyty mogą zwracać różne wartości podczas kolejnych odczytów i powodować dowolne akcje. – ecatmur

2

Brak punktów sekwencji pomiędzy pobierania argumenty wywołania funkcji. Tak więc kolejność, w jakiej są one pobierane, jest niezdefiniowana przez standard. OTOH, kompilator musi utrzymywać porządek dostępu do obiektów ulotnych, więc jest to sprzeczność.

Fetch Zmienne nielotnych temps i używać tych, dla wywołania funkcji:

float32_t t1 = tst_mtr_dutycycle; 
uint8_t t2 = tst_mtr_direction; 
MTR_SetDC(t1, t2); 

Uwaga to jest rzeczywiście problem dla standardowej C i nie tylko związane z MISRA zgodności.

Wygląda na to, że masz wiele problemów związanych ze standardową zgodnością, więc możesz zachować pod poduszką standard.

+0

Dzięki za wyjaśnienie, że "Nie ma żadnych punktów sekwencji między pobieraniem argumentów wywołania funkcji". – m4l490n

+1

@ m4l490n: http://port70.net/~nsz/c/c11/n1570.html#Cp1 – Olaf

+0

Dzięki, sprawdzę to. – m4l490n

Powiązane problemy