Проблема с ними очевидна: они работают только на компиляторе gcc.
А в отрасли встроенных систем существует множество различных компиляторов, каждый из которых предлагает свой уникальный, непереносимый способ сделать это. Иногда это хорошо (большинство встроенных проектов никогда не переносятся на разные компиляторы), но с общей точки зрения это не так.
(Та же проблема существует и с расширенными адресами - если вы, например, используете 8 или 16-битный MCU с более чем 64-килобайтной адресуемой памятью. Компиляторы затем используют различные нестандартные расширения, такие как near
и far
.)
Одним из решений этих проблем является создание «обертки» вокруг поведения, специфичного для компилятора, путем создания уровня аппаратной абстракции (HAL), где вы указываете, что тип, используемый для хранения данных во флэш-памяти, равен flash_byte_t
или некоторому другому затем из вашего HAL включите специфичный для компилятора заголовочный файл, содержащий фактическую typedef, такую как typedef const __flash uint8_t flash_byte_t;
. Например, приложение включает в себя «compiler.h», а это, в свою очередь, включает «gcc.h». Таким образом, вам нужно переписать только один маленький заголовочный файл при переключении компилятора.
Также, как выясняется, C позволяет const flash_byte_t
очень хорошо, хотя это уже было typedef'd как const. В C есть специальное странное правило, гласящее, что вы можете добавлять в объявление столько раз, сколько захотите. Так что const const int x
эквивалентно const int x
. Это означает, что если пользователь получит дополнительную const-квалификацию, это нормально.
Обратите внимание, что это в основном AVR, являющееся здесь особым исключением из-за его странной гарвардской модели.
В противном случае, существует большинство отраслевых стандартов, используемых большинством компиляторов: все const
квалифицированные переменные со статической продолжительностью хранения должны быть размещены во флэш-памяти. Конечно, стандарт C не дает никаких гарантий (это выходит за рамки стандарта), но большинство встроенных компиляторов ведут себя так.