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

 
 
 
Reply to this topicStart new topic
> SAM7X. Illegal target for BX
asd6715
сообщение Jul 28 2009, 20:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 10-07-09
Пользователь №: 51 103



Прошу помощи в следующем вопросе. Пишу простой код под ИАРом для SAM7X с использованием freeRTOS.
Пишу программку, которая инициализирует USART, настраивает обработчик прерываний на прием. Как только срабатывает обработчик прерываний, процессор уходит в аборт. Я проследил в отладчике за местом краха. По завершению обработчика прерывания выполняеться инструкция "BX LR". Отладчик на ней вылетает с надписью "Illegal target for BX. ARM instruction must be located on word aligned addresses" скриншот прилагаю.
Что это может быть? В чем возможная причина неработоспособности. Несколько часов воюю и никак.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
dch
сообщение Jul 28 2009, 21:15
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



У Вас програмка пользовательская ? BX - это вообщето так обычно завершают отбработчик прерывания, Вам пишется что адрес перехода должен быть выровнен на четыре байта. В пользовательском контексте должно использоваться B или B<условие>
Go to the top of the page
 
+Quote Post
asd6715
сообщение Jul 28 2009, 21:30
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 10-07-09
Пользователь №: 51 103



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

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

Сообщение отредактировал asd6715 - Jul 28 2009, 21:48
Go to the top of the page
 
+Quote Post
dch
сообщение Jul 28 2009, 21:58
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1 179
Регистрация: 15-09-04
Из: 141070 г. Королев МО, улица Горького 39-121
Пользователь №: 661



Цитата(asd6715 @ Jul 29 2009, 01:30) *
ldmia sp!,{r4,lr}

это загрузить из стэка r4 и LR а в IAR - ключевого слова interrupt нет чтобы компилятор сохранил в стэке модифицируемые регистры , там по разному может быть реалиовано. Должно задаваться директивой начинающейся с # какие регистры сохранить или ключевым словом перед названием процедуры
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 29 2009, 04:57
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(asd6715 @ Jul 29 2009, 00:48) *
Что это может быть? В чем возможная причина неработоспособности.

Без исходника и дизасма остается только гадать, кто там может портить LR. И крайне желательно видеть полный путь обработчика, от вектора до "падающей" процедуры.
Go to the top of the page
 
+Quote Post
asd6715
сообщение Jul 29 2009, 08:04
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 10-07-09
Пользователь №: 51 103



Эх... учиться мне ещё и учиться...
в общем во 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.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 29 2009, 08:14
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(asd6715 @ Jul 29 2009, 12:04) *
в общем во freeRTOS как я понял обработчики нужно писать вот так

Ну, вовсе не обязательно именно так: "обычные" обработчики тоже можно применять, если в них не вызывается YIELD_FROM_ISR().
Go to the top of the page
 
+Quote Post
asd6715
сообщение Jul 29 2009, 08:31
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 10-07-09
Пользователь №: 51 103



YIELD_FROM_ISR().А что это такое?
Я наверное не применял и оно не работало... в общем ничего страшного, главное что стало работать
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 29 2009, 08:39
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(asd6715 @ Jul 29 2009, 12:31) *
YIELD_FROM_ISR().А что это такое?

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

Цитата(asd6715 @ Jul 29 2009, 12:31) *
Я наверное не применял и оно не работало...

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

Цитата(asd6715 @ Jul 29 2009, 12:31) *
в общем ничего страшного, главное что стало работать

Неа, главное - разобраться.
Go to the top of the page
 
+Quote Post
asd6715
сообщение Jul 29 2009, 09:31
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 17
Регистрация: 10-07-09
Пользователь №: 51 103



Цитата(aaarrr @ Jul 29 2009, 11:39) *
Что-то мне подсказывает, что обработчик прерывания просто не был снабжен модификатором __irq.

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


Цитата(aaarrr @ Jul 29 2009, 11:39) *
Неа, главное - разобраться.

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

Сообщение отредактировал asd6715 - Jul 29 2009, 09:36
Go to the top of the page
 
+Quote Post

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

 


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


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