Я пытаюсь прочитать значение переменной, ранее записанной на флэш-памяти 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 является динамическим, поэтому адрес данных является переменным). Только потому, что вы думаете об объявлении константного указателя на флэш-адрес и доступе к нему после записи данных.
Каковы правила, если не нарушать их? 🙂
Как я вижу это. У меня есть только 2 «решения» проблемы:
1.- Не будь MISRA-совместимым.
2.- Используйте статические адреса в динамической среде:
Во время компиляции:
const Table1 table1 __attribute__ ((section (".table1space")));
const Table2 table2 __attribute__ ((section (".table2space")));
Определите необходимые разделы в скрипте компоновщика.
Во время выполнения:
Когда динамическое распределение вызывается для table1. Статический адрес таблицы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;
Продолжая ответ @ IvanPajuelo (мое предлагаемое редактирование, похоже, было отклонено) — на самом деле есть ТРИ варианта, а не только два, указанные в @IvanPajuelo:
В документе «Руководящие принципы» объясняется механизм отказа от применения правила посредством отклонения, и это одна из тех ситуаций, в которой отклонение, безусловно, действительно.
Настолько, что продолжается работа по документированию некоторых стандартных утвержденных отклонений, одним из которых является это (классификация R6 в этом документе) !!
http://www.misra.org.uk/forum/viewtopic.php?f=54&т = +1253
http://www.misra.org.uk/forum/download/file.php?id=627
(Вам может потребоваться войти на доску объявлений, чтобы получить доступ к загрузке)