Так я же дал еще один способ не подходит? Данные функции имеют одиноковый размер, т.е. если они идут подряд, вычислить адрес нужной функции - не проблема.
Подходит, объем кода только будет шикарный. Надо попробовать.
Добавлено after 7 minutes 31 second: Отлично, быстрее не сделаешь, разве что кварц менять.Спойлер
Dimon456, в твоем примере, время выдачи байта зависит от значения байта. По крайней мере видно, что компилятор так нагенерил (может оптимизация не включена). Если ты допишешь все 256 case-ов, увидишь что значение 255 сдвигается долго. Надо именно вычислить смещение, а не перебирать все варианты.
посмотри как написать свою функцию эффективно на ассемблере, пока приходит идея использовать SBRC, SBRS команды. А так надо смотреть, количество тактов для выполнения всех комманд есть в документации. Когда был студентом, у нас была игра - написать небольшую (типа твоей) функцию, чтобы она выполнялась максимально быстро. Вот тебе и надо поигать в эту игру.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Навскидку 4608байт займут 256 функций вывода (я не внимательно считал). Но это самый быстрый вариант при выдаче байта - нет ветвлений. Можно уйти от 256 функций, съэкономив флеш, но будет медленней.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Нет, конечно, потрепаться о CVAVR в теме про WinAVR - это, несомненно, круто! А вот как с моим вопросом?
Ладно, структуры в PROGMEM, действительно, нереальны. А может выйдет как-нибудь запихнуть два байта двоичного кода внутрь текстовой строки, преобразовав эти коды макросом? Типа, пишу My_Macro(10560,"какой-то текст"); и получаю "\0x40\0x29\какой-то текст", где 0х40 - остаток от деления 10560 на 256, а 0х29 - целая часть результата этого деления, т е. частного? Или что-то подобное?
Блин, ну какой убогий макроязык в этих Сях!.. На макроязыке любого ассемблера от "больших" компьютеров такое сделать - как два байта переслать, а тут!..
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
еще как реальны! но инициализировать их СТРОКАМИ не очень удобно. можно, но чуть-чуть геморно. всё дело в том, что AVR-GCC не может одновременно присваивать строковое значение полю структуры и объявлять строковую константу. делать это придётся отдельно... то есть как-то так:
Код:
typedef struct{ int a; char b; char *str; } my_struct;
Добавлено after 1 minute 50 seconds: Очень рекомендую применять не WinAVR, а сборку AVR-GCC версии свежее 4 (лично я пользуюсь 6.2.2) - там уже определено пространство __flash, что позволяет работать с массивами, строками и структурами во flash практически так же просто, как и с ОЗУ - никаких pgm_read_xxx более не требуется!
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Как вариант, для более простого кода можно попробовать инициализировать не строками, а массивами char-ов определённой длины. Правда, при этом часть памяти будет потрачена впустую.
afz, чуть подправил пример от ARV, чтобы все определения (радиостанций) поместить в одно место. Почти как ты хотел (предполагается, что "freq" структуры _radio_t является уникальным):
вот это здорово! сам мучился всегда с разбросанными в разных местах строками и связанными с ними логически остальными вещами - беру на вооружение ваш подход!
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Не уверен в корректности кода (в смысле, не проверял), но компилируется он вроде как без ошибок.
Раз скомпилировал, то легко посмотреть во что это скомпилировалось Например, если задать ключик "-S", то в выходном ассемблерном файле можно посмотреть все ли было сделано так, как задумывалось. У меня не WinAVR, а классический кросс gcc под линукс: Ваш код поместил массив структур в секцию ".progmem.data", - все как и было задумано
// Я три создал, для проверки что это будет работать
// создаем новый прототип (в данном случае указатель на функцию) typedef void (*fptr)(void);
fptr arr[3]; // объявляем массив функций в данном случае из трех элементов // помещаем в массив функции указывая их имена (имя функции это и есть указатель на нее) arr[0] = m0; arr[1] = m1; arr[2] = m2;
//Ну и волшебный #define COLUMN(r) arr[font[r][fontline]](); // Результат 3.7500us
//Надпомню #define COLUMN(r) SPDR=font[r][fontline]; // Выполнялся за 1.5625us
Доброго времени суток. Раздела по AVR Toolchain не нашел, поэтому спрошу здесь. Вчера стоял AVR Toolchain 3.3, сегодня снес и поставил 3.4 (новее, значит лучше, ага...). Вчера прога компилировалась без ошибок, сегодня на строке
Код:
char OK[] PROGMEM = "OK";
Выдает error: variable 'OK' must be const in order to be put into read-only section by means of '__attribute__((progmem))' Как изменить запись, чтобы ошибка пропала ? Студия 4.19.
мне показалось, что avr-gcc 4.9.2 и 5.2.1 выдают более компактный результат компиляции. ну а вообще максимально новая версия, которой я пользуюсь, имеет номер 6.1.1
Пока_без_кота писал(а):
Как изменить запись, чтобы ошибка пропала ?
попробуйте так
Код:
const __flash char OK[] = "OK";
если скомпилируется, то для доступа к байтам строки уже не потребуется применять pgm_read_byte, можно будет сразу работать, как с обычной переменной. разумеется, это относится не только к строкам, но и к любым другим "переменным" во flash
только с указателями будьте осторожнее, потому что "указатель на данные во flash" и "указатель во flash на данные" - две большие разницы
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Нет, скомпилировалось только, если просто добавить const
Код:
const char OK[] PROGMEM = "OK";
И теперь выдает warning: passing argument 1 of 'SendStr_P' discards 'const' qualifier from pointer target type [enabled by default] на функции
Код:
// Отправка строки из флеша в UART ================= void SendStr_P(char *string) // На входе указатель на символ строки { while (pgm_read_byte(string) != '\0') // Пока байт строки не 0 (конец строки) { SendByte(pgm_read_byte(string)); // Мы продолжаем слать строку string++; // Не забывая увеличивать указатель, выбирая следующий символ строки } }
Смысл варнинга мне понятен, но вот как подправить, я не знаю. Насчет не самой последней версии. Это последняя версия с сайта Атмел, которая идет одним екзешником и ее легко может проинсталить любой новичек. Все что позже, поставляеться каким-то набором файлов, и я незнаю, как его установить.
Последний раз редактировалось Пока_без_кота Ср окт 18, 2017 07:55:56, всего редактировалось 2 раз(а).
Ха... Я думал точно так, как Вы сказали, но если я так делал, мне вместо варнинга выдавался уже error: conflicting types for 'SendStr_P'. Посчитав, что варнинг лучше чем еррор, я оставил как было...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 45
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения