Перейти к содержанию
    

Вопросы по LPC2134 о FIQ и выдачи в UART и зависон в I2C

Всем привет.

 

Подскажите пожалуйста по прерываниям.

 

Чем отличается обычное прерывание от FIQ и как вызвать, например таймер 1, способом FIQ?

 

Ещё такой вопрос, есть у меня функция print_f( char * ), которая выводит в UART строку текста.

Но во время вывода длинной строки МК больше ничего не может делать, а только выводом занимается.

Если сделать кольцевой буфер, то при превышении размера буфера, всё равно нагрузит вывод в UART МК.

 

Как бы мне сделать, чтоб команда print_f работала как бы в фоновом режиме ?

 

Ещё вопрос по поводу выводы в I2C.

Например, я вывожу информацию в UART и даже если её не принимают на обратной стороне, буфер вывода освобождается.

Как бы мне сделать так, чтоб при передачи по I2C тоже не возникало переполнения буфера, если на другой стороне его не принимают?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что никто не использовал FIQ ?

Я в ДШ посмотрел и не могу понять, как настроить прерывание FIQ.

 

Было бы хорошо, чтоб кто нибудь кусок кода показал, как оно инициализируется!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#define VIC_TIMER0 4 /* Timer 0 (Match 0-3 Capture 0-3) */

 

VICIntSelect |= (1 << VIC_TIMER0); /* Configure the timer interrupt as an FIQ source. */

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ХМ, а как назначить этому прерыванию нужную функцию, если в VICVectAddr нельзя записать адрес её ?

Может надо что-то в Keil писать ?

 

И сколько можно назначить FIQ-ов ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ХМ, а как назначить этому прерыванию нужную функцию, если в VICVectAddr нельзя записать адрес её ?

Может надо что-то в Keil писать ?

Ага. А дядюшка кейл телепатически передаст адрес функции процессору. FIQ на то и FIQ (быстрое), что предполагает один единственный обработчик. Переход на который и записан намертво по адресу вектора исключения. В этом обработчике вы обрабатываетет один единственный источник прерывания. Или можете вручную ветвиться по флагам VICFIQStatus, но тогда напрочь пропадает вся "быстрость" FIQ.

 

И сколько можно назначить FIQ-ов ?
А почитать user manual?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался с FIQ.

Вместо __IRQ надо писать __FIQ.

Жаль конечно только 1 фик есть.

 

А как бы мне передать по UART длинный кусок данных, чтоб весь МК в ожидание не ставить ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что то ошибки выдаёт Keil.

 

Написал так:

 

void T1_Isr( void ) __fiq
{

}

void init(void)
{
VICIntSelect = 0x20;
VICIntEnable = 0x20;
}

 

Keil выкидывает кучу ошибок.

В чём может быть проблема?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

FIQ на то и FIQ (быстрое), что предполагает один единственный обработчик.

Дык, и IRQ тоже один одинешенек.

Переход на который и записан намертво по адресу вектора исключения.

Как и у IRQ.

В этом обработчике вы обрабатываетет один единственный источник прерывания.

Или нет

Или можете вручную ветвиться по флагам VICFIQStatus, но тогда напрочь пропадает вся "быстрость" FIQ.

Отчего-же? Никто не способен отнять у FIQ собственный стек, собственные регистры чуть более быстую реакцию на прерывание и более высокий приоритет. А ветвиться при необходимости нужно, как и вслучае IRQ, по VICVectAddr вычитывая его одной командой из VIC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Keil выкидывает кучу ошибок.

Каких?

 

В чём может быть проблема?

Например в том, что он не знает слово __fiq.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я сейчас посмотрел описание. которое шло с 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 "{"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__fiq было в CARM, у Вас, скорее всего, RVCT. Впрочем, в CARM оно преимуществ режима FIQ все равно не использовало, насколько я знаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А не профи в этом деле и не знаю, что такое CARM и RVCT.

 

Может вы мне подскажете, как мне в Keil uVision3 V3.72 сделать этот "ФИК" ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Напишите __irq. Так Вы не сможете использовать одно из преимуществ FIQ в виде своего набора старших регистров, но не думаю, что на данном этапе это принципиально.

 

А не профи в этом деле и не знаю, что такое CARM и RVCT.

CARM и RVCT - компиляторы (бывший и нынешний) в составе Keil.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну а что мне делать то ?

__fiq выдаёт ошибку, а если писать __irq, то непонятно как привязать адрес функции к вектору прерываний!

 

Кто то же делал этот fiq ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

__fiq выдаёт ошибку, а если писать __irq, то непонятно как привязать адрес функции к вектору прерываний!

Ни __irq ни __fiq ничего ни к чему не привязывают, они лишь указывают компилятору, что это процедура прерывания и ее надо снабдить соответствующими прологом и эпилогом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...