Oleg_IT 0 10 августа, 2015 Опубликовано 10 августа, 2015 · Жалоба 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, то данные отправлены и все буфера освобождены? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 11 августа, 2015 Опубликовано 11 августа, 2015 · Жалоба Правильно я понимаю, если в функцию tcp_callback пришло сообщение TCP_EVT_ACK, то данные отправлены и все буфера освобождены? Вроде бы нет. Это только значит что данные акнулись, то есть дошли до клиента, но буфера то еще почистить надо.... да написано что как они акнутся буфера почистятся, но думаю совсем не факт что это произойдет до вызова калбака, скорее после, дальше как бы в фоне. Информация о том что все дошло нужна оперативна, а памяти типа должно быть много Вы при посылке проверяете можно ли отправлять и сколько может послать сокет? tcp_check_send tcp_max_dsize корреляция с частотой отцифровки думаю в общей нагрузке на проц... Частота таймера для передачи по изернет 10 мс, минимум рекомендованного. я просто дергаю функцию main_TcpNet как могу чуть ли не раз в милисекунду если других дел нет, а вот таймер тот что timer_tick делает у меня 100 мСек, он нужен для отслеживания времени жизни пакетов, а работа в первой функции происходит, ее то вы как часто дергаете? Да еще сколько у вас памяти на все это выделено на сокеты и прочее в настройках? Может побольше дать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 11 августа, 2015 Опубликовано 11 августа, 2015 · Жалоба Весь код работы с изернетом взял из примера и как рекомендуют здесь, соответственно передачу начинаю когда tcp_check_send() == true. Величину tcp_max_dsize не превышаю, функция выдаёт 1460, использую 1032 байта. Увеличение памяти не помогает. Наверно это предел. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 11 августа, 2015 Опубликовано 11 августа, 2015 · Жалоба main_TcpNet как часто дергаете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 12 августа, 2015 Опубликовано 12 августа, 2015 · Жалоба main_TcpNet использую как рекомендует Keil, т.е. в основном цикле программы, реальный период не мерил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 12 августа, 2015 Опубликовано 12 августа, 2015 · Жалоба АЦП когда молотит, оно это делает в прерывании или по ДМА? Может реально на работу стека ресурса не остается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 12 августа, 2015 Опубликовано 12 августа, 2015 (изменено) · Жалоба Померил период обращения к функции 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. Изменено 13 августа, 2015 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 12 августа, 2015 Опубликовано 12 августа, 2015 · Жалоба а шарком не пробовали трафик посмотреть? может будет понятно где затык? У кейла достаточно стабильный стэк чтобы так обосраться.... Еще может драйвер мак уровня поглядеть? Может там что-то мешает и данные застревают где-то на пересылках? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 17 августа, 2015 Опубликовано 17 августа, 2015 · Жалоба Посмотрел я шарком, ни чего интересного, просто нет очередной посылки, сервер пытается несколько раз достучатся до клиента, но безуспешно и всё останавливается. Если ставлю низкую скорость оцифровки программа всё равно вылетает, но позже, несколько минут работает. Еще может драйвер мак уровня поглядеть? Может там что-то мешает и данные застревают где-то на пересылках?А где и как его смотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 августа, 2015 Опубликовано 17 августа, 2015 · Жалоба ну должен быть файл он обычно в имени имеет _EMAC_ в нем должен быть драйвер управления маком контроллера, там ДМА настраиваются, порты, и все прочее... осмотрел я шарком, ни чего интересного, просто нет очередной посылки, сервер пытается несколько раз достучатся до клиента, но безуспешно и всё останавливается. у вас случаем не включено управление поток и вы не забываете окно очищать? Вдруг это не выход, а вход мешает... Если ставлю низкую скорость оцифровки программа всё равно вылетает, но позже, несколько минут работает. то есть похоже все таки суммарный объем данных влияет, со стороны компьютера данные успевают высчитываться? Может все же окно на компьютере забивается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 17 августа, 2015 Опубликовано 17 августа, 2015 · Жалоба Если ставлю низкую скорость оцифровки программа всё равно вылетает, но позже, несколько минут работает. Была подобная ситуация. Заряжал АЦП на однотактное преобразование, по завершении вычитывал и запускал опять на преобразоваеие. В итоге получалось, что АЦП подвисал через разные промежутки времени от секунд до минут. Из ситуации вышел следующим образом. Зарядил АЦП на циклическое преобразование, а результат вычитывал по флагу завершения. Это помогло. Может и у Вас нечто сходное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 17 августа, 2015 Опубликовано 17 августа, 2015 · Жалоба Была подобная ситуация. Заряжал АЦП на однотактное преобразование, по завершении вычитывал и запускал опять на преобразоваеие. В итоге получалось, что АЦП подвисал через разные промежутки времени от секунд до минут. Из ситуации вышел следующим образом. Зарядил АЦП на циклическое преобразование, а результат вычитывал по флагу завершения. Это помогло. Может и у Вас нечто сходное? Скорей всего не та ситуация, осциллографом вижу что и таймер и АЦП продолжают работать, нет именно передачи. По поводу _EMAC_. Там же всё в библиотеке, исходников стека у меня нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 августа, 2015 Опубликовано 17 августа, 2015 · Жалоба все, да не все:) драйвер EMAC_LPC... отдельным файлом должен быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 17 августа, 2015 Опубликовано 17 августа, 2015 · Жалоба кстати, по умолчанию в стеке все ошибки вываливаются в while(1), там бы тоже заглушки заменить на правильную реакцию... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Oleg_IT 0 17 августа, 2015 Опубликовано 17 августа, 2015 · Жалоба Вах!:) По EMAC не прав конечно, вот он какой есть, файлик этот LPC24_EMAC.c. Осознать бы, где чего смотреть. LPC24_EMAC.c из примера взято, собственно вся моя программа из примеров собрана, сам только собрал проект из ... двух проектов LEDClient и ADC. По поводу успевает ли приёмная сторона, период посылок 0.02 с (~45Гц), компьютер 3,4 ГГц 16Гб ОЗУ, думаю справляется. Но как я понимаю, если даже не справляется, то просто передача должна остановится, ошибки по памяти быть не должно. Как то она не предсказуемо падает, иногда минуты не работает, а иногда 10-15 минут работает. Поставил контроль выделяемой памяти, если адрес в очередном цикле меняется, то это фиксируется. Перед падением часто адрес менялся, но в пределах двух килобайт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться