Этот файл не поможет, он специфические возможности gcc использует для организации доступа к флеш-памяти. Вместо него нужно подсунуь что-то такое
Код:
#define PROGMEM __flash
typedef unsigned char __flash prog_uint8_t; typedef char __flash prog_char; // и далее аналогично по используемым типам
#define pgm_read_byte(a) (*(unsigned char __flash *)(a)) #define pgm_read_word(a) (*(unsigned __flash *)(a)) // и так далее по использованным pgm_read-функциям
И всё равно кое-что придётся ручками дочищать. В IAR врядли удастся соорудить аналог PSTR(), если он там вдруг используется. Ещё что-то вылезет. Я лет шесть в IAR-ы не заглядывал.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Последний раз редактировалось avreal Ср ноя 17, 2010 02:19:56, всего редактировалось 1 раз.
Да, вместо pgm_read_byte() автоматически подставится конструкция, которая прочитает байт из флеша уже «по-ИАР-овски». И так далее. Это будет способ побольше автоматом использовать. Но остатки дочищать вручную придётся.
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Покажите пример на что IAR ругается. Много таких руганий? Можно без использования макросов обычным приведением типов легко читать из flash. IAR хорошо это делает. Если переменная объявлена во flash как __flash char arr[] = { "qwertyui" }; __flash char var = 5; то читается просто PORTA = arr[ 4 ]; //будет выполнена инструкция LPM PORTB = var; //то же самое
Ой, ну тут надо смотреть внимательно код, как то это... Если поле ip структуры объявлено как
Код:
struct bla_bla_bla { ... uint8_t ip[4]; ... };
то правильно ругается на
Код:
void setSIPR( uint8_t * p );
setSIPR( &config->ip );
gcc тоже выдает в таком месте предупреждение о несовместимости указателей. Надо исправлять на
Код:
setSIPR( config->ip );
_________________ Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
структура объявлена так у меня. Там несколько синтаксисов ее объявления. И, если я беру адрес, почему я не должен & использовать? Это же взятие адреса.
А по Вашему первому сообщению здесь, где привели пример макроса с дефайнами- я начал добавлять из С99 дефайны- все- равно ругается на uint8.
Не то что- то. Можете выложить куда- нибудь этот pgmspace.h из GCC- посмотрю на него -что внутри. Не хочу из-за этого GCC устанавливать.
Массив - это и есть указатель при передаче его в качестве аргумента. Не нравится, как avreal сказал setSIPR( config->ip ); пишите так: setSIPR( &config->ip[0] );
Но, разговор начинался о размещении/чтении flash. А с ним что? Пока работа с RAM идёт...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения