Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: sam9xe MMU EMAC uIP
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
taoga
Здравствуйте!
Модифицировал простой работающий на at91sam9xe-ek пример basic-emac-uip-helloworld-project из IAR 6, добавил поддержку d-cache и i-cache. После чего он частично перестал работать. Функция EMAC_Poll() возврашает код "нет принятых данных". Ниже вывод программы в терминале:
CODE
PreInitMMU
InitMMU - done.
-- Basic EMAC uIP Project 1.7-rc1 --
-- AT91SAM9XE-EK
-- Compiled: Aug 11 2011 14:49:07 --
- MAC 0:45:56:78:9a:bc
- Host IP 192.168.0.201
- Router IP 192.168.0.77
- Net Mask 255.255.255.0
-I- ** Valid PHY Found: 0
-I- AutoNegotiate complete
P: Link detected
P: clock time initialize - TC0
P: APP Init ... hello-world


Код проекта в приложении:
Нажмите для просмотра прикрепленного файла

Помогите разобраться!
aaarrr
Вы буферы EMAC не закэшировали ли часом?
taoga
Цитата(aaarrr @ Aug 12 2011, 23:45) *
Вы буферы EMAC не закэшировали ли часом?

Пробовал перемещать буферы и дескрипторы Rx Tx в некэшируемую область, не помогло.
Что еще есть в emac, macb что нужно переместить в некэшируюмую область?
taoga
Цитата(aaarrr @ Aug 12 2011, 23:45) *
Вы буферы EMAC не закэшировали ли часом?

Переделал проект basic-emac-project, чтобы избавиться от uIP.
Проблема та-же: после включения MMU, d-cache перестают приниматься/передаваться данные.
Область памяти в которой располагаются дескрипторы и буферы чтения/записи EMAC не кэшируется.

EMAC_Handler постоянно вызывается.
Не устанавливается бит EMAC_RX_OWNERSHIP_BIT.

Выкладываю basic-emac-project проект полностью.
Нажмите для просмотра прикрепленного файла
taoga
Цитата(taoga @ Aug 15 2011, 14:29) *
EMAC_Handler постоянно вызывается.
Не устанавливается бит EMAC_RX_OWNERSHIP_BIT.

