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

Стабильность передачи по изернет.

LPC2478, 12МГц. M = 17, N = 0. Есть простая программа, переработанный пример, по таймеру запускается АЦП, заполняется массив 512 двух байтовых слова и скидывается этот массив по изернет в компьютер. Библиотеку работы с изернет взял в инсталлированном Keil (TCP_ARM_L.lib). Когда частота оцифровки не большая, до 60 кГц программа работает стабильно, поднимаю частоту выше, до 100 кГц, начинаются сбои передачи, программа из библиотеки выходит по ошибке ERR_MEM_LOCK или ERR_MEM_FREE, таймер и АЦП продолжают работать. Сам я никакие динамические массивы не использую, только статика.

По осциллографу видно, что запас по времени есть и не маленький, на пин вывожу 1 когда буфер заполнен, а снимаю 1, когда приходит сообщение TCP_EVT_ACK, период стабильной отправки заполненного массива равен 10,9 мс, время от начала передачи до прихода сообщение TCP_EVT_ACK - 240 мкс. При этом сигнала на АЦП нет. При подаче синуса, любой частоты передача прекращается. Стабильность передачи возобновляется только при периоде 16,4 мс.

Частота таймера для передачи по изернет 10 мс, минимум рекомендованного.

Не понятна зависимость наличия сигнала и периода стабильной передачи. Как заставить программу работать на частоте оцифровке 100 кГц?

Правильно я понимаю, если в функцию tcp_callback пришло сообщение TCP_EVT_ACK, то данные отправлены и все буфера освобождены?

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


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

Правильно я понимаю, если в функцию tcp_callback пришло сообщение TCP_EVT_ACK, то данные отправлены и все буфера освобождены?

Вроде бы нет. Это только значит что данные акнулись, то есть дошли до клиента, но буфера то еще почистить надо.... да написано что как они акнутся буфера почистятся, но думаю совсем не факт что это произойдет до вызова калбака, скорее после, дальше как бы в фоне. Информация о том что все дошло нужна оперативна, а памяти типа должно быть много

 

Вы при посылке проверяете можно ли отправлять и сколько может послать сокет?

tcp_check_send

tcp_max_dsize

 

корреляция с частотой отцифровки думаю в общей нагрузке на проц...

 

Частота таймера для передачи по изернет 10 мс, минимум рекомендованного.

я просто дергаю функцию main_TcpNet как могу чуть ли не раз в милисекунду если других дел нет, а вот таймер тот что

timer_tick делает у меня 100 мСек, он нужен для отслеживания времени жизни пакетов, а работа в первой функции происходит, ее то вы как часто дергаете?

 

 

Да еще сколько у вас памяти на все это выделено на сокеты и прочее в настройках? Может побольше дать?

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


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

Весь код работы с изернетом взял из примера и как рекомендуют здесь, соответственно передачу начинаю когда tcp_check_send() == true.

 

Величину tcp_max_dsize не превышаю, функция выдаёт 1460, использую 1032 байта.

 

Увеличение памяти не помогает. Наверно это предел.

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


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

main_TcpNet использую как рекомендует Keil, т.е. в основном цикле программы, реальный период не мерил.

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


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

АЦП когда молотит, оно это делает в прерывании или по ДМА? Может реально на работу стека ресурса не остается?

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


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

Померил период обращения к функции main_TcpNet, максимум 6.5мкс,

 

АЦП когда молотит, оно это делает в прерывании или по ДМА? Может реально на работу стека ресурса не остается?

 

АЦП работает по прерыванию. Привожу код инициализации таймеров и АЦП.

U32 ADCInit( U32 ADC_Clk )
{
/* Enable CLOCK into ADC controller */
PCONP |= (1 << 12);

AD0CR = ( 0x01 << NumCh ) | 	/* SEL=1,select channel 0~7 on ADC0 */
	( N_ADC << 8 ) |  /* CLKDIV = Fpclk / 4000000 - 1 */ 
	( 0 << 16 ) | 		/* BURST = 1, BURST */
	( 0 << 17 ) |		  /* CLKS = 0, 11 clocks/10 bits */
	( 1 << 21 ) |		  /* PDN = 1, normal operation */
	( 0 << 22 ) |		  /* TEST1:0 = 00 */
	( 4 << 24 ) |		  /* MAT0.1 */
	( 1 << 27 );		/* EDGE = 0 (CAP/MAT singal falling,trigger A/D conversion) */ 

/* If POLLING, no need to do the following */
AD0INTEN = 0x100 | (0x01 << NumCh);		/* Enable interrupts */
return (U32)install_irq( ADC0_INT, (void *)ADC0, HIGHEST_PRIORITY );
}

/*--------------------------- init ------------------------------------------*/
unsigned int SetTimer9 = 0x0000400;
//unsigned int SetTimer9 = 0x0000000ED;
static void init(void)
{
PCONP	 |=  0x40001000;				   /* Enable for ADC Ethernet block */
PINSEL1   |= 0x00054000;					/* Enable ADC&DAC Pins */

T1MCR = (3 << 0);// /*| (1 << 3)*/ | (1 << 4);
T1MR0 = TCNT - 1;
//	install_irq( TIMER1_INT, (void *)Timer1, HIGHEST_PRIORITY );

//	T0MCR = (1 << 3) | (1 << 4);  // MR1: Interrupt Reset
T0MCR = (1 << 4);  // MR1: Reset
T0MR1 = SetTimer9;
T0EMR = (1 << 1) |	 // MAT0.1  P1[29]
		(1 << 6)  // Set the corresponding External Match bit/output to 1 (MATn.m pin is 
					// HIGH if pinned out).
	   ;
//	install_irq( TIMER0_INT, (void *)Timer0, 1);//HIGHEST_PRIORITY );

ADCInit( ADC_CLK );
}

N_ADC расчётное и равно 512.

TCNT - 1 такое что бы период таймера был 10 мс

Таймер 1 работает на timer_tick.

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

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


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

а шарком не пробовали трафик посмотреть? может будет понятно где затык? У кейла достаточно стабильный стэк чтобы так обосраться....

 

Еще может драйвер мак уровня поглядеть? Может там что-то мешает и данные застревают где-то на пересылках?

 

 

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


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

Посмотрел я шарком, ни чего интересного, просто нет очередной посылки, сервер пытается несколько раз достучатся до клиента, но безуспешно и всё останавливается.

Если ставлю низкую скорость оцифровки программа всё равно вылетает, но позже, несколько минут работает.

 

Еще может драйвер мак уровня поглядеть? Может там что-то мешает и данные застревают где-то на пересылках?
А где и как его смотреть?

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


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

ну должен быть файл он обычно в имени имеет _EMAC_ в нем должен быть драйвер управления маком контроллера, там ДМА настраиваются, порты, и все прочее...

 

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

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

 

Если ставлю низкую скорость оцифровки программа всё равно вылетает, но позже, несколько минут работает.

то есть похоже все таки суммарный объем данных влияет, со стороны компьютера данные успевают высчитываться? Может все же окно на компьютере забивается?

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


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

Если ставлю низкую скорость оцифровки программа всё равно вылетает, но позже, несколько минут работает.

Была подобная ситуация. Заряжал АЦП на однотактное преобразование, по завершении вычитывал и запускал опять на преобразоваеие. В итоге получалось, что АЦП подвисал через разные промежутки времени от секунд до минут. Из ситуации вышел следующим образом. Зарядил АЦП на циклическое преобразование, а результат вычитывал по флагу завершения. Это помогло. Может и у Вас нечто сходное?

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


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

Была подобная ситуация. Заряжал АЦП на однотактное преобразование, по завершении вычитывал и запускал опять на преобразоваеие. В итоге получалось, что АЦП подвисал через разные промежутки времени от секунд до минут. Из ситуации вышел следующим образом. Зарядил АЦП на циклическое преобразование, а результат вычитывал по флагу завершения. Это помогло. Может и у Вас нечто сходное?

Скорей всего не та ситуация, осциллографом вижу что и таймер и АЦП продолжают работать, нет именно передачи.

 

По поводу _EMAC_. Там же всё в библиотеке, исходников стека у меня нет.

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


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

кстати, по умолчанию в стеке все ошибки вываливаются в while(1), там бы тоже заглушки заменить на правильную реакцию...

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


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

Вах!:) По EMAC не прав конечно, вот он какой есть, файлик этот LPC24_EMAC.c.

 

Осознать бы, где чего смотреть. LPC24_EMAC.c из примера взято, собственно вся моя программа из примеров собрана, сам только собрал проект из ... двух проектов LEDClient и ADC.

По поводу успевает ли приёмная сторона, период посылок 0.02 с (~45Гц), компьютер 3,4 ГГц 16Гб ОЗУ, думаю справляется. Но как я понимаю, если даже не справляется, то просто передача должна остановится, ошибки по памяти быть не должно.

Как то она не предсказуемо падает, иногда минуты не работает, а иногда 10-15 минут работает. Поставил контроль выделяемой памяти, если адрес в очередном цикле меняется, то это фиксируется. Перед падением часто адрес менялся, но в пределах двух килобайт.

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


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

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

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

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

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

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

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

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

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

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