|
|
  |
LwIP стек в STM32F217 |
|
|
|
Jan 17 2012, 14:12
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Спасибо за полезную информацию. Что имеется ввиду под консолью? Протестировал выдачу по UDP - 1 пакет 255 байт с помощью iperf -u -s -i1 -p 7 Вот результат  Неужели скорость всего 2кб/сек? Если так, то в чем загвоздка? А вот 500 пакетов  Не пойму, как это правильно разшифровать. Что такое 0.2 мс? Почему же такая маленькая скорость 1Mbits/sec ?
Сообщение отредактировал Acvarif - Jan 17 2012, 14:59
|
|
|
|
|
Jan 18 2012, 07:40
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(=F8= @ Jan 17 2012, 16:48)  Если кто не знает. В LwIP системма выдачи отладочной информации. 1. Чтоб ее задействовать нужно определить макрос LWIP_PLATFORM_DIAG в файле debug.h Если говорить про iar то все просто: #define LWIP_PLATFORM_DIAG printf и устанавливаете в опциях пректа флажек "include semihosting interfice", если поддерживает контороллер и отладчик включаете режим "Semihosted, stdout/stderr via SWO"(в режиме "Semihosted, stdout/stderr via semihosting" лучше даже не пытаться - уж больно тормозяво, если не получается через SWO лучше уж через UART предварительно написав драйвер с приличным буфером), в общем включаете выдачу отладочных сообщений на консоль. 2 в файле opt.h #define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL/LWIP_DBG_LEVEL_WARNING/LWIP_DBG_LEVEL_SERIOUS в зависимости от того какие сообщения хотите получать. там-же #define LWIP_DBG_TYPES_ON LWIP_DBG_ON там-же настраиваете от каких модулей хотите получать сообщения. 90% вопросов "почему не работает" отпадет при просмотре логов. Ваш К.О. Пытаюсь повторить в IAR. #define LWIP_PLATFORM_DIAG printf в файле debug.h установлено по умолчанию в файле opt.h по умолчанию Код #ifndef LWIP_DBG_MIN_LEVEL #define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL #endif#ifndef LWIP_DBG_TYPES_ON #define LWIP_DBG_TYPES_ON LWIP_DBG_ON #endif А это Цитата и устанавливаете в опциях пректа флажек "include semihosting interfice", не нашел. Пользуюсь J-Link 8
|
|
|
|
|
Jan 18 2012, 08:45
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(kan35 @ Jan 18 2012, 11:11)  Я бы не парился с этим режимом. лучше напишите свой putchar и гоните в свободный UART, их у вас все таки 5 Да я бы рад. LwIP определяет это так CODE #ifdef LWIP_DEBUG /** print debug message only if debug message type is enabled... * AND is of correct type AND is at least LWIP_DBG_LEVEL */ #define LWIP_PLATFORM_DIAG printf #define LWIP_DEBUGF(debug, message) do { \ if ( \ ((debug) & LWIP_DBG_ON) && \ ((debug) & LWIP_DBG_TYPES_ON) && \ ((s16_t)((debug) & LWIP_DBG_MASK_LEVEL) >= LWIP_DBG_MIN_LEVEL)) { \ LWIP_PLATFORM_DIAG message; \ if ((debug) & LWIP_DBG_HALT) { \ while(1); \ } \ } \ } while(0)
#else /* LWIP_DEBUG */ #define LWIP_DEBUGF(debug, message) #endif /* LWIP_DEBUG */ Получается определяет функцию для выдачи сообщений Как к ней приладить свой putchar?
|
|
|
|
|
Jan 18 2012, 10:44
|
Знающий
   
Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317