Уточняю: Один раз выполняется условие в EMAC_Handler():
Код
if (( (AT91C_BASE_EMAC->EMAC_ISR & AT91C_BASE_EMAC->EMAC_IMR) & AT91C_EMAC_RCOMP) || (AT91C_BASE_EMAC->EMAC_RSR & AT91C_EMAC_REC)) {
        printf("RX packet\n\r");
        rxStatusFlag = AT91C_EMAC_REC;
...

и дальше в статистике сохраняется, что был установлен бит OVR регистра EMAC_RSR, т.е.
выполняется это условие:
Код
if (AT91C_BASE_EMAC->EMAC_RSR & AT91C_EMAC_OVR) {
            rxStatusFlag |= AT91C_EMAC_OVR;
            EmacStatistics.rx_ovrs++;
        }

Далее EMAC_Handler() вызывается "вхолостую" нет ни приема, ни передачи.

Такая ситуация возникает, когда включаются d-cache, i-cache, mmu.
Может быть я неправильно задал таблицу трансляции или буферы остались кэшируемыми?
Если я все сделал правильно куда дальше "копать"?
aaarrr
Цитата(taoga @ Aug 16 2011, 13:56) *
Может быть я неправильно задал таблицу трансляции или буферы остались кэшируемыми?

Ну, на вид правильно.

Цитата(taoga @ Aug 16 2011, 13:56) *
Если я все сделал правильно куда дальше "копать"?

Трясти надо. Попробуйте инвалидировать кэш перед обращениям к дескрипторам/буферам из программы.
sergeeff
Надеюсь область периферии не забыли тоже объявить как некешируемую?
taoga
Цитата(sergeeff @ Aug 16 2011, 19:52) *
Надеюсь область периферии не забыли тоже объявить как некешируемую?

Не забыл.
Получается, что не устанавливается флаг EMAC_RX_OWNERSHIP_BIT в дескрипторах буферов приема,
или EMAC_Poll() не застает установленных флагов EMAC_RX_OWNERSHIP_BIT.
Дескрипторы буферов приема передачи то-же помещены в некэшируемую область как и собственно буферы.
Увеличивал количество буферов приемных до 64-х, но результат тот-же.
Затык где-то в EMAC драйвере.
В примерах FreeRTOS есть EMAC драйвер для sam7x, я этот пример собрал для sam9, но он не заработал.
sergeeff
1. Если честно, то так как вы инициализируете таблицу TTB ни без поллитры, ни с поллитрой не понять. В ecos есть хороший пример, как это внятно сделатъ.

2. Затем я бы перепроверил, действительно ли буфера и прочее попали в некешируемую область.

3. Внимателъно проверить правильно ли инициализирована структура дескриптора.
taoga
Цитата(sergeeff @ Aug 17 2011, 00:00) *
1. Если честно, то так как вы инициализируете таблицу TTB ни без поллитры, ни с поллитрой не понять. В ecos есть хороший пример, как это внятно сделатъ.

Большей частью этот код результат работы нескольких человек с этого форума. Таблицы оформлены в коде таким образом для хранения во внутренней flash контроллера at91sam9xe.
Код инициализации mmu, i-cache, d-cache работает, проверено.
Я переносил буферы SPI для работы с PDC в некэшируемую область SRAM, после чего обмен по SPI с исп. PDC заработал.
taoga
Цитата(sergeeff @ Aug 17 2011, 00:00) *
2. Затем я бы перепроверил, действительно ли буфера и прочее попали в некешируемую область.


Здравствуйте!
Сегодня вышел на работу, перепроверил еще раз таблицы трансляции, нашел ошибку.
Изменил icf, адреса сегментов таблиц, но не поменял адрес таблицы второго уровня в коде.
Мои изменения за беспокойство! Всем спасибо!
Добавляю работающий код (к проекту basic-emac...).
Нажмите для просмотра прикрепленного файла
sergeeff
Цитата(taoga @ Aug 22 2011, 10:22) *
Здравствуйте!
Сегодня вышел на работу, перепроверил еще раз таблицы трансляции, нашел ошибку.
Изменил icf, адреса сегментов таблиц, но не поменял адрес таблицы второго уровня в коде.
Мои изменения за беспокойство! Всем спасибо!
Добавляю работающий код (к проекту basic-emac...).
Нажмите для просмотра прикрепленного файла


А вспомните, как вы первый раз ответили насчет проверенных-перепроверенных таблиц? Руками заполненная таблица в 4096 байт постоянный потенциальный источник проблем.
taoga
Цитата(sergeeff @ Aug 22 2011, 11:52) *
А вспомните, как вы первый раз ответили насчет проверенных-перепроверенных таблиц? Руками заполненная таблица в 4096 байт постоянный потенциальный источник проблем.

Мои извинения за беспокойство! Всем спасибо!
taoga
Здравствуйте!
Заменил uIP на lwIP 1.3.2. За основу взял простой пример
Нажмите для просмотра прикрепленного файла
Как и раньше не использую SDRAM и соответственно в настройках lwIP все по минимуму. Получил скорость 1,7 Мбайт/сек.
Пока не смог модифицировать проект для передачи потока данных от микроконтроллера в ПК.
В связи с этим вопрос: Почти все примеры для TCP из lwIP используют методику запрос/ответ, т.е. на запрос с ПК возвращается порция данных. Как сделать, что-бы на запрос началась непрерывная передача данных? Как правильно использовать tcp_write не из callback функций, т.е. чтобы контроллер выступал инициатором передачи данных?
taoga
Цитата(taoga @ Aug 26 2011, 22:03) *
Здравствуйте!
Заменил uIP на lwIP 1.3.2. За основу взял простой пример
Нажмите для просмотра прикрепленного файла
Как и раньше не использую SDRAM и соответственно в настройках lwIP все по минимуму. Получил скорость 1,7 Мбайт/сек.
Пока не смог модифицировать проект для передачи потока данных от микроконтроллера в ПК.
В связи с этим вопрос: Почти все примеры для TCP из lwIP используют методику запрос/ответ, т.е. на запрос с ПК возвращается порция данных. Как сделать, что-бы на запрос началась непрерывная передача данных? Как правильно использовать tcp_write не из callback функций, т.е. чтобы контроллер выступал инициатором передачи данных?

Исправил ошибки, все заработало, без оптимизации lwip с драйверами Atmel. Lwip 1.3.1, raw TCP/IP без FreeRtos. Данные "заталкиваю" в стек из основного цикла программы.

Для размера сегмента:
512 байт - скорость 7 Мбайт/сек.
1024 байт - 10 Мбайт/с.

Больше не экспериментировал, т.к. в проекте не используется SDRAM. Все буферы в SRAM.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.