|
|
  |
Вопросы по 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 "{"
|
|
|
|
|
Jan 17 2009, 15:27
|
Местный
  
Группа: Свой
Сообщений: 285
Регистрация: 5-11-05
Пользователь №: 10 491

|
Вам когда задачу ставят, вы тоже начинаете возмущаться - Да зачем это? Да нафиг надо? Да хоть просто из интереса. Почему бы не помочь человеку? Может быть, человеку нужен именно велосипед, а не мотоцикл и не автобус  А по теме - мне кажется, что описание scmRTOS (v2) вам ответит на все вопросы. Тем более, что написано очень приятным живым языком. Мне кажется, что почти в таком же ключе писались раньше научно-популярные книги  Цитата(Папа Карло @ Jan 17 2009, 19:17)  Мне так показалось, что простенький менеджер будет получше карявок готовых. +1 Согласен с вами. (Мой предыдущий пост - для двоих скептиков)
|
|
|
|
|
Jan 17 2009, 16:02
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(SpyBot @ Jan 17 2009, 23:27)  А по теме - мне кажется, что описание scmRTOS (v2) вам ответит на все вопросы. Тем более, что написано очень приятным живым языком. Мне кажется, что почти в таком же ключе писались раньше научно-популярные книги  Одно непонятно: соглашаясь, что свое творение может быть лучше, чем "готовые корявки", Вы тут же рекомендуете руководство по одной из таких "корявок"! Этим самым Вы противоречите себе. Абсурд! Цитата(SpyBot @ Jan 17 2009, 23:27)  Вам когда задачу ставят, вы тоже начинаете возмущаться - Да зачем это? Да нафиг надо?  Разве я или sergeeff возмущались? Цитата(SpyBot @ Jan 17 2009, 23:27)  Да зачем это? Да нафиг надо?  Ну в таком тоне только Вы выразились! Я же аккуратно и мягко спросил, зачем проходить это проходить самому? Если есть интерес, да пожалуйста! Я это только поощряю! Сам изобретаю велосипеды порой. И знаю, что при этом можно замечательно научиться! Но может быть человек не знал об осях? Я же не знаю, его компетенции. Цитата(Папа Карло @ Jan 17 2009, 23:17)  карявок готовых. Наверно Ваша будет сразу лучше всех!
--------------------
Выбор.
|
|
|
|
|
Jan 17 2009, 21:34
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Папа Карло @ Jan 17 2009, 18:17)  Мне так показалось, что простенький менеджер будет получше карявок готовых. +1 конечно будет лучше, если Вы реально уже готовы написать лучше... Это не подколка, если Вы чуствуете что можете сделать в СВОЕЙ КОНКРЕТНОЙ ЗАДАЧКЕ связки лучше чем вам может предоставить любая OS, то и думать не стоит, никакая OS не знает что же Вы хотели изначально... З.Ы. Я чужими OS стараюсь не пользоваться...
|
|
|
|
|
Jan 18 2009, 16:30
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
Столкнулся со странным для меня поведением компилятора. Написал так: Код *P1++; Где P1 - ссылка на переменную. Подумал, что если поставить в начале знак *, то будет изменятся не указатель, а переменная и ++ добавит 1 к ней. Но не добавил! Подскажите - это компилятор такой или всё таки *P1++ не корректное выражение ?
|
|
|
|
|
Jan 18 2009, 16:37
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Папа Карло @ Jan 18 2009, 19:30)  Где P1 - ссылка на переменную. Может, указатель все таки? Цитата(Папа Карло @ Jan 18 2009, 19:30)  Подскажите - это компилятор такой или всё таки *P1++ не корректное выражение ? Компилятор правильный и *P1++ корректное выражение. Если результат не соответствует вашим ожиданиям, почитайте букварь по "C". Для модификации переменной следовало написать: (*P1)++
|
|
|
|
|
Jan 18 2009, 19:36
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
Сделал и внедрил в свой модуль управления двигателями менеджер задач. Выкладываю библиотеку и файл примера.
|
|
|
|
|
Jan 19 2009, 14:57
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
Решил попробовать ОС которая идёт с Keil R T L K e r n e l. И есть вопрос. Вот код работы с UART: Код /*---------------------------------------------------------------------------- * sendchar: Write a character to Serial Port *---------------------------------------------------------------------------*/ int fputc (int ch, FILE *f) { if (ch == '\n') { while (!(U1LSR & 0x20)); U1THR = CR; /* output CR */ } while (!(U1LSR & 0x20)); return (U1THR = ch); }
/*---------------------------------------------------------------------------- * getchar: Read a character from Serial Port *---------------------------------------------------------------------------*/ int fgetc (FILE *f) { while (!(U1LSR & 0x01)); return (U1RBR); } Если я правильно понял, то в функциях стоит цикл while с ожиданием пока будет принят или отправлен байт. Так вот, если я буду отправлять длинную строку в UART будут ли у меня остальные задачи выполнятся ?
|
|
|
|
|
Jan 20 2009, 09:40
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(Папа Карло @ Jan 19 2009, 23:33)  И мне хотелось узнать, не о прерываниях, а о том будут ли все задачи ожидать пока функция fputc передаст байт в UART или ОС будет переключатся между задачами ? Отвечаю по аналогии с scmRTOS - не будет переключаться. Когда я делал "тупой" опрос ножки МК в цикле, система висла. Как мне потом объяснили, нужно дать возможность ОСи переключиться на другие задачи. Тогда я по пути с поллингом ноги делал Sleep(какое-то время). Вот в этом случае у меня все работало великолепно. Здесь такой финт не допустим (ИМХО), т.к. теряется скорость обмена через порт. Цитата(Папа Карло @ Jan 19 2009, 23:33)  П.С. Рисковать нет смысла, т.к. эти функции ждут ожидания флага готовности и записывают\читают в\из регистр(а) данные! Как быстро Вы нашли твердое убеждение вот на это сомнение: Цитата(Папа Карло) Если я правильно понял, то в функциях стоит цикл while с ожиданием пока будет принят или отправлен байт.
--------------------
Выбор.
|
|
|
|
|
Jan 20 2009, 10:26
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
haker_fox Если вы почитаете внимательно ветку эту, да и другие мои ветки на форуме, то убедитесь, что я сам с собой обсуждаю проблемы  Очень помогает, но иногда помогают и другие пользователи... Например с FIQ-ом я понял, что он не реализован в Keil увы...
|
|
|
|
|
Jan 20 2009, 10:58
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(Папа Карло @ Jan 20 2009, 18:48)  Как я понимаю, чтоб задача переключилась ей надо передать управление ОС, как это было в Windows95. Win95 кооперативная ОС. scmRTOS - вытесняющая. Цитата(Папа Карло @ Jan 20 2009, 18:48)  haker_fox Почитал вашу ссылку. Как раз Win95 не иначе. Прошу прощения, причем здесть Win95??? Цитата(Папа Карло @ Jan 20 2009, 18:48)  А чтоб ОС сама могла переключить задачу нужна поддержка на аппаратном уровне. Таймер-то есть. О какой поддержке на аппаратном уровне идет речь? MMU? Ну так он то точно тут не нужен.
--------------------
Выбор.
|
|
|
|
|
Jan 20 2009, 18:49
|
Частый гость
 
Группа: Новичок
Сообщений: 176
Регистрация: 15-02-08
Из: Москва
Пользователь №: 35 074

|
Господа, кто по поводу UART-а всё таки выскажет мысли ? И ещё тут вопрос назрел. Есть код настройки порта на работу по I2C. Я не могу понять зачем там строка 1 и 3 ? Код PINSEL0 &= ~(3 << 4); // setup I2C.0 SCL pin PINSEL0 |= 1 << 4; PINSEL0 &= ~(3 << 6); // setup I2C.0 SDA pin PINSEL0 |= 1 << 6;
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|