Чтение значения из необработанной памяти (совместимо с MISRA)

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

Мой код:

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. Использование динамической памяти (содержимое flash является динамическим, поэтому адрес данных является переменным). Только потому, что вы думаете об объявлении константного указателя на флэш-адрес и доступе к нему после записи данных.

Каковы правила, если не нарушать их? 🙂

1

Решение

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

1.- Не будь MISRA-совместимым.

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

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

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

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

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

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

1

Другие решения

Если 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

Продолжая ответ @ IvanPajuelo (мое предлагаемое редактирование, похоже, было отклонено) — на самом деле есть ТРИ варианта, а не только два, указанные в @IvanPajuelo:

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

В документе «Руководящие принципы» объясняется механизм отказа от применения правила посредством отклонения, и это одна из тех ситуаций, в которой отклонение, безусловно, действительно.

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

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

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

0
По вопросам рекламы [email protected]