реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Перенос векторов прерываний в nRF51822
AHTOXA
сообщение Mar 21 2018, 14:51
Сообщение #16


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Ух ты, сколько интересного я пропустилsm.gif

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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sevstels
сообщение Mar 21 2018, 15:00
Сообщение #17


Знающий
****

Группа: Участник
Сообщений: 626
Регистрация: 3-12-07
Пользователь №: 32 910



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

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


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 21 2018, 15:13
Сообщение #18


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(sevstels @ Mar 21 2018, 20:00) *
Проверял. Смещение текущего прерывания четко определяет без ошибок.


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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sevstels
сообщение Mar 21 2018, 15:27
Сообщение #19


Знающий
****

Группа: Участник
Сообщений: 626
Регистрация: 3-12-07
Пользователь №: 32 910



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


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 21 2018, 18:15
Сообщение #20


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
sevstels
сообщение Mar 21 2018, 18:29
Сообщение #21


Знающий
****

Группа: Участник
Сообщений: 626
Регистрация: 3-12-07
Пользователь №: 32 910



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


Сообщение отредактировал sevstels - Mar 21 2018, 18:45


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 22 2018, 09:24
Сообщение #22


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(sevstels @ Mar 21 2018, 16:35) *
Производитель еще тот крендель. Они ничего не рекомендуют кроме своих сборок. Обойти их безумный индуский код стороной - было лучшее решение в данном случае.

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

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

Цитата(sevstels @ Mar 21 2018, 17:00) *
Проверял. Смещение текущего прерывания четко определяет без ошибок. Более того, bootloader полностью рабочий через форвардер, пишет, проверяет, запускает. Прерывания нормально используются, ничего не крэшится.

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

Навскидку, если очевидные вещи вы уже проверили, еще могут быть такие узкие места:
1. Еще раз проверить функции ремапа на реентерабельность, нет ли скрытых камней при обработке вложенных прерываний.
2. Разграничение физических областей кода бутлодера и приложения. Нет ли какого-нибудь ограничения чтения одной области из другой области через какие-нибудь биты защиты кода или через MPU (Memory Protection Unit).
3. На всех ли векторах прерываний в обеих таблицах есть заглушки при неиспользуемых векторах. А то может возникнуть прерывание, на которое вы не рассчитывали, а там пустота или другой код.
Go to the top of the page
 
+Quote Post
sevstels
сообщение Mar 22 2018, 15:57
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 626
Регистрация: 3-12-07
Пользователь №: 32 910



Спасибо.
К сожалению таймаут на месяц. Вернусь с отпуска, продолжу.


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 23 2018, 11:01
Сообщение #24


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Чтобы за время вашего отпуска мысли не забылись, изложу их кратенько тут:
1) в launch_application я не заметил установки нового значения в irq_table_offset.
2) irq_forwarder писали индусы. Накой этот закат солнца вручную? "Машина должна работать, а человек - думать". С расчетом всех этих адресов прекрасно справляется компилятор :
CODE
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 тут никак не поможет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
sevstels
сообщение May 2 2018, 01:39
Сообщение #25


Знающий
****

Группа: Участник
Сообщений: 626
Регистрация: 3-12-07
Пользователь №: 32 910



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


--------------------
Herz - дятел.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th August 2025 - 22:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.02512 секунд с 7
ELECTRONIX ©2004-2016