AHTOXA 14 21 марта, 2018 Опубликовано 21 марта, 2018 · Жалоба Ух ты, сколько интересного я пропустил:) Предлагаю попробовать сделать форвардер на каждый вектор в отдельности. Возможно, глючит определение активного прерывания. ЗЫ. И надо бы это обсуждение в отдельную тему вынести. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 21 марта, 2018 Опубликовано 21 марта, 2018 · Жалоба Проверял. Смещение текущего прерывания четко определяет без ошибок. Более того, bootloader полностью рабочий через форвардер, пишет, проверяет, запускает. Прерывания нормально используются, ничего не крэшится. Трудности начинаются в приложении. Оно под scmRTOS, поэтому и написал в эту ветку, тк причина была не совсем очевидна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 21 марта, 2018 Опубликовано 21 марта, 2018 · Жалоба Проверял. Смещение текущего прерывания четко определяет без ошибок. И тем не менее. Попробуйте сделать пять-шесть отдельных обработчиков (думаю, для тестового приложения хватит), каждый из которых проверяет переменную "работает_приложение", и прыгает на соответствующий обработчик в приложении. Возможно по шагам оно всё хорошо работает, а без отладки, да ещё при наложении прерываний - плохо. Кстати, использовать очереди в прерываниях очень даже можно. Единственное условие - проверять, что в очереди есть место. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 21 марта, 2018 Опубликовано 21 марта, 2018 · Жалоба Уже этот вариант тестил. В ОЗУ выделил константу, которую приложение на старте инит величиной смещения своих векторов. Для бута значение одно, для приложения - совсем другое. Это делается при запрещенных прерываниях на самом старте. Примите во внимание момент. Если не дергать метод push(), то приложение не падает. Все прерывания четко отработывают, их 6. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 21 марта, 2018 Опубликовано 21 марта, 2018 · Жалоба push() вызывает перепланировку. Взводит флаг прерывания PendSV. Есть ещё одна мысль. А вы в прерываниях не забыли объявить OS:TISRW? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 21 марта, 2018 Опубликовано 21 марта, 2018 (изменено) · Жалоба Нет, все на месте, первым делом макрос проверяю. Вероятно все же дело в функции форварда векторов, вернее в нюансах ее сборки компилятором. Я в arm asm не силен, видимо придется вникать чтоб разобраться. Тк у гуру походу тоже идей нет. Изменено 21 марта, 2018 пользователем sevstels Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 22 марта, 2018 Опубликовано 22 марта, 2018 · Жалоба Производитель еще тот крендель. Они ничего не рекомендуют кроме своих сборок. Обойти их безумный индуский код стороной - было лучшее решение в данном случае. Вероятно они поленились и в их 'авторско горяче-финской' модификации ядра никак не предусмотрен перенос векторов. Теперь каждый спасется как может... Глянул форум Нордика, действительно, есть только такое единственное предложение по ремапу векторов. Видимо и в их библиотеках применяется подобный метод, который они называют MBR. Так что метод должен работать, видимо дело в нюансах, что-то упустили. Проверял. Смещение текущего прерывания четко определяет без ошибок. Более того, bootloader полностью рабочий через форвардер, пишет, проверяет, запускает. Прерывания нормально используются, ничего не крэшится. Трудности начинаются в приложении. Оно под scmRTOS... Навскидку, если очевидные вещи вы уже проверили, еще могут быть такие узкие места: 1. Еще раз проверить функции ремапа на реентерабельность, нет ли скрытых камней при обработке вложенных прерываний. 2. Разграничение физических областей кода бутлодера и приложения. Нет ли какого-нибудь ограничения чтения одной области из другой области через какие-нибудь биты защиты кода или через MPU (Memory Protection Unit). 3. На всех ли векторах прерываний в обеих таблицах есть заглушки при неиспользуемых векторах. А то может возникнуть прерывание, на которое вы не рассчитывали, а там пустота или другой код. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 22 марта, 2018 Опубликовано 22 марта, 2018 · Жалоба Спасибо. К сожалению таймаут на месяц. Вернусь с отпуска, продолжу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 23 марта, 2018 Опубликовано 23 марта, 2018 · Жалоба Чтобы за время вашего отпуска мысли не забылись, изложу их кратенько тут: 1) в launch_application я не заметил установки нового значения в irq_table_offset. 2) irq_forwarder писали индусы. Накой этот закат солнца вручную? "Машина должна работать, а человек - думать". С расчетом всех этих адресов прекрасно справляется компилятор : typedef void (*irq_handler_t)(void); // pointer to interrupt vectors table irq_handler_t * irq_table @ 0x20000000 = (irq_handler_t *) __section_begin(".boot_intvec"); void irq_forwarder(void) { //Branch to IPSR-th handler the irq_table irq_table[__get_IPSR()](); } 3) __root не нужен для irq_forwarder - на него есть ссылка из таблицы векторов. А если ссылки нет - то функция не нужна, ее можно выкинуть и __root тут никак не поможет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 2 мая, 2018 Опубликовано 2 мая, 2018 · Жалоба Снимаю шляпу... реально гениально. Ваша версия irq_forwarder не только быстрее но и работает. Проверил как с векторами в flash так и в ram - падения прекратились и все работает как в приложении так и буте. Спасибо... респект. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gradient 1 11 ноября, 2020 Опубликовано 11 ноября, 2020 · Жалоба Напишу тут, чтоб не плодить темы. Какая однако случилась засада! Всегда подозревал "истинно Нордическую" фирму в очень плохом качестве поделок. Об этом настойчиво говорил и их форум, завалено тоннами вопросов по разным багам и непоняткам в коде и доке. Но на этот раз всё гораздо хуже и припарками не лечится... Вообще мы тут сидим в шоке от этой новости, фактически потеря продукта от использования продукции этих мудаков. Вся линейка процессоров читается с минимальными затратами https://www.pentestpartners.com/security-blog/nrf51822-code-readout-protection-bypass-a-how-to/ https://limitedresults.com/2020/06/nrf52-debug-resurrection-approtect-bypass/ Побить бы дебилов ногами.. но не дотянуться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться