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

SAM7X. Illegal target for BX

Прошу помощи в следующем вопросе. Пишу простой код под ИАРом для SAM7X с использованием freeRTOS.

Пишу программку, которая инициализирует USART, настраивает обработчик прерываний на прием. Как только срабатывает обработчик прерываний, процессор уходит в аборт. Я проследил в отладчике за местом краха. По завершению обработчика прерывания выполняеться инструкция "BX LR". Отладчик на ней вылетает с надписью "Illegal target for BX. ARM instruction must be located on word aligned addresses" скриншот прилагаю.

Что это может быть? В чем возможная причина неработоспособности. Несколько часов воюю и никак.

post-51103-1248813807_thumb.jpg

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


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

У Вас програмка пользовательская ? BX - это вообщето так обычно завершают отбработчик прерывания, Вам пишется что адрес перехода должен быть выровнен на четыре байта. В пользовательском контексте должно использоваться B или B<условие>

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


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

Я пишу программу на языке Си по ИАРом. Подскажите как избавиться от этой проблеммы? Это пользовательская программа.

 

В старом моем проекте перед "BX LR" генерируеться ещё строка ldmia sp!,{r4,lr} и выход осуществляеться корректно. В чем это проблема? Настроек компилятора/линкера, моего кода? И как её решить? Уже что только не перепробовал не хочет поддаваться :(

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

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


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

ldmia sp!,{r4,lr}

это загрузить из стэка r4 и LR а в IAR - ключевого слова interrupt нет чтобы компилятор сохранил в стэке модифицируемые регистры , там по разному может быть реалиовано. Должно задаваться директивой начинающейся с # какие регистры сохранить или ключевым словом перед названием процедуры

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


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

Что это может быть? В чем возможная причина неработоспособности.

Без исходника и дизасма остается только гадать, кто там может портить LR. И крайне желательно видеть полный путь обработчика, от вектора до "падающей" процедуры.

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


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

Эх... учиться мне ещё и учиться...

в общем во freeRTOS как я понял обработчики нужно писать вот так

UsartHandler1Entry:

    portSAVE_CONTEXT        ; Save the context of the current task.

    bl    UsartHandler1            ; Call the ISR routine.

    portRESTORE_CONTEXT        ; Restore the context of the current task -
                            ; which may be different to the task that
                            ; was interrupted.

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


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

в общем во freeRTOS как я понял обработчики нужно писать вот так

Ну, вовсе не обязательно именно так: "обычные" обработчики тоже можно применять, если в них не вызывается YIELD_FROM_ISR().

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


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

YIELD_FROM_ISR().А что это такое?

Я наверное не применял и оно не работало... в общем ничего страшного, главное что стало работать

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


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

YIELD_FROM_ISR().А что это такое?

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

 

Я наверное не применял и оно не работало...

Что-то мне подсказывает, что обработчик прерывания просто не был снабжен модификатором __irq.

 

в общем ничего страшного, главное что стало работать

Неа, главное - разобраться.

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


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

Что-то мне подсказывает, что обработчик прерывания просто не был снабжен модификатором __irq.

Да, вы правы. Его не было, а с ним заработало. Но в любом случае я буду использовать функции изменяющие контекст задачи, поэтому нужно будет использовать те макросы. Нужно посмотреть чем отличаеться код с этим идентификатором и без него. Ещё как я понял, то что бы можно было выполнять вложенные прерывания нужно вставить инетификатор __nested

 

 

Неа, главное - разобраться.

Это и так понятно... в тех ассемблерных макросах я разобрался...

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

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


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

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

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

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

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

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

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

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

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

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