Сергей Борщ 140 30 марта, 2022 Опубликовано 30 марта, 2022 · Жалоба 7 минут назад, jcxz сказал: Если так делать, то невозможно будет перейти из основного приложения в загрузчик. Я только мысль подал - что есть уже готовые флаги и не нужно ничего мудрить с NOINIT. Там есть и другие флаги. Сам я делаю if(!(RCC->CSR & RCC_CSR_SFTRSTF)) {запускаем приложение;} {иначе запускаем загрузчик;} Но изначально речь шла о заглушке вместо загрузчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 239 30 марта, 2022 Опубликовано 30 марта, 2022 · Жалоба 9 минут назад, Arlleex сказал: NVIC_SystemReset(). Опять же, в случае, если приложение может генерировать программный сброс только для входа в этот самый прошиватор. Я имею в виду, что если делать как предложил Сергей Борщ: переход из загрузчика в рабочее приложение осуществлять через программный сброс, а потом в бутлоадере сразу передавать управление в рабочее ПО если по регистрам видно, что сброс был программный. То тогда загрузчик не сможет отличить свой собственный сброс от сброса из прикладного кода, когда тот хочет передать ему управление. И будет сразу прыгать на рабочий код. PS: Можно конечно использовать несколько типов программных сбросов: кроме системного, ещё и от WDT например. Но я у себя предпочёл просто перед переходом на прикладной код, всю использованную периферию отключить программно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 30 марта, 2022 Опубликовано 30 марта, 2022 · Жалоба 3 часа назад, jcxz сказал: ... LDMIA R0!, {R1, R2} ... Write-back в R0 у LDMIA имеет какой-то особый смысл или просто исторически перекочевало откуда-то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 239 30 марта, 2022 Опубликовано 30 марта, 2022 · Жалоба 43 минуты назад, Arlleex сказал: Write-back в R0 у LDMIA имеет какой-то особый смысл или просто исторически перекочевало откуда-то? Без него длина команда будет == 4 байта. Зачем? Thumb2 он такой - не симметричный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 30 марта, 2022 Опубликовано 30 марта, 2022 · Жалоба 6 минут назад, jcxz сказал: Без него длина команда будет == 4 байта. А, точно, на это я внимания не обратил как раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба сделал загрузчик загрузчик всегда по адресу 0x80000000 основная прога всегда по адресу 0x800A000 дополнительная прошивка идет по радиоканалу и стуртует с адреса 0x804A000 прошивка пришется во fram память загрузчик при старте смотрит флаги: успешно ли переписалась, проверяет контрольную сумму и делает некооторые другие телодвижения выше писалось что после джампа должно быть так, как будто после старта процессора, то есть инициализация периферии и прочее я не стал делать HAL_DeInit() в загрузчике и ПЕРЕД jmp запускаю watchdog который должна сбросить новая прошивка - если что то пошло не так, то загрузчик после сброса проверяет флаги RCC->CSR и если был сброс по watchdog то он запускает основную прогу по первому адресу 0x8000A000 еще такие несколько вопросов 1) как в программе сделать так, чтобы она понимала что работает под отладкой? то есть чтобы при подсоединенном ST-link выполнялся вот этот кусок кода: /* Если вектор у нас перенесен в принципе это нужно только при работе с отладчиком */ __disable_irq(); SCB->VTOR = 0x8000000 + 0x4A000; __enable_irq(); а при обычной работе не выполнялся. 2 как сделать в линкерфайле константу FLASH_OFFSET, которая бы читалась и сишным файлом? FLASH_OFFSET = 0x4A000; /* Memories definition */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 320K FLASH (rx) : ORIGIN = 0x8000000 + FLASH_OFFSET, LENGTH = 0x40000 - FLASH_OFFSET } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 1 час назад, inventor сказал: ...как в программе сделать так, чтобы она понимала что работает под отладкой? Бит C_DEBUGEN в регистре DHCSR. Только не помню, устанавливает ли его отладчик при запуске программы без отладочной сессии. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 239 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 1 час назад, inventor сказал: основная прога всегда по адресу 0x800A000 Странный какой-то адрес. Не знаю о каком МК идёт речь - а какие в нём размеры/границы секторов стирания? И не потрёте ли часть загрузчика, стирая место под рабочую прошивку? 1 час назад, inventor сказал: прошивка пришется во fram память загрузчик при старте смотрит флаги: Куда пишется??? У вашего микроконтроллера FRAM вместо FLASH? Ничего не понятно о чём речь... 1 час назад, inventor сказал: то есть чтобы при подсоединенном ST-link выполнялся вот этот кусок кода: /* Если вектор у нас перенесен в принципе это нужно только при работе с отладчиком */ __disable_irq(); SCB->VTOR = 0x8000000 + 0x4A000; __enable_irq(); а при обычной работе не выполнялся. Во-первых: это не нужно. Во-вторых: прибивать константами адреса - плохой стиль. Всё делается очень просто: u32 j; assert(!((u32)&__vector_table << 32 - 10), 0); if ((j = (u32)&__vector_table) >= 0x20000000) j |= B29; NVIC.VTOR = j; Выполняется всегда (не надо определять наличие эмулятора). __vector_table должна быть слинкована в начала образа прошивки. Это конечно если речь про Cortex-M.... 1 час назад, inventor сказал: 2 как сделать в линкерфайле константу FLASH_OFFSET, которая бы читалась и сишным файлом? Научитесь уже наконец: 1) указывать наименование МК, о котором спрашиваете; 2) компилятор о котором спрашиваете; 3) если пишете о каких-то прочих компонентах системы (память и пр.), научитесь описывать, что это такое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 1 hour ago, Arlleex said: Бит C_DEBUGEN в регистре DHCSR. Только не помню, устанавливает ли его отладчик при запуске программы без отладочной сессии. спасиб, работает, 1-й бит и еще такой вопрос: как из загрузчика передать параметр в функцию main() прошивки? 15 minutes ago, jcxz said: Куда пишется??? У вашего микроконтроллера FRAM вместо FLASH? Ничего не понятно о чём речь.. загрузчик живет по адресу 8000000h прошивка грузится по радио каналу во fram память - внешнюю микросхему она проверяется , контрольная сума и некоторые флаги и потом переписывается на внутреннюю flash с начального адреса 804A000h и на этот адрес передается управление если какие то проблемы и не прогрузилось - то управление возвращается после сброса по старому адресу 800a000 15 minutes ago, jcxz said: Научитесь уже наконец: 1) указывать наименование МК, о котором спрашиваете; 2) компилятор о котором спрашиваете; 3) если пишете о каких-то прочих компонентах системы (память и пр.), научитесь описывать, что это такое. контроллер f4 - stm32l496 компилятор stm студия Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 46 минут назад, inventor сказал: и еще такой вопрос: как из загрузчика передать параметр в функцию main() прошивки? Самый простой способ - через известный линкеру кусочек RAM с заранее предопределенным атрибутом UNINIT со стороны приложения. 52 минуты назад, jcxz сказал: if ((j = (u32)&__vector_table) >= 0x20000000) j |= B29; Почему просто не j = (u32)&__vector_table? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 239 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 29 минут назад, Arlleex сказал: Почему просто не j = (u32)&__vector_table? Перестраховка. В мануалах на некоторые МК на Cortex-M в описании этого регистра есть описание 29-го бита (бит TBLBASE). LPC17xx: Цитата [29:8] TBLOFF Vector table base offset field. It contains bits[29:8] of the offset of the table base from the bottom of the memory map. Remark: Bit[29] determines whether the vector table is in the code or SRAM memory region: Bit[29] is sometimes called the TBLBASE bit. • 0 = code • 1 = SRAM. XMC4xxx: Цитата Vector table base offset field It contains bits[29:10] of the offset of the table base from the bottom of the memory map. Note: Bit[29] determines whether the vector table is in the code or SRAM memory region: 0 = code 1 = SRAM Bit[29] is sometimes called the TBLBASE bit. Считаю всё что >= 0x20000000 - ОЗУ. PS: Но даже на тех МК, где такое не указано (STM32F4), у меня используется эта же строчка. ОЗУ выше 0x20000000 там есть (0xD0000000), но таблицу прерываний я не пробовал в нём располагать. Надо будет как-нить попробовать проверить - с установленным 29-м и со сброшенным. Будет ли работать.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 18 апреля, 2022 Опубликовано 18 апреля, 2022 · Жалоба 31 минуту назад, jcxz сказал: ОЗУ выше 0x20000000 там есть (0xD0000000), но таблицу прерываний я не пробовал в нём располагать... Думаю, в общем случае, работать не будет, ибо 31 и 30 биты могут быть освобождены реализацией от хранения адреса (из документации на ARM). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться