2015-08-06 14 views
6

Учитывая следующий код:Почему в одной точке последовательности должно быть не более одного доступа для чтения с нестабильным типом?

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); 
    } 
} 

Я нашел проблемы с MISRA C 2012 Правило-13.2 и я решил сделать некоторые исследования. Я нашел здесь (http://archive.redlizards.com/docs/misrac2012-datasheet.pdf), что:

не должно быть доступа более чем один для чтения с летучими квалифицированных типа в точке одна последовательность

Дело в том, что пристанищем I» t смог найти пример или объяснение, в котором четко указано, почему в одной точке последовательности не должно быть доступа к чтению с нестабильным типом.

Мне нужно найти решение для нарушающего код, но мне не совсем ясно, что делать.

Теперь я знаю, что в одной точке последовательности должно быть не более одного доступа для чтения с нестабильным типом. Вопрос в том, почему? и мне нужно знать, почему для того, чтобы реализовать решение и объяснить всем здесь, почему я меняю код.

С уважением.

ответ

4

Основанием для этого правила:

(обязательно) Значение выражения и его стойких побочных эффектов должны быть одинаковыми при всех допускается заказов оценки

Если больше чем одна переменная с изменчивой квалификацией считывается между точками последовательности, то она не определена, которая считывается первой. Чтение изменчивой переменной является побочным эффектом.

Решения явно заказать читает:

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 !! Благодаря! Этот ответ может помочь мне и в других вопросах. Мне не хватало побочных эффектов в правиле. – m4l490n

+0

Есть что-то, что мне не очень понятно. Почему чтение изменчивой переменной является побочным эффектом? – m4l490n

+1

@ m4l490n, потому что для этого используется 'volatile' - он указывает, что записи и чтения не могут быть кэшированы или переупорядочены.Примером может служить аппаратный регистр, в котором reads может возвращать разные значения при последовательных чтениях и приводить к произвольным действиям. – ecatmur

2

Там нет точек последовательности между выборкой аргументов вызова функции. Таким образом, порядок, который они выбирают, не определен стандартом. OTOH, компилятор должен поддерживать порядок доступа к неустойчивым объектам, поэтому это противоречие.

Fetch переменных в энергонезависимых Temps и использовать их для вызова функции:

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

Примечания это на самом деле проблема для стандартного C, а не только связанным с MISRA требований.

Как вы, кажется, имеете несколько проблем, связанных с соблюдением стандартов, вы можете оставить standard под подушкой.

+0

Благодарим за разъяснение, что «нет точек последовательности между извлечением аргументов вызова функции». – m4l490n

+1

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

+0

Спасибо, я проверю это. – m4l490n