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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Вопросы по LPC2134 о FIQ и выдачи в UART и зависон в I2C
Папа Карло
сообщение Jan 15 2009, 21:50
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Всем привет.

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

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

Ещё такой вопрос, есть у меня функция print_f( char * ), которая выводит в UART строку текста.
Но во время вывода длинной строки МК больше ничего не может делать, а только выводом занимается.
Если сделать кольцевой буфер, то при превышении размера буфера, всё равно нагрузит вывод в UART МК.

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

Ещё вопрос по поводу выводы в I2C.
Например, я вывожу информацию в UART и даже если её не принимают на обратной стороне, буфер вывода освобождается.
Как бы мне сделать так, чтоб при передачи по I2C тоже не возникало переполнения буфера, если на другой стороне его не принимают?
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Jan 16 2009, 12:45
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



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

Было бы хорошо, чтоб кто нибудь кусок кода показал, как оно инициализируется!
Go to the top of the page
 
+Quote Post
dlman
сообщение Jan 16 2009, 12:58
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 88
Регистрация: 28-05-06
Из: Москва
Пользователь №: 17 530



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

VICIntSelect |= (1 << VIC_TIMER0); /* Configure the timer interrupt as an FIQ source. */
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Jan 16 2009, 13:15
Сообщение #4


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



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

И сколько можно назначить FIQ-ов ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 16 2009, 13:57
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Jan 16 2009, 14:05
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



Разобрался с FIQ.
Вместо __IRQ надо писать __FIQ.
Жаль конечно только 1 фик есть.

А как бы мне передать по UART длинный кусок данных, чтоб весь МК в ожидание не ставить ?
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Jan 16 2009, 17:25
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



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

Написал так:

Код
void T1_Isr( void ) __fiq
{

}

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


Keil выкидывает кучу ошибок.
В чём может быть проблема?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jan 16 2009, 17:39
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 16 2009, 17:41
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Папа Карло @ Jan 16 2009, 20:25) *
Keil выкидывает кучу ошибок.

Каких?

Цитата(Папа Карло @ Jan 16 2009, 20:25) *
В чём может быть проблема?

Например в том, что он не знает слово __fiq.
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Jan 16 2009, 18:04
Сообщение #10


Частый гость
**

Группа: Новичок
Сообщений: 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 "{"
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 16 2009, 18:12
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



__fiq было в CARM, у Вас, скорее всего, RVCT. Впрочем, в CARM оно преимуществ режима FIQ все равно не использовало, насколько я знаю.
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Jan 16 2009, 18:43
Сообщение #12


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



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

Может вы мне подскажете, как мне в Keil uVision3 V3.72 сделать этот "ФИК" ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 16 2009, 19:46
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

Цитата(Папа Карло @ Jan 16 2009, 21:43) *
А не профи в этом деле и не знаю, что такое CARM и RVCT.

CARM и RVCT - компиляторы (бывший и нынешний) в составе Keil.
Go to the top of the page
 
+Quote Post
Папа Карло
сообщение Jan 16 2009, 19:50
Сообщение #14


Частый гость
**

Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074



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

Кто то же делал этот fiq ?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 16 2009, 20:05
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Папа Карло @ Jan 16 2009, 22:50) *
__fiq выдаёт ошибку, а если писать __irq, то непонятно как привязать адрес функции к вектору прерываний!

Ни __irq ни __fiq ничего ни к чему не привязывают, они лишь указывают компилятору, что это процедура прерывания и ее надо снабдить соответствующими прологом и эпилогом.
Go to the top of the page
 
+Quote Post

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

 


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


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