Обсуждаем контроллеры компании Atmel.
Ответить

Re: BOOTLOADER: вопросы

Вт июл 05, 2022 20:29:33

OKF писал(а):Другой вариант - просто без изгалений, которые непонятно заради чего.
Как ради чего? Ему нужно было автоматизированный процесс создания "содержание названий функций", что бы после по названию функций обращаться, он его создал.
OKF писал(а): Что бы чел мог взять и скомпилить вообще другим компилятором.
Другим компилятором это каким? Iar, Keil, cvavr или еще каким?

Re: BOOTLOADER: вопросы

Чт июл 07, 2022 09:02:11

Какая разница. Любым другим, не GCC. Понятно, что у каждого свой доступ к памяти программ, свои наименования векторов и пр. Но если "нормально" написано, то всё переносится. На то он и Си.

Re: BOOTLOADER: вопросы

Чт июл 07, 2022 10:43:20

так и у меня все переносится, что и было доказано сборкой проекта под stm32.

а загрузчик без шаманства не сделать в принципе. во всяком случае для AVR.

Re: BOOTLOADER: вопросы

Чт июл 07, 2022 13:54:37

OKF писал(а):Но если "нормально" написано, то всё переносится.
А что не так?

Или вы хотите универсальный код не только под все типы компиляторов, да в добавок еще и под все типы контроллеров? Не, так не бывает.

Вам исходник дали, это уже очень много, тормошите его на свое усмотрение.
Автор вообще мог ограничиться одним hex-файлом и одним типом контроллера, и усе.

Re: BOOTLOADER: вопросы

Ср сен 07, 2022 10:49:49

что-то я попал в какой-то странный ступор - не могу понять, что происходит...
Код:
   flash_page_addr = 0;
   // главный цикл загрузки
   do {
      // очищаем страницу
      memset(page, 0xFF, SPM_PAGESIZE);
      // заполняем страницу
      for(page_ofs = 0; page_ofs < SPM_PAGESIZE; page_ofs += IO_BLOCK_SIZE){
         put_byte(SYM_READY);
         wdt_enable(WDTO_500MS);
         byte = get_byte();
         wdt_disable();
         // при приеме символа данных
         switch(byte){
         case SYM_DATA:
            // загружается очередная порция данных.
            io_get(page + page_ofs, IO_BLOCK_SIZE);
            break;
         case SYM_END:
            page_ofs = SPM_PAGESIZE;
            break;
         }
      }
      // после заполнения страницы выдаём стоп-символ
      put_byte(SYM_WAIT);
      // если начали обновление - прошивка недействительна
      eeprom_update_byte(BOOT_FLAG_ADDR, 0xFF);
      // После приема данных для целой страницы памяти выполняется прожиг страницы.
      program_page(flash_page_addr, page);
      flash_page_addr += SPM_PAGESIZE;
      // При приёме символа конца данных индицируется состояние завершения.
      if(byte == SYM_END)   {
         // Устанавливается флаг корректности прошивки
         eeprom_update_byte(BOOT_FLAG_ADDR, FLAG_OK);
         eeprom_busy_wait();   // ждем конца записи
         asm volatile ("jmp 0x0000"); // и выполняется старт прошивки путем перехода на нулевой адрес.
      }
      // И так повторяется, пока не придет признак конца данных или все страницы будут прожжены.
   } while(flash_page_addr < (0x7000));

вот это код рабочий, если IO_BLOCK_SIZE равно 8 или 16, и не рабочий, если, например, 32 или 64.
самое удивительное - нерабочесть кода заключается в том, что флаг корректности прошивки после завершения не устанавливается (остаётся 0xFF)! сама прошивка при этом верная (если программатором принудительно прошить нужное значение флага в EEPROM, то прошивка стартует и работает).

с какого перепугу такое поведение?! какие будут идеи?

Re: BOOTLOADER: вопросы

Ср сен 07, 2022 14:27:16

