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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> TC0 vs UDP. ARM7S, Не хотят работать одновременно.
KAlex
сообщение Mar 30 2008, 11:24
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Что за хрень? Почему, если работает таймер, может сбоить UDP.
За одну минуту шлю в PC гдето около 30 000 пакетов по 64 байта(или меньше, неважно).
Таймер выдает прерывания - 50 герц. Как показала статистика, в среднем, в течение двух-трех минут проц вылетает в undefvec, swivec, dabtvec и тд. короче RAMEND?!?!?!
Приоритет у UDP выше.
Объясните.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 30 2008, 16:36
Сообщение #2


Гуру
******

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



Цитата(KAlex @ Mar 30 2008, 14:24) *
Как показала статистика, в среднем, в течение двух-трех минут проц вылетает в undefvec, swivec, dabtvec и тд. короче RAMEND?!?!?!

Не очень понял, что Вы хотели сказать данной фразой - причем тут RAMEND?

Ищите ошибку в своей программе - UDP с TC0 работает нормально.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Mar 31 2008, 07:54
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(aaarrr @ Mar 30 2008, 19:36) *
что Вы хотели сказать данной фразой - причем тут RAMEND?

Ну это так, фразеологизм.

В программе все нормально. Если запретить прерывания от таймера на время обработки UDP - накаких проблем. Для меня в принципе это не критично, запрещаю. Но все таки интересно, почему им нельзя работать одновременно? Прием и передача по USB происходит аппаратно. По идее, никакие програмные действия на это влиять не могут. Однако же ...?
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Mar 31 2008, 08:14
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Цитата(KAlex @ Mar 31 2008, 11:54) *
В программе все нормально. Если запретить прерывания от таймера на время обработки UDP - накаких проблем. Для меня в принципе это не критично, запрещаю. Но все таки интересно, почему им нельзя работать одновременно? Прием и передача по USB происходит аппаратно. По идее, никакие програмные действия на это влиять не могут. Однако же ...?


Влиять может многое.
Например компилятор, который криво обрабатывает выходы из прерываний или переходы между ARM/THUMB.
Или протокол обмена по USB может содержать внутри запреты прерываний с последующим ожиданием вашего таймера.
Часть функций может распологаться в озу и рекурсивный вызов некоторых функций может вызывать наползание стека на функцию.
Может влиять порядок инициализации таймера или USB, время между подачей частоты на перефирию и установка в ней регистров.
Даже банальные иголки от цепей подключенных к 50Гц.

Я прекрасно передавал в комп мегабит/с данных по протоколу MSD и при этом у меня один таймер дёргал ногу с частотой 3кГц (манчестер), а другой выдавал на внешнее оборудование 16кГц.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Mar 31 2008, 08:24
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(_4afc_ @ Mar 31 2008, 11:14) *
Например компилятор, который криво обрабатывает выходы из прерываний или переходы между ARM/THUMB.

Это как? Можно поподробнее.

Цитата(_4afc_ @ Mar 31 2008, 11:14) *
Или протокол обмена по USB может содержать внутри запреты прерываний с последующим ожиданием вашего таймера.

Не, такого нет.

Цитата(_4afc_ @ Mar 31 2008, 11:14) *
Часть функций может распологаться в озу и рекурсивный вызов некоторых функций может вызывать наползание стека на функцию.

Тоже нет.

Цитата(_4afc_ @ Mar 31 2008, 11:14) *
Может влиять порядок инициализации таймера или USB, время между подачей частоты на перефирию и установка в ней регистров.

Непонятно. (с)

Цитата(_4afc_ @ Mar 31 2008, 11:14) *
Даже банальные иголки от цепей подключенных к 50Гц.

Прерывания от таймера никакими ногами не дергает. Чисто внутреннее.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Mar 31 2008, 08:27
Сообщение #6


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Скоре всего причина в обработчиках прерываний. Сами переферийные модули здесь не причем.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 31 2008, 08:34
Сообщение #7


Гуру
******

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



Ошибки в UDP модуле отрабатываются (прием с левой длиной и т.п.)? Стеков точно хватает?
Go to the top of the page
 
+Quote Post
KAlex
сообщение Mar 31 2008, 09:02
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(SpiritDance @ Mar 31 2008, 11:27) *
Скоре всего причина в обработчиках прерываний. Сами переферийные модули здесь не причем.

Оставил только
Код
void timer0_irq_handler(void){
  dummy = AT91C_BASE_TC0 -> TC_SR;
  dummy = dummy;
  AT91C_BASE_AIC -> AIC_EOICR = AT91C_ID_TC0;
}

Не помогает.


Цитата(aaarrr @ Mar 31 2008, 11:34) *
Ошибки в UDP модуле отрабатываются (прием с левой длиной и т.п.)?

Все учтено.

Цитата(aaarrr @ Mar 31 2008, 11:34) *
Стеков точно хватает?

Стек обработчика прерываний?
А вот это интересно.

Цитата(aaarrr @ Mar 31 2008, 11:34) *
Стеков точно хватает?

