Golikov 0 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба ножка? Одна единственная на кнопке? Которая и в основной программе остается такой же? Ну вообще да флаг через EEPROM, Еще PLL настроить, но это делается и в основной проге, просто данный момент пропускается... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба Флаг надо както передать. EEPROM? Зачем EEPROM? При "теплом" сбросе содержимое ОЗУ на чипе сохраняется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба ножка? Одна единственная на кнопке? Которая и в основной программе остается такой же? Ну вообще да флаг через EEPROM, Еще PLL настроить, но это делается и в основной проге, просто данный момент пропускается... Не только ножка. Состояние прерываний остается тем же. То есть, если они запрещены, то в основной программе надо explicitly разрешать. По прежнему не вижу большого смысла в выполенении ресета Зачем EEPROM? При "теплом" сбросе содержимое ОЗУ на чипе сохраняется. А в чем разница? Разве не по офному и тому же аддрессу переход происходит пристарте? Каким волшебным образом при холодном старте обнуляется RAM, если не самой программой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба от ресета внутренне спокойно... вот что кеил написал в хелпе __disable_fiq Typically, this intrinsic disables FIQ interrupts by setting the F-bit in the CPSR. However, for v7-M it sets the fault mask register (FAULTMASK). FIQ interrupts are not supported in v6-M. то есть на самом деле это от 7 армов тянется, и несмотря что FIQ сменилось с быстрых на ошибочные, это все равно не для кортексов М Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба ну то есть надо понимать что осталось одно __disable_irq(); которое глушит все кроме ресета и NMI? Почему? __disable_irq() это : CPSID i ; Disable interrupts and configurable fault handlers (set PRIMASK) HardFault не запрещается после __disable_irq. HardFault запретится после CPSID f. Вроде так выходит... А в чем разница? Разве не по офному и тому же аддрессу переход происходит пристарте? Каким волшебным образом при холодном старте обнуляется RAM, если не самой программой? Обнуляется программой...Можно зарезервировать ячейку в ОЗУ и проверять её на старте и в зависимости от её значения решать что делать дальше - запускать программу, запускать бут или ещё что-то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба Из User Guide на Cortex-M Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба путано написано, в описании на проц LPC1768, в части про кортекс м3 есть запись про HARDFAULTMASK, в наборе инструкций кортекса м3 есть такое... В описании на серию кортексов М0-4, нету... даже нет HardFaule Mask регистра.... и как это понимать? поправочка------------- http://infocenter.arm.com/help/index.jsp?t...a/CHDBIBGJ.html у М3, и М4 есть, называется FAULTMASK, и флажочек тоже есть The FAULTMASK register prevents activation of all exceptions except for Non-Maskable Interrupt (NMI). See the register summary in Table 2.2 for its attributes. The bit assignments are: получается его одного достаточно чтобы все выключить? даже примаск? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба путано написано, в описании на проц LPC1768, в части про кортекс м3 есть запись про HARDFAULTMASK, в наборе инструкций кортекса м3 есть такое... В каком пункте мануала про HARDFAULTMASK написано? получается его одного достаточно чтобы все выключить? даже примаск? Получается достаточно - кроме NMI и Reset. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба Обнуляется программой...Можно зарезервировать ячейку в ОЗУ и проверять её на старте и в зависимости от её значения решать что делать дальше - запускать программу, запускать бут или ещё что-то. Это значит надо писать собственный startup файл. Тоже можно, конечно.. Но по мне так это уже извращения пошли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба Это значит надо писать собственный startup файл. Тоже можно, конечно.. Но по мне так это уже извращения пошли. Стартапа бояться - загрузчик не писать. Ну что за цирк, ей-богу :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба Стартапа бояться - загрузчик не писать. Ну что за цирк, ей-богу :-) А мы без всяких самодельных стартапов и ресетов обошлись. Чем больше меняешь, тем больше багов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба Это значит надо писать собственный startup файл. Тоже можно, конечно.. Но по мне так это уже извращения пошли. Можно отредактировать startup, который есть: всего-то несколько строк добавить. if ((FlashCrcOk()) && (StartType==START_APPLICATION)) { __disable_irq(); __set_MSP(*(uint32_t *)0x1008); ISRPtr application_reset_handler=(ISRPtr)(*(uint32_t *)0x100C); goto *application_reset_handler; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба А мы без всяких самодельных стартапов и ресетов обошлись. Чем больше меняешь, тем больше багов. На самом деле бывает полезно разбираться в стартапе. Тем более на Cortex-M минимальный стартап - это всего несколько строчек: #include <string.h> extern char __etext, __data_start__, __data_end__, __bss_start__, __bss_end__; extern int main(); void __attribute((used)) Reset_Handler(void) { /* copy-init variables */ memcpy(&__data_start__, &__etext, &__data_end__ - &__data_start__); /* zero-init variables */ memset(&__bss_start__, 0, &__bss_end__ - &__bss_start__); (void)main(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба Это не стартап, это ресет хэндлер. Никто не спорит про разобратся, но переделывать не вижу смысла. В любом случае, как обслуживать ситуацию, когда в данной ячейке при холодном старте флаг случайно совпал с тем, который выставляется для прыгания в главную программу? Может еще один флаг добавим? Может, CRC считать начнем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 21 мая, 2014 Опубликовано 21 мая, 2014 · Жалоба Это не стартап, это ресет хэндлер. Ну так стартап состоит из двух частей - таблицы векторов и Reset_Handler-а. Таблица у каждого МК своя и её менять не надо. В любом случае, как обслуживать ситуацию, когда в данной ячейке при холодном старте флаг случайно совпал с тем, который выставляется для прыгания в главную программу? Маловероятно... Может еще один флаг добавим? Может, CRC считать начнем? К тому же CRC прошивки посчитать всё равно желательно, а то вдруг там пусто. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться