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

 
 
> 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
 
Start new topic
Ответов
asd6715
сообщение Jul 29 2009, 08:04
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #4


Участник
*

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



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


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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 Текстовая версия Сейчас: 28th July 2025 - 22:36
Рейтинг@Mail.ru


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