Скорее всего вот ОНО.
Если обрабатывается прерывание с высшем приоритетом, а в этот момент приходит более восьми запросов на прерывание от другого(одного и того же) источника. Что будет? В даташите как то скупо написано.
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Mar 31 2008, 09:06
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Цитата(KAlex @ Mar 31 2008, 12:24) *
Это как? Можно поподробнее.


Например WinAVR криво компилирует MSD если установлены ключи thumb
intrframework. Причём видно это на USB. Другие части кода работают нормально.
IAR вроде имел проблемы с преамбулой в обработчиках в какихто режимах.

Цитата(KAlex @ Mar 31 2008, 12:24) *
Непонятно. (с)


Был код или камень в котором USB работал, только если USB включить сразу при инициализации PLL.
Был код или камень в котором SSC работал, только если SSC включить только пепед непосредственной инициализацией его регистров.

Советую начинать отделять мух от котлет. Для начала разнесите на FIQ и IRQ.
Заодно посмотрите какой тип прерываний используете по фронту или по уровню и соответствует ли это типу вашего подтверждения (выхода) из прерывания.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Mar 31 2008, 09:17
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(_4afc_ @ Mar 31 2008, 12:06) *
Например WinAVR криво компилирует MSD если установлены ключи thumb
intrframework. Причём видно это на USB. Другие части кода работают нормально.
IAR вроде имел проблемы с преамбулой в обработчиках в какихто режимах.

IAR 4.31. Оптимизация отключена.

Цитата(_4afc_ @ Mar 31 2008, 12:06) *
Заодно посмотрите какой тип прерываний используете по фронту или по уровню и соответствует ли это типу вашего подтверждения (выхода) из прерывания.

На сколько я понимаю, для таймера и udp это не актуально.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 31 2008, 09:50
Сообщение #11


Гуру
******

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



Цитата(KAlex @ Mar 31 2008, 13:02) *
Если обрабатывается прерывание с высшем приоритетом, а в этот момент приходит более восьми запросов на прерывание от другого(одного и того же) источника. Что будет? В даташите как то скупо написано.

Ничего не будет: запросы с низшим приоритетом на время обработки маскируются.

У Вас Interrupt Nesting используется? Если да, то все ли корректно в коде обработчика прерывания TC?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 31 2008, 10:32
Сообщение #12


Гуру
******

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



Цитата(_4afc_ @ Mar 31 2008, 12:06) *
Например WinAVR криво компилирует MSD если установлены ключи thumb intrframework.
WinARM, наверное? Фигушки. И без --thumb-interwork генерит кривой пролог/эпилог.
Цитата(_4afc_ @ Mar 31 2008, 12:06) *
IAR вроде имел проблемы с преамбулой в обработчиках в какихто режимах.
Не нарывался. Скорее всего вы что-то путаете.


--------------------
На любой вопрос даю любой ответ
"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
_4afc_
сообщение Apr 1 2008, 07:54
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Цитата(Сергей Борщ @ Mar 31 2008, 14:32) *
Не нарывался. Скорее всего вы что-то путаете.

Я IAR не пользовался, возможно спутал с приведённой вами ссылкой про GCC.
Цитата(Сергей Борщ @ Mar 31 2008, 14:32) *
WinARM, наверное? Фигушки. И без --thumb-interwork генерит кривой пролог/эпилог.

WinAVR - конечно WinARM. У меня прерывания на асм написаны. И даже без --thumb-interwork, а просто если перенести весь или часть кода в thumb, то MSD коннектится не ко всем машинам стоящим в офисе. Причину не установил пока. Отваливается с повисанием контроллера. JTAG не разведён, поэтому сложно установить причину.
Заложил в новую партию SAM7S256 вместо SAM7S64, буду эксперементировать с кодом в озу и thumb для ускорения обмена более 2Мбит.

2KAlex:
А вы AT91C_BASE_AIC -> AIC_EOICR = AT91C_ID_TC0; делаете один раз? у вас в эпилоге или том, что вызывает timer0_irq_handler не пишется AIC_EOICR ? В этот регистр можно хоть 666 писать...
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 1 2008, 09:19
Сообщение #14


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(KAlex @ Mar 31 2008, 13:02) *
Если обрабатывается прерывание с высшем приоритетом, а в этот момент приходит более восьми запросов на прерывание от другого(одного и того же) источника. Что будет? В даташите как то скупо написано.

Ну если запросы не обрабатывать из текущего обработчика,то ничего. Другое дело сколько стека использует собственно сама функция-обработчик.


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
KAlex
сообщение Apr 1 2008, 09:27
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



Цитата(_4afc_ @ Apr 1 2008, 10:54) *
А вы AT91C_BASE_AIC -> AIC_EOICR = AT91C_ID_TC0; делаете один раз? у вас в эпилоге или том, что вызывает timer0_irq_handler не пишется AIC_EOICR ? В этот регистр можно хоть 666 писать...

В стартапе есть, выполняется только один раз при инициализации системы..
for (i=0; i<8; i++) AT91C_BASE_AIC->AIC_EOICR = 0; //clear INT steck
Ну и последняя команда в timer0_irq_handler.
Go to the top of the page
 
+Quote Post

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

 


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


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