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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> FreeRTOS + прерывания
IgorKossak
сообщение Nov 20 2006, 11:32
Сообщение #16


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(vmp @ Nov 20 2006, 10:19) *
Цитата(Kitsok @ Nov 19 2006, 22:41) *

Вчера нарвался на грабли с IARом.
Да, необходимое уточнение. Файлы я назвал ADC.s79 и ADC.c.

Да, интересные грабли. Получается, что IAR после трансляции должен создать два объектных файла с одинаковыми именами ADC.r79. Естественно, останется только один из них.
Так что надо давать файлам разные имена.

В очередной раз удивляюсь тому, как программисты любят обвинять компилятор в собственных глюках. wink.gif
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Nov 20 2006, 13:35
Сообщение #17


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата
В очередной раз удивляюсь тому, как программисты любят обвинять компилятор в собственных глюках. wink.gif


wink.gif Ну я не уверен, что это мой глюк, бо имена у файлов все-ж разные, я тут быстро писал, поэтому получились одинаковые wink.gif Но поскольку проблема решена, то и ладно.

Другой вопрос. Вот что не так в этой строчке:

Код
sADC_RAW[i]= (*( AT91C_ADC_CDR0 + (0x04*i))) & 0xff;


По задумке хочется считать CDR соответствующего i канала АЦП. Где косяк?
Go to the top of the page
 
+Quote Post
megaloki
сообщение Nov 21 2006, 11:28
Сообщение #18


Участник
*

Группа: Новичок
Сообщений: 19
Регистрация: 28-09-05
Пользователь №: 9 057



Цитата(Kitsok @ Nov 20 2006, 01:20) *
/* End the interrupt in the AIC. */
AT91C_BASE_AIC->AIC_EOICR = 0;

Скажы зачем ты вызываеш ету команду ведь у тебя директива перед функцией стоит __irq?


--------------------
Было бы железо софт напишем
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Nov 21 2006, 13:16
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(megaloki @ Nov 21 2006, 11:28) *
Цитата(Kitsok @ Nov 20 2006, 01:20) *

/* End the interrupt in the AIC. */
AT91C_BASE_AIC->AIC_EOICR = 0;

Скажы зачем ты вызываеш ету команду ведь у тебя директива перед функцией стоит __irq?


Я смотрел листинг, там одно присвоение идет. Т.е. выкидывать EOICR=0 я не пробовал, но так - работает wink.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 22 2006, 12:13
Сообщение #20


Гуру
******

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



Цитата(megaloki @ Nov 21 2006, 10:28) *
Цитата(Kitsok @ Nov 20 2006, 01:20) *

/* End the interrupt in the AIC. */
AT91C_BASE_AIC->AIC_EOICR = 0;

Скажы зачем ты вызываеш ету команду ведь у тебя директива перед функцией стоит __irq?
"Патамушта надо" __irq говорит компилятору сгенерить пролог/эпилог необходимый для обработчика прерываний. А AIC является обычным периферийным узлом, и как его сбрасывать и надо ли вообще сбрасывать, компилятор не имеет никакого понятия. В ADuC его вообще нет, в LPC он называется VIC. А компилятор один на всех.


--------------------
На любой вопрос даю любой ответ
"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
AVR
сообщение Nov 24 2006, 03:21
Сообщение #21


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(zltigo @ Nov 13 2006, 18:10) *
Тогда для начала незачем асмовские оберки городить

В FreeRTOS в примерах у каждого обработчика есть обертка и комментарий:
Цитата
; Wrapper for the * interrupt service routine. This can cause a
; context switch so requires an assembly wrapper.
smile.gif
Я, честно говоря, немного не понял: это значит что все-таки нужны или не нужны?..
PS Без них не работает...


--------------------
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 24 2006, 10:40
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(AVR @ Nov 24 2006, 02:21) *
Я, честно говоря, немного не понял: это значит что все-таки нужны или не нужны?..
PS Без них не работает...

Для тех компиляторов которые могут самостоятельно генерить фрейм для обработчика (IAR в их числе)
- не нужны, если в прерывании контексты не переключаются. Если переключаются, тогда следует использовать жирную системную обертку.
Пример, как указать компилятору - был приведен.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Kitsok
сообщение Nov 24 2006, 13:05
Сообщение #23


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 9-11-06
Пользователь №: 22 136



Цитата(AVR @ Nov 24 2006, 03:21) *
Я, честно говоря, немного не понял: это значит что все-таки нужны или не нужны?..
PS Без них не работает...


Если переключение в ISR не требует уведомления задач через очереди или как-то еще, то обертка не нужна. Если требует, то нужна wink.gif У меня и с оберткой, и без обертки работает, но я данные из обработчика передают тупо, без очередей (хоть это и не правильно)
Go to the top of the page
 
+Quote Post

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

 


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


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