|
|
  |
Приемные буферы в LwIP 1.3 для LPC2387 |
|
|
|
Oct 2 2008, 09:22
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792

|
Адаптирую сабжевый стек для работы под uCOS на LPC2387. Проблем с прикручиванием к оси не возникло т.к. примеров хватает. А вот с MAC уровнем сложнее. Нашел проект LwIPWeb, но там прием осуществляется простым копированием данных из Ethernet ram в обычную. В стеке есть возможность использовать POOLы, но нету возможности расположить PBUF_POOL в области Ethernet ram не помещая туда все остальные его части. Второй вариант – использовать при выделении памяти под pbuf опцию PBUF_REF, когда высвобождается память только под саму структуру, а буферы и указатели не них делать самому, но тут возникает куча вопросов по поводу того, как долго выделенные буферы будут использоваться стеком и не приведет ли такой подход к забиванию буфера. Есть третий вариант, это использование пересылки по DMA из Ethernet ram в обычную, это лучше, чем простое копирование, но я склоняюсь к варианту №2, как к более «правильному». Если кто-то делал по-другому, подскажите.
Сообщение отредактировал Hz! - Oct 2 2008, 09:23
|
|
|
|
|
Oct 2 2008, 10:09
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Hz! @ Oct 2 2008, 11:22)  А вот с MAC уровнем сложнее. Все, что есть по MAC в интернете - полный мрак. Единственне исключение от чего можно отталкиваться это официальный лицензированнный NXP порт NicheLite. Цитата Нашел проект LwIPWeb, но там прием осуществляется простым копированием данных из Ethernet ram в обычную MAC DMA доступна и "обычная" и "USB" RAM - если считаете нужным, то можете сразу куда угодно посылать. Цитата ...использование пересылки по DMA из Ethernet ram в обычную, это лучше, чем простое копирование А вот это не получится - GPDMA контроллер висит на другой шине и доступа к "Ethernet" просто не имеет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 2 2008, 10:41
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792

|
т.е. я могу в дескрипторах emac указывать адреса 0х40000000 .. 0x40010000 и он сразу туда будет складировать принимаемые данные, или я неправильно понял? Нашел: Цитата The base address registers for the descriptor array, registers indicating the number of descriptor array entries, and descriptor array input/output pointers are contained in the Ethernet block. The descriptor entries and all transmit and receive packet data are stored in memory which is not a part of the Ethernet block. The descriptor entries tell where related frame data is stored in memory, certain aspects of how the data is handled, and the result status of each Ethernet transaction.
Сообщение отредактировал Hz! - Oct 2 2008, 10:44
|
|
|
|
|
Oct 3 2008, 07:39
|
Участник

Группа: Участник
Сообщений: 66
Регистрация: 5-05-06
Из: Минск
Пользователь №: 16 792

|
Тогда план такой: в стеке резервирую пулы для приема в количестве больше, чем RxDescriptorNumber. При инициализации EMAC выделяю необходимое количество pbuf-ов (== RxDescriptorNumber), настраиваю дескрипторы и жду прихода пакета. Входящий пакет записываю в буферы, потом их склеиваю в один через указатели в структуре pbuf. Выделяю новые буферы и прописываю их адреса в дескрипторах, а принятый пакет передаю в стек. Когда он обработан и становится ненужным, он освобождается стеком, таким образом, восполняется количество свободных pool-ов. Покритикуйте, пожалуйста, такой подход.
|
|
|
|
|
Oct 3 2008, 10:54
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Hz! @ Oct 3 2008, 11:39)  Тогда план такой: в стеке резервирую пулы для приема в количестве больше, чем RxDescriptorNumber. При инициализации EMAC выделяю необходимое количество pbuf-ов (== RxDescriptorNumber), настраиваю дескрипторы и жду прихода пакета. Входящий пакет записываю в буферы, потом их склеиваю в один через указатели в структуре pbuf. Выделяю новые буферы и прописываю их адреса в дескрипторах, а принятый пакет передаю в стек. Когда он обработан и становится ненужным, он освобождается стеком, таким образом, восполняется количество свободных pool-ов. Покритикуйте, пожалуйста, такой подход. Я, собственно, так и делал, когда писал драйвер для Freescale MCF52233. Прикладываю его к этому посту. Отлажено и работает. Может быть, будет интересно взглянуть.
|
|
|
|
|
Oct 3 2008, 18:53
|

Знающий
   
Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065

|
г*вноданные: Цитата(zltigo @ Oct 2 2008, 16:50)  Функциональная схемка есть в datashit. Спасибо! Поржал. Сам бы никогда не допер, пока не увидел.
--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|