IgorKossak 0 20 ноября, 2006 Опубликовано 20 ноября, 2006 · Жалоба Вчера нарвался на грабли с IARом. Да, необходимое уточнение. Файлы я назвал ADC.s79 и ADC.c. Да, интересные грабли. Получается, что IAR после трансляции должен создать два объектных файла с одинаковыми именами ADC.r79. Естественно, останется только один из них. Так что надо давать файлам разные имена. В очередной раз удивляюсь тому, как программисты любят обвинять компилятор в собственных глюках. ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 20 ноября, 2006 Опубликовано 20 ноября, 2006 · Жалоба В очередной раз удивляюсь тому, как программисты любят обвинять компилятор в собственных глюках. ;) ;) Ну я не уверен, что это мой глюк, бо имена у файлов все-ж разные, я тут быстро писал, поэтому получились одинаковые ;) Но поскольку проблема решена, то и ладно. Другой вопрос. Вот что не так в этой строчке: sADC_RAW[i]= (*( AT91C_ADC_CDR0 + (0x04*i))) & 0xff; По задумке хочется считать CDR соответствующего i канала АЦП. Где косяк? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megaloki 0 21 ноября, 2006 Опубликовано 21 ноября, 2006 · Жалоба /* End the interrupt in the AIC. */ AT91C_BASE_AIC->AIC_EOICR = 0; Скажы зачем ты вызываеш ету команду ведь у тебя директива перед функцией стоит __irq? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 21 ноября, 2006 Опубликовано 21 ноября, 2006 · Жалоба /* End the interrupt in the AIC. */ AT91C_BASE_AIC->AIC_EOICR = 0; Скажы зачем ты вызываеш ету команду ведь у тебя директива перед функцией стоит __irq? Я смотрел листинг, там одно присвоение идет. Т.е. выкидывать EOICR=0 я не пробовал, но так - работает ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 22 ноября, 2006 Опубликовано 22 ноября, 2006 · Жалоба /* End the interrupt in the AIC. */ AT91C_BASE_AIC->AIC_EOICR = 0; Скажы зачем ты вызываеш ету команду ведь у тебя директива перед функцией стоит __irq? "Патамушта надо" __irq говорит компилятору сгенерить пролог/эпилог необходимый для обработчика прерываний. А AIC является обычным периферийным узлом, и как его сбрасывать и надо ли вообще сбрасывать, компилятор не имеет никакого понятия. В ADuC его вообще нет, в LPC он называется VIC. А компилятор один на всех. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 24 ноября, 2006 Опубликовано 24 ноября, 2006 · Жалоба Тогда для начала незачем асмовские оберки городить В FreeRTOS в примерах у каждого обработчика есть обертка и комментарий: ; Wrapper for the * interrupt service routine. This can cause a ; context switch so requires an assembly wrapper. :) Я, честно говоря, немного не понял: это значит что все-таки нужны или не нужны?.. PS Без них не работает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 24 ноября, 2006 Опубликовано 24 ноября, 2006 · Жалоба Я, честно говоря, немного не понял: это значит что все-таки нужны или не нужны?.. PS Без них не работает... Для тех компиляторов которые могут самостоятельно генерить фрейм для обработчика (IAR в их числе) - не нужны, если в прерывании контексты не переключаются. Если переключаются, тогда следует использовать жирную системную обертку. Пример, как указать компилятору - был приведен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kitsok 0 24 ноября, 2006 Опубликовано 24 ноября, 2006 · Жалоба Я, честно говоря, немного не понял: это значит что все-таки нужны или не нужны?.. PS Без них не работает... Если переключение в ISR не требует уведомления задач через очереди или как-то еще, то обертка не нужна. Если требует, то нужна ;) У меня и с оберткой, и без обертки работает, но я данные из обработчика передают тупо, без очередей (хоть это и не правильно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться