Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Есть один момент... :)
Отправлено
Юрий_СВ 18 декабря 2008 г. 14:38
В ответ на:
Спасибо за ответ, но отправлено
Fm 18 декабря 2008 г. 13:51
GCC так доконца и не научили работать с контроллерами с несколькими полями (адресными пространствами) памяти (ОЗУ, Flash, EEPROM).
Ведь если подумать - по правилам языка не получается. Допустим у вас есть универсальный указатель на "текст" для print(). (с точки зрения языка - это в порядке вещей) Если вы используете его попеременно то для указания на ОЗУ, то для указания на Flash, EEPROM. Что делать компилятору ?
Ведь это совершенно разные наборы команд. Такой код невозможно откомпилировать.
Префикс PROGMEM влияет только на размещение данных, но не на правила их выборки.
Компилятор подразумевает, что если разименовывают указатель, то используется ОЗУ.
Т.е. передавать в функцию просто msg[MSG_MAIN_MENU] - нельзя.
Автоматически выборка делается только по ОЗУ. То есть компилятор возьмёт адрес msg и сделает по нему выборку из ОЗУ.
Для этого и пишется &msg, а в функции по нему делается насильная выборка из Flash.
IAR умеет читать, используя тип указателля, но пишет тоже только если насильно указана функция записи во Flash.
Даже читать из ЕЕПРОМ автоматом - утопие. (Скрытые грабли)
Можно прочитать за несколько тактов, а можно и прождать несколько мс.
Да ещё и скрываются неприятности при парралельной работе с ЕЕПРОМ.
Составить ответ | Вернуться на конференцию
Ответы