Сергей Борщ 140 18 июля, 2006 Опубликовано 18 июля, 2006 · Жалоба Лучше конечносделать как надо, но для small 1040 байт, а tiny 970. Где то может и сыграть размер кода.Пока хватает 256 байт ОЗУ можно и Tiny, но тогда и .xcl надо брать для модели Tiny, т.е. с "t" на конце. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 18 июля, 2006 Опубликовано 18 июля, 2006 · Жалоба Лучше конечносделать как надо, но для small 1040 байт, а tiny 970. Где то может и сыграть размер кода.Пока хватает 256 байт ОЗУ можно и Tiny, но тогда и .xcl надо брать для модели Tiny, т.е. с "t" на конце. ИМХО лучше делать исходник так, чтобы работало на всех моделях памяти... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 18 июля, 2006 Опубликовано 18 июля, 2006 · Жалоба Так до меня и не дошли все команды для самопрогаммирования AVR109 - Self-programming: _WAIT_FOR_SPM(); // ожидание готовности _ENABLE_RWW_SECTION(); // очиска буфера и разрешение записи в сегмент RWW _PAGE_WRITE( address); // запись в страницу по адресу address #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr. #pragma diag_default=Pe1053 // Back to default. эти 2 прагмы выкл. и вкл. ругань на преобразование переменной _FILL_TEMP_WORD(*address,data); // это запись в буфер? Как я понял адреса в буфере это биты с 0 по 4, адреса страниц это с 5 по 11 биты. данные для загрузки в буфер 2 байта (unsigned short). Чтение из flash _LOAD_PROGRAM_MEMORY((address ) не понял так же что за преобразование адресов address << 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 18 июля, 2006 Опубликовано 18 июля, 2006 · Жалоба Так до меня и не дошли все команды для самопрогаммирования AVR109 - Self-programming: _WAIT_FOR_SPM(); // ожидание готовности _ENABLE_RWW_SECTION(); // очиска буфера и разрешение записи в сегмент RWW _PAGE_WRITE( address); // запись в страницу по адресу address #pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr. #pragma diag_default=Pe1053 // Back to default. эти 2 прагмы выкл. и вкл. ругань на преобразование переменной _FILL_TEMP_WORD(*address,data); // это запись в буфер? Как я понял адреса в буфере это биты с 0 по 4, адреса страниц это с 5 по 11 биты. данные для загрузки в буфер 2 байта (unsigned short). Чтение из flash _LOAD_PROGRAM_MEMORY((address ) не понял так же что за преобразование адресов address << 1 Я Вам предлагаю не заморачиваться с AVR109, (хотя и не забывать про его исходники), а почитать даташит на любой MegaAVR, а именно раздел Boot Loader Support -> Self Programming Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 19 июля, 2006 Опубликовано 19 июля, 2006 · Жалоба Рекомендую читать вопрос и весь топик, а не часть. Я хочу сделать загрузчик в IAR на Си. максимально использовав возможности IAR. Вопрос остался. Видимо предется методом научного тыка Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
osnwt 0 19 июля, 2006 Опубликовано 19 июля, 2006 · Жалоба Вопрос остался. Видимо предется методом научного тыка Лучший метод - отключить всю оптимизацию и изучить код, генерируемый указанными функциями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 19 июля, 2006 Опубликовано 19 июля, 2006 · Жалоба уже сделал. оптимизация не мешает - функции специфические. В примере 309 наворочили с адресами и заносом данных в буфер. в сделаное ими не въехал и засомневался. Но уже разобрался Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 25 июля, 2006 Опубликовано 25 июля, 2006 · Жалоба Получается менять код. Есть тонкости: по аплекейшену 2 Б адреса разделяются так: биты 0-4 это адрес слова в буфере, а с 5 по 11 - номер страници. Реально диапазон в буфере 0-63, т.е 0-5 биты. и адреса страниц с 6 - 12 биты. Это способ адресации в IAR, как я понял. Прогу еще не закончил - интерфейс доделываю и алгоритм записи. Но уже вижу проблемы с размером загрузщика - в 1 КБ не уложусь, а место свободного мало. Вот думаю, - А что если из основной программы убрать функции связи дублированные в загрузщике? Вот объявил я в main функцию и указать ее размещение? Или надо в одном проекте делать? Или еще есть варианты? Я понимаю что Си не даст компактный код всравнении с asm, но хочется доделать все в Си. Про обещеныю апликуху "как в IAR на Си сделать загрузчик в виде отдельного проекта" я помню. постараюсь в ближайшее время доделать pfuhepobr и написать апликуху Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 2 августа, 2006 Опубликовано 2 августа, 2006 · Жалоба вот моя апликуха по написанию загрузчика по итогом этой ветки. Высказывайте критеку. в_среде_IAR.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 2 августа, 2006 Опубликовано 2 августа, 2006 · Жалоба вот моя апликуха по написанию загрузчика по итогом этой ветки. Высказывайте критеку.Молодец! Первая ласточка в FAQ. "необходимо отредактировать файл lnkm8s.xcl" - лучше все же скопировать его в папку проекта и редактировать копию - а то потом остальные проекты (которые использовали lnkm8s.xcl) перестанут работать. Еще можно добавить в какой папке искать этот файл (\avr\config). -H1895 -h(CODE)1C00-1C25 /*Fill unused interrupt vector's with RETI */ Не нужно. Правильно написанная программа не должна влетать в ненужные вектора, а эту память можно использовать под код (загрузчик обычно стремится занять всю отведенную память и еще чуть-чуть:-) "Тогда файл будет браться из Workspace проекта" - из папки проекта (гдe лежит .ewp). В Workspace обычно куча проектов из разных папок. #include "inavr.h" #include "iom8.h" #include "stdio.h" #include "flash.h" 1) первые три файла надо указать в угловых скобках. 2) вместо #include "iom8.h" #include <ioavr.h> - тогда нужный ioxxx.h будет подставлятся автоматически исходя из настроек проекта и исчезнет warning35 при линковке многофайловых пректов. 3) flash.h - файл явно не из комплекта компилятора, поэтому надо упомянуть где его брать. цикл я бы сделал иначе: #include <intrinsics.h> #define PAGE_SIZE 64 void update_Page(uint8_t *str) { uint8_t Buf_Address = PAGE_SIZE; uint8_t *ptr = str + 3 + PAGE_SIZE; do { uint16_t data = (uint16_t)*--ptr << 8; data |= *--ptr; _SPM_FILLTEMP(Buf_Address, data); } while (Buf_Address-=2); } И по ошибкам: "критЕку", "возможностями среда IAR", "что адре байта" Buf_Adres -> Buf_Address, NumbePageWrite -> NumberPageWrite P.S. с pgmspace.h так и не разобрались? У меня получилось такое: (для AVR231): #include <intrinsics.h> static void spmWriteWord(unsigned char APPFLASH *addr, unsigned int data) {_SPM_FILLTEMP(addr, data);} static int spmReadWord(unsigned char APPFLASH *addr) { return *addr; } static void spmErasePage(unsigned char APPFLASH *addr) { _SPM_ERASE(addr); while(SPMCR & (1<<0)); } static void spmProgramPage(unsigned char APPFLASH *addr) { _SPM_PAGEWRITE(addr); while(SPMCR & (1<<0)); } static void spmEEWriteByte(unsigned int addr, unsigned char data) { __EEPUT(addr, data); } static void spmWriteLockBits(unsigned char data) { _SPM_LOCKBITS(data); while(SPMCR & (1<<0)); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба спасибо! коечто поправлю, что то добавлю. По поводу основного цикла: выглядит изящней, но после оптимизации выгрышь от применения указателя и декремента быть не должно. Эксперементировал с кодом и оптимизацией и заметил такую вещь. Мой вариант легче читается для новичков. приведу 2 варианта. Кстати, unsigned int в разных компиляторах имеет разный размер, а unsigned short везде 2 байта. P.S. с pgmspace.h так и не разобрались? Упустил из вида. Можете кратко сказать с чем его едят? поткоректирую - будет скоро готов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба спасибо! коечто поправлю, что то добавлю. По поводу основного цикла: выглядит изящней, но после оптимизации выгрыша от применения указателя и декремента быть не должно. Проверил. При оптимизации по размеру разница есть - 32/44 байта: вы твоем str+Buf_Adres вычисляется дважды внутри цикла, хотя +3 встроено в команду LDD: LDD Z+3. При оптимизации по скорости разница больше - 32 / 46 байт, хотя суммирование вынесено за цикл. И все равно остается сравнение с 64 в конце цикла. А если str передавать как параметр, да еще перед функцией __x поставить - мой вариант получается еще лучше - 26 байт, а твой так и остается в районе 40. (я делал только цикл). Выигрыш получился имеено за счет указателя и того, что в результате вычисления Buf_Address-=2 сам собой получается флаг Z который тут же можно использовать для проверки окончания. Эксперементировал с кодом и оптимизацией и заметил такую вещь. Мой вариант легче читается для новичков. приведу 2 варианта. Тогда для улучшения наглядности рекомендую такой вариант: str += 3; do { data = str[Buf_Adres+1]; data <<= 8; data |= str[Buf_Adres]; или str += 3; do { data = str[Buf_Adres++]; data |= (uint16_t)str[Buf_Adres++] << 8; а еще лучше str += 3; do { data = *str++; data |= (uint16_t)*str++ << 8; Новичков надо сразу приучать писать оптимально. Раз str больше не нужен, нет смысла его хранить неизменным. Пусть указывает на текущий байт. Тогда одной командой LD Rn, X+ сразу делаем и загрузку и передвигаем указатель. Кстати, в последнем варианте цикл получился 30 байт независимо от оптимизации. Кстати, unsigned int в разных компиляторах имеет разный размер, а unsigned short везде 2 байта. На эту тему много копий поломали с dxp в личной переписке (каждый остался при своем). Я не нашел в имеюмщемся у меня стандарте (ISO/IEC 9899) описания размеров данных. На всех известных мне компиляторах unsigned short действительно 2 байта. Но мне больше нравится подход с использованием заголовочного файла stdint.h. Объявленые в нем типы uint8_t, uint16_t, int8_t и т.д. имеют один и тот же размер всегда и везде. P.S. с pgmspace.h так и не разобрались? Упустил из виду. Можете кратко сказать с чем его едят? подкоректирую - будет скоро готов. "Говорю одно, делаю третье, думаю второе". Имел в виду intrinsics.h. Можно указать, что функции работы с флешкой описаны в файле intrinsics.h, тогда код будет самодостаточен - не нужны левые flash.h. Пришли (в почту) файл flash.h, я посмотрю как его макросы заменить на функции из intrinsics.h. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 3 августа, 2006 Опубликовано 3 августа, 2006 · Жалоба над циклом подумаю. файл прикладываю здесь - не смог приатачить к письму. с intrinsics.h не ковырялся т.к. был дан flash файл и на нем зациклился и эксперементировал. flash.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 18 августа, 2006 Опубликовано 18 августа, 2006 · Жалоба Выкладываю подправленую версию. Сергей Борщ, если с intrinsics.h что то получилось - сообщите bootloader_IAR.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arttab 0 4 сентября, 2006 Опубликовано 4 сентября, 2006 · Жалоба Модератор или кто статьями занимается - может в статьи поместить. Глядишь часть вопросов отпадет у людей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться