|
STM32F4 Ethernet + Dallas: перетягивание каната |
|
|
|
Aug 27 2015, 04:15
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Всем привет. Есть девайс : stm + 1-wire шина (реализованная аппаратным UART'ом) + ethernet (обслуживается стеком Lwip), управляется FreeRTOS. Есть 2 задачи (есть и другие, но они на работу не влияют): 1) Обслуживание Ethernet (приоритет realtime (highest)) 2) Обслуживание шины 1 wire. (задача выполняется раз в секунду с osDelay(1000)  Этапы: - поиск устройств на шине - запись инициализирующих данных (для каждого по серийнику из найденных) - конвертация температуры (для всех) - osDelay(100); - конвертация напряжения/тока (для всех СКИП РОМ) - osDelay(5); - чтение памяти каждого датчика (по серийнику) Если приоритет 2й задачи нормал или хай (ниже езернетного таска), езернет работает отлично (пинг без потерь, время ответа 1 мс), однако датчики Даллас работают с перебоем - видимо нарушаются задержки в протоколе общения (задержки аппаратные, т.к. 1-wire шина эмулируется ЮАРТом). Если приоритет 2й задачи = приоритету езернета, езернет работает неситабильно, регулярно время ответа увеличивается до 10-100мс (при 3 датчика Даллас на шине 1-wire) (в этот момент видимо проц занят работой 2й задачи, по обслуживанию шины 1-wire). Посоветуйте, плиз, как оптимизировать работу этих 2х задач, что бы задача 1 работала стабильно (с текущим приоритетом), задача 2 так же работала стабильно, выполняясь раз в секунду. Второй вопрос по тему: FreeRTOS к девайсу прикрутил совсем недавно. Разбираюсь с распределением памяти. На данный момент определяюсь, сколько памяти отдать каждой задачи. Вроде как нужно определить функцию диагностики стэка ОС, которой определять, у какой задачи переполняется стек, увеличивать стек каждой задачи пока не прекратится переполнение. Верно? Как определить такую диагностическую функцию? не могу найти ее в исходниках. Как посчитать (хотя бы ориентировочно), сколько кучи выделить в целом ОС (configTOTAL_HEAP_SIZE) ? И влияет ли размер памяти, выделяемой для Ос на настройки стека/кучи всего Си проекта?
|
|
|
|
|
 |
Ответов
|
Aug 28 2015, 05:47
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Что бы не создавать вторую тему, задам вопрос в этой, касаемо lwIP + FreeRTOS. При большом количестве широковещательных пакетов (броадкаст) (ipTV к примеру) девайс в ообщей сети начинает задыхаться - потери пинг пакетов. Подобная проблема наблюдается и в проекте без FreeRTOS и без работы датчиков и прочего (только ethernet + lwIP) Подозреваю, необходимо подкрутить некоторые настройки Lwip в файлике lwipopts.h - размеры памяти/буферов сделать побольше CODE /* ---------- Memory options ---------- */ /* MEM_ALIGNMENT: should be set to the alignment of the CPU for which lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2 byte alignment -> define MEM_ALIGNMENT to 2. */ #define MEM_ALIGNMENT 4
/* MEM_SIZE: the size of the heap memory. If the application will send a lot of data that needs to be copied, this should be set high. */ #define MEM_SIZE (10*1024)
/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application sends a lot of data out of ROM (or other static memory), this should be set high. */ #define MEMP_NUM_PBUF 10 /* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One per active UDP "connection". */ #define MEMP_NUM_UDP_PCB 6 /* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP connections. */ #define MEMP_NUM_TCP_PCB 10 /* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP connections. */ #define MEMP_NUM_TCP_PCB_LISTEN 6 /* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP segments. */ #define MEMP_NUM_TCP_SEG 12 /* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active timeouts. */ #define MEMP_NUM_SYS_TIMEOUT 10
/* ---------- Pbuf options ---------- */ /* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ #define PBUF_POOL_SIZE 10
/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */ #define PBUF_POOL_BUFSIZE 1524
/* ---------- TCP options ---------- */ #define LWIP_TCP 1 #define TCP_TTL 255
/* Controls if TCP should queue segments that arrive out of order. Define to 0 if your device is low on memory. */ #define TCP_QUEUE_OOSEQ 0
/* TCP Maximum segment size. */ #define TCP_MSS (1500 - 40) /* TCP_MSS = (Ethernet MTU - IP header size - TCP header size) */
/* TCP sender buffer space (bytes). */ #define TCP_SND_BUF (4*TCP_MSS)
/* TCP_SND_QUEUELEN: TCP sender buffer space (pbufs). This must be at least as much as (2 * TCP_SND_BUF/TCP_MSS) for things to work. */
#define TCP_SND_QUEUELEN (2* TCP_SND_BUF/TCP_MSS)
/* TCP receive window. */ #define TCP_WND (2*TCP_MSS)
Сообщение отредактировал IgorKossak - Aug 28 2015, 07:02
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Aug 28 2015, 06:37
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(k000858 @ Aug 28 2015, 08:47)  Подозреваю, необходимо подкрутить некоторые настройки Lwip в файлике lwipopts.h - размеры памяти/буферов сделать побольше Сомневаюсь. Скорее всего, всё упирается не в память, а в быстродействие, а его так просто не подкрутишь. Самый простой выход - не надо включать этот прибор в сеть, по которой гуляет IPTV. В конце концов, это же не игрушка (надеюсь). Можно, зная тип пакетов, которые мешают, организовать раннюю фильтрацию, чтобы пакеты отбрасывались как можно раньше и не грузили процессор. ЕМНИП, некоторые MAC'и могут это делать аппаратно. Естественно, для этого нужно лезть внутрь lwip и править код. Но в любом случае в условиях недостатка быстродействия всегда будет способ устроить DoS атаку, никуда от этого не деться. Хотя не исключён вариант, что просто где-то не хватает буферов. Сразу бежать и крутить какие-то настройки - это танец с бубном. Для начала нужно замерить загрузку процессора и загрузку буферов, а потом решать, что делать.
|
|
|
|
|
Aug 28 2015, 06:50
|

Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 31-01-12
Пользователь №: 69 978

|
Цитата(scifi @ Aug 28 2015, 09:37)  Сомневаюсь. Скорее всего, всё упирается не в память, а в быстродействие, а его так просто не подкрутишь. Самый простой выход - не надо включать этот прибор в сеть, по которой гуляет IPTV. В конце концов, это же не игрушка (надеюсь). Можно, зная тип пакетов, которые мешают, организовать раннюю фильтрацию, чтобы пакеты отбрасывались как можно раньше и не грузили процессор. ЕМНИП, некоторые MAC'и могут это делать аппаратно. Естественно, для этого нужно лезть внутрь lwip и править код. Но в любом случае в условиях недостатка быстродействия всегда будет способ устроить DoS атаку, никуда от этого не деться. Хотя не исключён вариант, что просто где-то не хватает буферов. Сразу бежать и крутить какие-то настройки - это танец с бубном. Для начала нужно замерить загрузку процессора и загрузку буферов, а потом решать, что делать. достаточно запустить броадкаст флудер (UDPшный) и пинг пропадает. от широковещательного трафика никуда не деться, его становится со временем все больше. в принципе то производительно довольно высокая: 168МГц камень, езернет 100мб/с фулл, даже без ос (и остальных задач).
|
|
|
|
|
Aug 28 2015, 16:31
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(k000858 @ Aug 28 2015, 09:50)  ...в принципе то производительно довольно высокая: 168МГц камень, езернет 100мб/с фулл, даже без ос (и остальных задач). и вполне хватает для сканирования эннного кол-ва 1Wire датчиков, с поддержкой 100МБит при максимальных 65535 пинговых пакетах, непрерывно, фулл рефрэш вэб морды, модбасы, порты логические, аналоговые, управление шимом, логика работы всего устройства, поддержка wifi, обработка бродкастов входящих, опрос локальной сети и опорного вэб сервера - всё этот камень протаскивает на ура в одной задаче... Сам lwip надо грамотно посмотреть глазками. Лично сам - находил там пару косяков. Всё перетряс, где было подозрительно - переписал. Особенно сам обработчик DMA прерывания, работа с памятью, ну и TCP состояния выпрямил(а то там косячёкс был в оригинале)... Я было хотел вчерась ещё отписаться, но Вам всё уже выше грамотно изложили. Рекомендую прислушаться к товарищу scifi - судя по инет инфе - он не мало соли переел по сетевым делам...
|
|
|
|
Сообщений в этой теме
k000858 STM32F4 Ethernet + Dallas: перетягивание каната Aug 27 2015, 04:15 SasaVitebsk Есть понятие системного тика. Это время переключен... Aug 27 2015, 04:59 k000858 Цитата(SasaVitebsk @ Aug 27 2015, 07:59) ... Aug 27 2015, 05:09  SasaVitebsk Цитата(k000858 @ Aug 27 2015, 08:09) При ... Aug 27 2015, 05:57 mantech Цитата(k000858 @ Aug 27 2015, 07:15) Есть... Aug 27 2015, 06:17 Сергей Борщ Цитата(mantech @ Aug 27 2015, 09:17) Личн... Aug 27 2015, 07:42 jcxz Цитата(mantech @ Aug 27 2015, 12:17) Личн... Aug 27 2015, 08:03 SasaVitebsk Как формируются задержки при работе с ОСью.
Моё ви... Aug 27 2015, 06:18 scifi Цитата(k000858 @ Aug 27 2015, 07:15) Если... Aug 27 2015, 06:23 k000858 Цитата(scifi @ Aug 27 2015, 09:23) Дурдом... Aug 27 2015, 06:53  scifi Цитата(k000858 @ Aug 27 2015, 09:53) може... Aug 27 2015, 07:17  SasaVitebsk Цитата(k000858 @ Aug 27 2015, 09:53) пока... Aug 27 2015, 07:39 bugdesigner Проблема с нестабильностью 1-wire скорее всего свя... Aug 27 2015, 07:07 k000858 Цитата(bugdesigner @ Aug 27 2015, 10:07) ... Aug 27 2015, 07:21  jcxz Цитата(k000858 @ Aug 27 2015, 13:21) в ка... Aug 27 2015, 07:49 Сергей Борщ Цитата(k000858 @ Aug 27 2015, 07:15) одна... Aug 27 2015, 07:36 Сергей Борщ Добавлено: так у вас там еще и ПДП. Тогда вообще н... Aug 27 2015, 07:50 SasaVitebsk Вот кидаю вам картинку, где виден плагин FreeRTOS,... Aug 27 2015, 08:29 k000858 Цитата(SasaVitebsk @ Aug 27 2015, 11:29) ... Aug 27 2015, 08:33  SasaVitebsk Цитата(k000858 @ Aug 27 2015, 11:33) вот ... Aug 27 2015, 08:46  jcxz Цитата(k000858 @ Aug 27 2015, 14:33) вот ... Aug 27 2015, 08:53 k000858 а теперь вопрос на миллион!!!
1) задач... Aug 27 2015, 09:02 scifi Цитата(k000858 @ Aug 27 2015, 12:02) при ... Aug 27 2015, 09:32 jcxz Цитата(k000858 @ Aug 27 2015, 15:02) при ... Aug 27 2015, 09:34  k000858 Цитата(jcxz @ Aug 27 2015, 12:34) Ну если... Aug 27 2015, 10:41 SasaVitebsk Я бы никаких критических секций не делал. И даже н... Aug 27 2015, 11:27 k000858 Цитата(SasaVitebsk @ Aug 27 2015, 14:27) ... Aug 28 2015, 02:47 jcxz Цитата(SasaVitebsk @ Aug 27 2015, 17:27) ... Aug 28 2015, 16:23   scifi Цитата(k000858 @ Aug 28 2015, 09:50) в пр... Aug 28 2015, 10:05 k000858 появился еще вопрос от относительно ФрииРТОС: есть... Sep 1 2015, 10:54 kolobok0 Цитата(k000858 @ Sep 1 2015, 13:54) ... е... Sep 1 2015, 11:20 SasaVitebsk Переменные передаваемые при создании задачи служат... Sep 1 2015, 18:37 k000858 весьма информативно. благодарю.
исследование работ... Sep 2 2015, 03:03 k000858 в процессе доработки столкнулся с зависанием некот... Sep 2 2015, 06:50 Сергей Борщ Цитата(k000858 @ Sep 2 2015, 09:50) задач... Sep 2 2015, 06:54 jcxz Цитата(k000858 @ Sep 2 2015, 12:50) Есть ... Sep 2 2015, 06:59 k000858 да это понятное дело, что я могу сам сваять некий ... Sep 2 2015, 07:02 jcxz Цитата(k000858 @ Sep 2 2015, 13:02) да эт... Sep 3 2015, 03:45 k000858 Если мне необходимо выполнять некую задачу (наприм... Sep 3 2015, 07:15 SasaVitebsk Ну я так понимаю, что вам же не надо точно 1 сек? ... Sep 4 2015, 05:22 k000858 Цитата(SasaVitebsk @ Sep 4 2015, 08:22) Н... Sep 4 2015, 08:07 SasaVitebsk 1. Я не совсем понял ф-ции osSemaphoreRelease/ osS... Sep 7 2015, 06:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|