2014-09-08 5 views
1

Я пытаюсь прочитать значение переменной, ранее записанной на флэш-памяти NVM.Чтение значения из необработанной памяти (совместимо с MISRA)

Мой код:

uintptr_t address = getAddress(); 
//[MISRA C++ Rule 5-2-8] cast from unsigned int to pointer 
uint16_t value = *(reinterpret_cast<uint16_t*>(address)); 

Проблема в том, отлитый из uintptr_t указателю не допускается в MISRA. Кто-нибудь знает, как получить доступ к этой памяти?

Я нарушаю одно из больших правил MISRA. Использование динамической памяти (содержимое вспышки динамическое, поэтому адрес данных является переменным). Только потому, что вы думаете объявить const-указатель на адрес флэш-памяти и получить доступ к нему после записи данных.

Каковы правила, если они не нарушают их? :)

+0

«Динамическая память» не должно быть проблемой MISRA. Если 'GetAddress' вернул' void * ',' static_cast' было бы достаточно, и ваш инструмент, вероятно, не стал бы жаловаться. – MSalters

+0

GetAddres не может вернуть указатель, потому что адрес хранится в целочисленной переменной.Итак, если getAddres делает: void * ptr = reinterpret_cast [void *] (адрес); проблема будет такой же, но в другом месте. (Я использовал [], потому что я нахожусь в телефоне и не имею символов gt и lt). –

+0

Затем исправьте это - сохраните его в 'void *'. Реальная проблема остается прежней: вы используете неправильный тип для адреса. MISRA является достаточно строгим в этом отношении, храните указатели в переменных указателя. – MSalters

ответ

0

Если getAddress() возвращает целочисленный тип, который на самом деле предполагается использовать как указатель, давайте предположим, что это 2-байтовый выровнены, поскольку ваша точка привязки является uint16_t:

uintptr_t offset = getAddress(); 
assert(offset % sizeof(uint16_t) == 0); 
uint16_t* address = 0; 
address += offset/sizeof(uint16_t); 
uint16_t value = *address; 
+0

GetAddress - это макетная функция. Это только иллюстрирует проблему. В этом случае платформа требует, чтобы все указатели были выровнены по 16 бит. Это не проблема. В вашем коде вы выполняете арифметику указателя (адрес + = смещение ...), что также запрещено правилами MISRA. Я спрашиваю, есть ли способ получить доступ к нестационарной памяти без потери соответствия MISRA. –

+0

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

+0

Да. Ты прав. Я думаю, что использовать антическую динамическую память в среде MISRA невозможно, даже если она полностью контролируется. Каждый указатель должен быть помещен и задан во время компиляции. TT. Хорошо, я буду продолжать. –

1

Как я это вижу. У меня есть только 2 "решения" проблемы:

1.- Не выполняйте MISRA.

2.- Использовать статические адреса в динамической среде:

Во время компиляции:

const Table1 table1 __attribute__ ((section (".table1space"))); 
const Table2 table2 __attribute__ ((section (".table2space"))); 

Определить необходимые разделы компоновщика сценария.

Во время выполнения:

Когда динамическое распределение вызывается для table1. Возвращается статический адрес таблицы1 и т. Д.

+0

Вариант 3 - отклонение ... – Andrew

0

Расширения на @ ответ IvanPajuelo (в предложенном моем редактировании, кажется, были отклонено) - на самом деле существует три варианта, а не только два указано @IvanPajuelo:

  1. Не быть MISRA уступчивого
  2. Выдумка вещь «заткнуться шашкой»
  3. отклониться

в документе Руководства объясняет механизм для дис-применение правила через уклон, и это одна из тех ситуаций, что Отклонение, безусловно, имеет силу.

Настолько, что в настоящее время идет работа над документированием некоторых стандартных утвержденных отклонений, одним из которых является их классификация (классификация R6 в этом документе) !!

http://www.misra.org.uk/forum/viewtopic.php?f=54&t=1253 http://www.misra.org.uk/forum/download/file.php?id=627

(Вы, возможно, должны быть авторизованы на доске объявлений, чтобы получить доступ к скачать)