|
Цитата Получается определяет функцию для выдачи сообщений Как к ней приладить свой putchar? Все это делается в файле "сс.h" Вот мой CODE #ifndef __CCT_H__ #define __CCT_H__
#include <stdint.h> #include <intrinsics.h> #include "mk_heap.h"
#ifdef __cplusplus extern "C" { #endif
extern void dev_debugf(const char *args, ...); #define LWIP_PLATFORM_ASSERT(x) do \ {dev_debugf("Assertion \"%s\" failed at line %d in %s\r", x, __LINE__, __FILE__);} \ while(0) #define LWIP_PLATFORM_DIAG(x) {dev_debugf x;}
#define LWIP_NOASSERT #define LWIP_DEBUG #define ETHERNET_CHECKSUM_BY_HARDWARE #define PACK_STRUCT_USE_INCLUDES
#define PACK_STRUCT_STRUCT #define PACK_STRUCT_END #define PACK_STRUCT_FIELD(x) x
#define BYTE_ORDER LITTLE_ENDIAN #define LWIP_PLATFORM_BYTESWAP 1
#if LWIP_PLATFORM_BYTESWAP #define LWIP_PLATFORM_HTONS(x) __REV16(x) #define LWIP_PLATFORM_NTONS(x) __REV16(x) #define LWIP_PLATFORM_HTONL(x) __REV(x) #define LWIP_PLATFORM_NTONL(x) __REV(x) #endif
#define mem_free mk_free
#define mem_malloc mk_malloc
#define mem_calloc mk_calloc
#define LWIP_ERR_T int32_t
#define U16_F "u" #define S16_F "d" #define X16_F "x" #define U32_F "lu" #define S32_F "ld" #define X32_F "lx" typedef uint8_t u8_t; typedef int8_t s8_t; typedef uint16_t u16_t; typedef int16_t s16_t; typedef uint32_t u32_t; typedef int32_t s32_t; typedef uint64_t u64_t; typedef int64_t s64_t; typedef u32_t mem_ptr_t;
typedef uint32_t sys_prot_t;
#ifdef __cplusplus } #endif
#endif Сдесь функция dev_debugf это моя функция вывода в уарт.
Сообщение отредактировал IgorKossak - Jan 18 2012, 20:57
Причина редактирования: [codebox]!!!
|
|
|
|
|
Jan 18 2012, 11:25
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Цитата(Acvarif @ Jan 18 2012, 10:40)  А это не нашел. Пользуюсь J-Link 8 Извиняюсь, дал названия из eclipse. Непосредственно в IARе: Project->Option->General Option->Library Configuration->Library Low-level interface impletation ->Переключаете в в режим Semihosted и stdout/stderr в режим Via SWO. Если отлаживаете через JTAG, а не через SWD то режим Via SWO естественно недоступен. IAR 6.21. Цитата Я бы не парился с этим режимом. лучше напишите свой putchar и гоните в свободный UART, их у вас все таки 5 При наличии J-Linkа поддерживающего SWD и контроллера с SWD такой возможностью грех не воспользоватся. Уже давно на кортексах все отладочные сообщения вывожу именно через отладчик. А с UARTом не так все просто. Если в putchar тупо кидать данные в UART то, например при выводе более-менее приличного обема данных в прерывании есть шанс пропустить другое прерывание, это в худшем случае, но даже без этого вывод через UART без буфферизации занимает слишком много времени.
|
|
|
|
|
Jan 18 2012, 13:27
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(=F8= @ Jan 18 2012, 14:25)  Извиняюсь, дал названия из eclipse. Непосредственно в IARе: Project->Option->General Option->Library Configuration->Library Low-level interface impletation ->Переключаете в в режим Semihosted и stdout/stderr в режим Via SWO. Если отлаживаете через JTAG, а не через SWD то режим Via SWO естественно недоступен. IAR 6.21. Все сделал. Тоже в IAR 6.21 oph.h Код /** * API_LIB_DEBUG: Enable debugging in api_lib.c. */ #ifndef API_LIB_DEBUG #define API_LIB_DEBUG LWIP_DBG_OFF #endif Хотя файл защищен от записи. Пришлось изменить ему атрибуты и вместо LWIP_DBG_OFF написать LWIP_DBG_ON Отладчик запустился с появлением зеленой кнопки SWO, но сообщений пока на терминале нет. Хотя в api_lib.c есть что выводить на терминал Может еще что нужно сделать ON для того, чтобы увидеть работу терминала при работе стека?
Сообщение отредактировал Acvarif - Jan 18 2012, 13:33
|
|
|
|
|
Jan 18 2012, 13:57
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Прежде всего нужно переопределить макрос LWIP_DBG_TYPES_ON с LWIP_DBG_OFF на LWIP_DBG_ON - это глобальное разрешение выдачи отладочных сообщение. Затем макросом LWIP_DBG_MIN_LEVEL регулируем что именно мы хотим получать - все(LWIP_DBG_LEVEL_ALL), предупреждения(LWIP_DBG_LEVEL_WARNING) или ошибки (LWIP_DBG_LEVEL_SERIOUS). После с помощью макросов ETHARP_DEBUG, NETIF_DEBUG, PBUF_DEBUG...... в том числе API_LIB_DEBUG указывеме из каких модулей вы хотите получать сообщения( например API_LIB_DEBUG управляет отладочными сообщенияим из модуля api_lib.c). PS Для проверки добавте в main что-небудь вроде printf("test\r\n"); если с настройками собственно отладочных сообщений все в норме то при запуске увидите в терминале "test".
Сообщение отредактировал IgorKossak - Jan 18 2012, 20:56
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Jan 18 2012, 14:29
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Сделано так LWIP_DBG_ON LWIP_DBG_LEVEL_ALL CODE /** * UDP_DEBUG: Enable debugging in UDP. */ #ifndef UDP_DEBUG #define UDP_DEBUG LWIP_DBG_ON #endif ..... /** * UDP_DEBUG: Enable debugging in UDP. */ #ifndef UDP_DEBUG #define UDP_DEBUG LWIP_DBG_ON #endif В функцию мигания светодиодом и посылки UDP пакетов добавлено printf("test\r\n"); Код ........ /* toggle LED1 each 250ms */ STM_EVAL_LEDToggle(LED1); vTaskDelay(1000); printf("test\r\n"); .............. Не получается застревает на Код void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) { } } Восстанавливается если убрать printf("test\r\n");
Сообщение отредактировал IgorKossak - Jan 18 2012, 20:58
Причина редактирования: Бездумное цитирование
|
|
|
|
|
Jan 18 2012, 18:46
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(=F8= @ Jan 18 2012, 18:56)  Глубина стека в задаче какая? printf довольно стекожрущая процедура. Отлаживаете точно через SWD? PS если нет ничего военного выложите куда-небуть весь проект. Вроде через SWD (J-link v8 от starterkit) + платка от того же starterkit SK-STM32F217 Проект (Iar Arm 6.21) не военный, пока только тест на базе демки от st, для оценки возможностей FreeRTOS + LwIP + UDP. Находится тут http://depositfiles.com/files/aulnju494 В проекте закомментил все потоки кроме одного, в котором выдается 100 UDP пакетов по 255 байт в каждом один раз в секунду и при этом мигают 2 светодиода. Для консоли все настройки выставил. 1. Не пойму почему не позволяется создавать пакет больше 300 (с хвостиком) байт (поток виснет). 2. Никак не получается померять скорость Судя по времени за которое прокручивается выдача 25 000 байт (10 мс) получается 20 Mbits/s Маловато будет. Но очевидно так мерять не орректно. А iperf вооще показывает 0.2 Mbits/s Не пойму где тут собака порылась.
Сообщение отредактировал Acvarif - Jan 18 2012, 18:51
|
|
|
|
|
Jan 19 2012, 12:26
|
Знающий
   
Группа: Участник
Сообщений: 998
Регистрация: 27-08-08
Пользователь №: 39 850

|
Цитата(=F8= @ Jan 19 2012, 13:14)  Чтоб появились сообшения в настройках проекта укажите правильно частоту на которой работает контроллер Project->Option->J-Link/j-trace->Clock Setup->CPU Clock установить 120 MHz, SWO clock или оставить как есть или переключить в "Auto". Большое спасибо. Работает. Посоветуйте пожалуйста, что в opt.h нужно сделать ON для контроля работы netconn. Может сталкивались - не получается посылать UDP пакеты размером > 300 байт (#define SIZE 355) Поток застревает на Код /* create a new connection */ connn = netconn_new(NETCONN_UDP); После команды Break поток оказывается на Код void HardFault_Handler(void) { /* Go to infinite loop when Hard Fault exception occurs */ while (1) { } }
Сообщение отредактировал Acvarif - Jan 19 2012, 12:29
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|