ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
12 июля
414296 Топик полностью
fk0, легенда (31.05.2013 18:31, просмотров: 234) ответил amx на Строковые литералы имеют тип const char*. Для МК с одним адресным пространством всё const идёт в ПЗУ, а у AVR/PIC, например, что бы строка была в ПЗУ надо дописать волшебное слово PROGMEM/rom. Иного можно добиться шаманством со скриптами линкера.
У PIC, например, если PIC18 и hitech-C, или если PIC24 и C30 (XC16) ничего указывать не надо, и оно само ляжет в ROM. Более того... все компиляторы делятся на два класса. С нормальной поддержкой const и ненормальной. В первом всё описанное с const кладётся в ROM. Во втором существуют извращения вроде PROGMEM и т.п., const типы кладутся по прежднему в RAM. Так вот для второго класса компиляторов код нифига нормально писать вообще невозможно. Потому, что даже printf("%s",...) работать не будет нормально. Откуда он знает, PROGMEM там или нет? И все прочие функции нужно писать в двух версиях. Для PROGMEM и без. А strcmp нужно писать в четырёх версиях... Это не нормально, это не нормальный "C", это извращение. К числу извращений относится IAR, microchip C18, AVR-GCC. Извращения возникают на почве гарвардской архитектуры, когда адресные пространства ROM и RAM разные. То-есть один адрес и туда, и сюда может указывать. В компиляторах профессионального уровня это обходят одним из двух методов: либо указатели удлиняются (пример -- KEIL для x51) и дополнительный байт укаазывает, это указатель в ROM или в RAM. И код генерируется такой, что по ходу работы программы определяется какие инструкции CPU использовать для обращения по такому указателю. Второй метод, применяется в hitech-C -- по адресу. Если адрес меньше 0x1000, например, это RAM (почему у PIC18 нет больше 4кБайт RAM), иначе ROM. Опять же компиятор генерирует код решающий это в процессе исполнения. И секция const кладётся с адреса большего 0x1000. А в PIC24 проблем гарвардской архитектуры решена аппаратно: часть ПЗУ отображается в адресном пространстве ОЗУ. Лучший способ.
[ZX]