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

 
 
4 страниц V  < 1 2 3 4 >  
Reply to this topicStart new topic
> LwIP стек в STM32F217
Acvarif
сообщение Jan 17 2012, 14:12
Сообщение #31


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jan 17 2012, 15:59
Сообщение #32


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Цитата(Acvarif @ Jan 17 2012, 18:12) *
Спасибо за полезную информацию.
Что имеется ввиду под консолью?

Если непосредственно в IARе то в режиме отладки View->Terminal IO. Если используете как оболочку Eclipse то Window->Show View->Console, в окне консоли нажимаете кнопку с монитором и выбираете C-SPY Terminal I/O.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 18 2012, 07:40
Сообщение #33


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
kan35
сообщение Jan 18 2012, 08:11
Сообщение #34


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Я бы не парился с этим режимом.
лучше напишите свой putchar и гоните в свободный UART, их у вас все таки 5
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 18 2012, 08:45
Сообщение #35


Знающий
****

Группа: Участник
Сообщений: 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?
Go to the top of the page
 
+Quote Post
kan35
сообщение Jan 18 2012, 10:16
Сообщение #36


Знающий
****

Группа: Участник
Сообщений: 537
Регистрация: 22-02-06
Пользователь №: 14 594



Все верно у тебя сделано.

Чтобы printf куда-то выводил строки, надо ему дать через что, вот putchar и есть это "что", пиши свою ф-ю по типу:
int putchar (int);
В ней просто вываливай байт в последовательный порт
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Jan 18 2012, 10:44
Сообщение #37


Знающий
****

Группа: 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]!!!
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jan 18 2012, 11:25
Сообщение #38


Знающий
****

Группа: Свой
Сообщений: 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 без буфферизации занимает слишком много времени.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 18 2012, 13:27
Сообщение #39


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jan 18 2012, 13:57
Сообщение #40


Знающий
****

Группа: Свой
Сообщений: 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
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 18 2012, 14:29
Сообщение #41


Знающий
****

Группа: Участник
Сообщений: 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
Причина редактирования: Бездумное цитирование
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jan 18 2012, 15:56
Сообщение #42


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Глубина стека в задаче какая? printf довольно стекожрущая процедура. Отлаживаете точно через SWD?
PS если нет ничего военного выложите куда-небуть весь проект.
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 18 2012, 18:46
Сообщение #43


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
=F8=
сообщение Jan 19 2012, 10:14
Сообщение #44


Знающий
****

Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954



Чтоб появились сообшения в настройках проекта укажите правильно частоту на которой работает контроллер Project->Option->J-Link/j-trace->Clock Setup->CPU Clock установить 120 MHz, SWO clock или оставить как есть или переключить в "Auto".
Go to the top of the page
 
+Quote Post
Acvarif
сообщение Jan 19 2012, 12:26
Сообщение #45


Знающий
****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post

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

 


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


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