Перейти к содержанию
    

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверял. Смещение текущего прерывания четко определяет без ошибок.

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

push() вызывает перепланировку. Взводит флаг прерывания PendSV.

 

Есть ещё одна мысль. А вы в прерываниях не забыли объявить OS:TISRW?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Изменено пользователем sevstels

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

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

 

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

 

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

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

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

 

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...