|
|
  |
Вопросы по LPC2134 о FIQ и выдачи в UART и зависон в I2C |
|
|
|
Jan 15 2009, 21:50
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
Всем привет.
Подскажите пожалуйста по прерываниям.
Чем отличается обычное прерывание от FIQ и как вызвать, например таймер 1, способом FIQ?
Ещё такой вопрос, есть у меня функция print_f( char * ), которая выводит в UART строку текста. Но во время вывода длинной строки МК больше ничего не может делать, а только выводом занимается. Если сделать кольцевой буфер, то при превышении размера буфера, всё равно нагрузит вывод в UART МК.
Как бы мне сделать, чтоб команда print_f работала как бы в фоновом режиме ?
Ещё вопрос по поводу выводы в I2C. Например, я вывожу информацию в UART и даже если её не принимают на обратной стороне, буфер вывода освобождается. Как бы мне сделать так, чтоб при передачи по I2C тоже не возникало переполнения буфера, если на другой стороне его не принимают?
|
|
|
|
|
Jan 16 2009, 13:57
|

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

|
Цитата(Папа Карло @ Jan 16 2009, 15:15)  ХМ, а как назначить этому прерыванию нужную функцию, если в VICVectAddr нельзя записать адрес её ? Может надо что-то в Keil писать ? Ага. А дядюшка кейл телепатически передаст адрес функции процессору. FIQ на то и FIQ ( быстрое), что предполагает один единственный обработчик. Переход на который и записан намертво по адресу вектора исключения. В этом обработчике вы обрабатываетет один единственный источник прерывания. Или можете вручную ветвиться по флагам VICFIQStatus, но тогда напрочь пропадает вся "быстрость" FIQ. Цитата(Папа Карло @ Jan 16 2009, 15:15)  И сколько можно назначить FIQ-ов ? А почитать user manual?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 16 2009, 17:25
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
Что то ошибки выдаёт Keil. Написал так: Код void T1_Isr( void ) __fiq {
}
void init(void) { VICIntSelect = 0x20; VICIntEnable = 0x20; } Keil выкидывает кучу ошибок. В чём может быть проблема?
|
|
|
|
|
Jan 16 2009, 17:39
|

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

|
Цитата(Сергей Борщ @ Jan 16 2009, 16:57)  FIQ на то и FIQ (быстрое), что предполагает один единственный обработчик. Дык, и IRQ тоже один одинешенек. Цитата Переход на который и записан намертво по адресу вектора исключения. Как и у IRQ. Цитата В этом обработчике вы обрабатываетет один единственный источник прерывания. Или нет Цитата Или можете вручную ветвиться по флагам VICFIQStatus, но тогда напрочь пропадает вся "быстрость" FIQ. Отчего-же? Никто не способен отнять у FIQ собственный стек, собственные регистры чуть более быстую реакцию на прерывание и более высокий приоритет. А ветвиться при необходимости нужно, как и вслучае IRQ, по VICVectAddr вычитывая его одной командой из VIC.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jan 16 2009, 17:41
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Папа Карло @ Jan 16 2009, 20:25)  Keil выкидывает кучу ошибок. Каких? Цитата(Папа Карло @ Jan 16 2009, 20:25)  В чём может быть проблема? Например в том, что он не знает слово __fiq.
|
|
|
|
|
Jan 16 2009, 18:04
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
Я сейчас посмотрел описание. которое шло с Keil, там тоже указано как я написал и в примерах. Но у меня выкидывает сразу ошибок 20 в разных строках и первая ошибка: drvmot1.c(70): error: #77-D: this declaration has no storage class or type specifier Функцию прерывания определил так: Код __fiq void T1_Isr( void ) { } Если определить так: Код void T1_Isr( void ) __fiq { } То выдаёт первую такую ошибку: drvmot1.h(63): error: #130: expected a "{"
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|