Jump to content

    
Gradient

Перенос векторов прерываний в nRF51822

Recommended Posts

Ух ты, сколько интересного я пропустил:)

 

Предлагаю попробовать сделать форвардер на каждый вектор в отдельности. Возможно, глючит определение активного прерывания.

 

ЗЫ. И надо бы это обсуждение в отдельную тему вынести.

Share this post


Link to post
Share on other sites

Проверял. Смещение текущего прерывания четко определяет без ошибок. Более того, bootloader полностью рабочий через форвардер, пишет, проверяет, запускает. Прерывания нормально используются, ничего не крэшится.

 

Трудности начинаются в приложении. Оно под scmRTOS, поэтому и написал в эту ветку, тк причина была не совсем очевидна.

Share this post


Link to post
Share on other sites
Проверял. Смещение текущего прерывания четко определяет без ошибок.

 

И тем не менее. Попробуйте сделать пять-шесть отдельных обработчиков (думаю, для тестового приложения хватит), каждый из которых проверяет переменную "работает_приложение", и прыгает на соответствующий обработчик в приложении. Возможно по шагам оно всё хорошо работает, а без отладки, да ещё при наложении прерываний - плохо.

 

Кстати, использовать очереди в прерываниях очень даже можно. Единственное условие - проверять, что в очереди есть место.

Share this post


Link to post
Share on other sites

Уже этот вариант тестил. В ОЗУ выделил константу, которую приложение на старте инит величиной смещения своих векторов. Для бута значение одно, для приложения - совсем другое. Это делается при запрещенных прерываниях на самом старте.

Примите во внимание момент. Если не дергать метод push(), то приложение не падает. Все прерывания четко отработывают, их 6.

Share this post


Link to post
Share on other sites

Нет, все на месте, первым делом макрос проверяю. Вероятно все же дело в функции форварда векторов, вернее в нюансах ее сборки компилятором. Я в arm asm не силен, видимо придется вникать чтоб разобраться. Тк у гуру походу тоже идей нет.

 

Edited by sevstels

Share this post


Link to post
Share on other sites
Производитель еще тот крендель. Они ничего не рекомендуют кроме своих сборок. Обойти их безумный индуский код стороной - было лучшее решение в данном случае.

 

Вероятно они поленились и в их 'авторско горяче-финской' модификации ядра никак не предусмотрен перенос векторов. Теперь каждый спасется как может...

Глянул форум Нордика, действительно, есть только такое единственное предложение по ремапу векторов. Видимо и в их библиотеках применяется подобный метод, который они называют MBR. Так что метод должен работать, видимо дело в нюансах, что-то упустили.

 

Проверял. Смещение текущего прерывания четко определяет без ошибок. Более того, bootloader полностью рабочий через форвардер, пишет, проверяет, запускает. Прерывания нормально используются, ничего не крэшится.

 

Трудности начинаются в приложении. Оно под scmRTOS...

Навскидку, если очевидные вещи вы уже проверили, еще могут быть такие узкие места:

1. Еще раз проверить функции ремапа на реентерабельность, нет ли скрытых камней при обработке вложенных прерываний.

2. Разграничение физических областей кода бутлодера и приложения. Нет ли какого-нибудь ограничения чтения одной области из другой области через какие-нибудь биты защиты кода или через MPU (Memory Protection Unit).

3. На всех ли векторах прерываний в обеих таблицах есть заглушки при неиспользуемых векторах. А то может возникнуть прерывание, на которое вы не рассчитывали, а там пустота или другой код.

Share this post


Link to post
Share on other sites

Чтобы за время вашего отпуска мысли не забылись, изложу их кратенько тут:

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 тут никак не поможет.

Share this post


Link to post
Share on other sites

Снимаю шляпу... реально гениально.

Ваша версия irq_forwarder не только быстрее но и работает.

Проверил как с векторами в flash так и в ram - падения прекратились и все работает как в приложении так и буте. Спасибо... респект.

Share this post


Link to post
Share on other sites

Напишу тут, чтоб не плодить темы.

Какая однако случилась засада!

Всегда подозревал "истинно Нордическую" фирму в очень плохом качестве поделок.

Об этом настойчиво говорил и их форум, завалено тоннами вопросов по разным багам и непоняткам в коде и доке.

Но на этот раз всё гораздо хуже и припарками не лечится...

Вообще мы тут сидим в шоке от этой новости, фактически потеря продукта от использования продукции этих мудаков.

 

Вся линейка процессоров читается с минимальными затратами

https://www.pentestpartners.com/security-blog/nrf51822-code-readout-protection-bypass-a-how-to/

https://limitedresults.com/2020/06/nrf52-debug-resurrection-approtect-bypass/

 

Побить бы дебилов ногами.. но не дотянуться

 

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.