ARV, хороший вы парень, но. Пишите вы как то не аккуратненько. Я бы даже сказал, по селянски.)
Мало того что отступы то так, то эдак (как бог на душу положит), так и пример не можете привести дабы кто то мог повторить. Или же мы должны аналитически (через анал?) войти в ваше положение? Я в вас разочаровываюсь.( Ну, понятно что вам насрать, но тем не менее, моё мнение вы услышали.

Re: BOOTLOADER: вопросы

Ср сен 07, 2022 15:48:18

спасибо, вы мне очень помогли!

Re: BOOTLOADER: вопросы

Ср сен 07, 2022 16:08:57

А с фига ли! Вы ведь думаете только о себе!
Ага, вот у меня проблема... И что? Пальцем даже не пошевелите...
Нах-нах. Извините.

Re: BOOTLOADER: вопросы

Ср сен 07, 2022 19:00:04

ARV, я когда экспериментировал с W25Q32 записывал целые мегабайтные mp3, а не только несколько байт.
Вот пример моего кода

Re: BOOTLOADER: вопросы

Ср сен 07, 2022 20:27:49

Dimon456, это немного не то... у меня проблема в том, что код, который как бы не должен зависеть от значения константы, тем не менее зависит от неё, причем в таком месте, где вообще связи не должно быть с этой константой!

Добавлено after 4 minutes 30 seconds:
OKF писал(а):отступы то так, то эдак (как бог на душу положит)
это с чего вдруг?! отступы строго по уровню вложенности кода
OKF писал(а):пример не можете привести дабы кто то мог повторить
а в чем смысл повторения? чтобы повторить загрузчик, надо не только код для МК повторить, но и компьютерную программу... уверен на 100%, что никто не станет этого делать.

пример кода приведен, проблема описана. тут либо я просто замыленным глазом не вижу явного ляпа, либо есть какой-то странный нюанс, о котором я не знаю... может, особенность компилятора, может, особенность МК... не могу даже представить.

OKF писал(а):Вы ведь думаете только о себе!
по вашему поведению видно, что вы уж точно о себе не думаете - самоотверженно срёте в теме с важными вопросами...

Re: BOOTLOADER: вопросы

Ср сен 07, 2022 21:05:52

ARV, проблема в том что вы не можете отследить это в реальном устройстве.
Обыкновенный bootloader avr_isp и то не так сделан как у вас, не понимаю, за чем изобретать велосипед.
Я бы взял готовый код и изменил его под свои нужды.

Re: BOOTLOADER: вопросы

Ср сен 07, 2022 21:15:37

Dimon456 писал(а):Я бы взял готовый код и изменил его под свои нужды
вы же понимаете, что готовый код на 90% состоит из протокола обмена данными между компьютером и МК? используя готовый код вы соглашаетесь с этим протоколом, и используете уже имеющуюся компьютерную утилиту, которая по этому протоколу кормит данными загрузчик... вот вам и причина изобретения велосипеда: если этот протокол не устраивает или сама утилита не устраивает, то...

еще раз: проблема не в самом по себе коде, а в том, что по абсолютно неизвестной причине после успешного завершения прошивки не записывается байт в EEPROM, если размер блока данных, которые посылает компьютер, больше 16 байт. только это, больше никаких комментариев мне не нужно...

Re: BOOTLOADER: вопросы

Ср сен 07, 2022 21:21:16

ARV писал(а):если размер блока данных, которые посылает компьютер, больше 16 байт. только это,
Что?
ARV писал(а):нерабочесть кода заключается в том, что флаг корректности прошивки после завершения не устанавливается
ARV писал(а):// При приёме символа конца данных индицируется состояние завершения.
SYM_END ?
Вы что не можете отследить что комп передает, и что в результате получает МК? Блин, я анализатор трафика ставил для этого.

Re: BOOTLOADER: вопросы

Ср сен 07, 2022 21:37:32

Dimon456 писал(а):Что?
я понимаю, что каждый больше писатель, а не читатель, но мне казалось, что я достаточно детально описал ЧТО.
Dimon456 писал(а):Вы что не можете отследить что комп передает
а вы можете отследить мысль в моём вопросе? надеюсь, вы догадываетесь, что я не стал бы спрашивать на форуме совета, если бы вопрос не был из ряда вон выходящим? уж какие-никакие навыки по поиску ошибок и отладке у меня имеются...

комп передает данные верно, и МК верно их принимает и прошивает, я об этом писал:
ARV писал(а):сама прошивка при этом верная (если программатором принудительно прошить нужное значение флага в EEPROM, то прошивка стартует и работает).
проблема в том, что по неизвестной причине на запись в EEPROM вот в этом месте
Код:
         // Устанавливается флаг корректности прошивки
         eeprom_update_byte(BOOT_FLAG_ADDR, FLAG_OK);
         eeprom_busy_wait();   // ждем конца записи
         asm volatile ("jmp 0x0000"); // и выполняется старт прошивки путем перехода на нулевой адрес.
влияет размер блока данных при обмене с компом!
IO_BLOCK_SIZE - это константа, задаваемая дефайном (одинаково для МК и для программы компа), она задает размер блока и может быть 8, 16, 32, 64 или 128 по моему хотению. но все работает только для 8 и 16, а для остального - прошивается верно, но в EEPROM не появляется отметки о верности прошивки!!!

ПОЧЕМУ?!

Re: BOOTLOADER: вопросы

Ср сен 07, 2022 23:24:45

а вообще функция eeprom_update_byte что-то записывает? пусть не FLAG_OK, а другое значение?
а при размере более 16 байт может что-то затирается в ОЗУ и потом считывается не то, что там должно быть?

Re: BOOTLOADER: вопросы

Чт сен 08, 2022 06:13:25

эта функция вообще записывает, например, ранее по коду есть участок, где эта функция записывает 0xFF, которое потом и не перезаписывает...

что касается затирания, то по коду это никак не просматривается, алгоритм цикла не должен ничего лишнего затирать...

Re: BOOTLOADER: вопросы

Чт сен 08, 2022 09:18:15

то, что не должно, это понятно.
но что-то более длинный блок данных портит, если с ним перестает правильно работать.

Re: BOOTLOADER: вопросы

Чт сен 08, 2022 20:46:15

ARV, извиняйте, я вчера немного погорячился.( Вы не сказали стартует ли сразу после записи?

Re: BOOTLOADER: вопросы

Чт сен 08, 2022 21:10:32

сразу после записи стартует при блоке 8 или 16 байт, при других не стартует.

Re: BOOTLOADER: вопросы

Чт сен 08, 2022 21:13:50

Тогда Dimon прав. Не получаете SYM_END.
Ответить