|
|
  |
sam9xe MMU EMAC uIP |
|
|
|
Aug 12 2011, 18:22
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809

|
Здравствуйте! Модифицировал простой работающий на 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 Код проекта в приложении:
at91sam9xe_ek_basic_emac_uip_helloworld_prj.rar ( 470.7 килобайт )
Кол-во скачиваний: 75Помогите разобраться!
|
|
|
|
|
Aug 13 2011, 05:16
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809

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

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809

|
Цитата(aaarrr @ Aug 12 2011, 23:45)  Вы буферы EMAC не закэшировали ли часом? Переделал проект basic-emac-project, чтобы избавиться от uIP. Проблема та-же: после включения MMU, d-cache перестают приниматься/передаваться данные. Область памяти в которой располагаются дескрипторы и буферы чтения/записи EMAC не кэшируется. EMAC_Handler постоянно вызывается. Не устанавливается бит EMAC_RX_OWNERSHIP_BIT. Выкладываю basic-emac-project проект полностью.
basic_emac_project.rar ( 2.63 мегабайт )
Кол-во скачиваний: 73
|
|
|
|
|
Aug 16 2011, 09:56
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809

|
Цитата(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. Может быть я неправильно задал таблицу трансляции или буферы остались кэшируемыми? Если я все сделал правильно куда дальше "копать"?
Сообщение отредактировал IgorKossak - Aug 16 2011, 12:33
|
|
|
|
|
Aug 16 2011, 10:21
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(taoga @ Aug 16 2011, 13:56)  Может быть я неправильно задал таблицу трансляции или буферы остались кэшируемыми? Ну, на вид правильно. Цитата(taoga @ Aug 16 2011, 13:56)  Если я все сделал правильно куда дальше "копать"? Трясти надо. Попробуйте инвалидировать кэш перед обращениям к дескрипторам/буферам из программы.
|
|
|
|
|
Aug 16 2011, 16:42
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809

|
Цитата(sergeeff @ Aug 16 2011, 19:52)  Надеюсь область периферии не забыли тоже объявить как некешируемую? Не забыл. Получается, что не устанавливается флаг EMAC_RX_OWNERSHIP_BIT в дескрипторах буферов приема, или EMAC_Poll() не застает установленных флагов EMAC_RX_OWNERSHIP_BIT. Дескрипторы буферов приема передачи то-же помещены в некэшируемую область как и собственно буферы. Увеличивал количество буферов приемных до 64-х, но результат тот-же. Затык где-то в EMAC драйвере. В примерах FreeRTOS есть EMAC драйвер для sam7x, я этот пример собрал для sam9, но он не заработал.
|
|
|
|
|
Aug 16 2011, 20:00
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
1. Если честно, то так как вы инициализируете таблицу TTB ни без поллитры, ни с поллитрой не понять. В ecos есть хороший пример, как это внятно сделатъ. 2. Затем я бы перепроверил, действительно ли буфера и прочее попали в некешируемую область. 3. Внимателъно проверить правильно ли инициализирована структура дескриптора.
|
|
|
|
|
Aug 17 2011, 04:13
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809

|
Цитата(sergeeff @ Aug 17 2011, 00:00)  1. Если честно, то так как вы инициализируете таблицу TTB ни без поллитры, ни с поллитрой не понять. В ecos есть хороший пример, как это внятно сделатъ. Большей частью этот код результат работы нескольких человек с этого форума. Таблицы оформлены в коде таким образом для хранения во внутренней flash контроллера at91sam9xe. Код инициализации mmu, i-cache, d-cache работает, проверено. Я переносил буферы SPI для работы с PDC в некэшируемую область SRAM, после чего обмен по SPI с исп. PDC заработал.
|
|
|
|
|
Aug 22 2011, 07:22
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809

|
Цитата(sergeeff @ Aug 17 2011, 00:00)  2. Затем я бы перепроверил, действительно ли буфера и прочее попали в некешируемую область. Здравствуйте! Сегодня вышел на работу, перепроверил еще раз таблицы трансляции, нашел ошибку. Изменил icf, адреса сегментов таблиц, но не поменял адрес таблицы второго уровня в коде. Мои изменения за беспокойство! Всем спасибо! Добавляю работающий код (к проекту basic-emac...).
const_flash.rar ( 1.9 килобайт )
Кол-во скачиваний: 85
|
|
|
|
|
Aug 22 2011, 07:52
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(taoga @ Aug 22 2011, 10:22)  Здравствуйте! Сегодня вышел на работу, перепроверил еще раз таблицы трансляции, нашел ошибку. Изменил icf, адреса сегментов таблиц, но не поменял адрес таблицы второго уровня в коде. Мои изменения за беспокойство! Всем спасибо! Добавляю работающий код (к проекту basic-emac...).
const_flash.rar ( 1.9 килобайт )
Кол-во скачиваний: 85А вспомните, как вы первый раз ответили насчет проверенных-перепроверенных таблиц? Руками заполненная таблица в 4096 байт постоянный потенциальный источник проблем.
|
|
|
|
|
Aug 22 2011, 18:24
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809

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

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809

|
Здравствуйте! Заменил uIP на lwIP 1.3.2. За основу взял простой пример
tcpecho_raw.rar ( 3.58 килобайт )
Кол-во скачиваний: 85Как и раньше не использую SDRAM и соответственно в настройках lwIP все по минимуму. Получил скорость 1,7 Мбайт/сек. Пока не смог модифицировать проект для передачи потока данных от микроконтроллера в ПК. В связи с этим вопрос: Почти все примеры для TCP из lwIP используют методику запрос/ответ, т.е. на запрос с ПК возвращается порция данных. Как сделать, что-бы на запрос началась непрерывная передача данных? Как правильно использовать tcp_write не из callback функций, т.е. чтобы контроллер выступал инициатором передачи данных?
|
|
|
|
|
Sep 5 2011, 09:45
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 8-10-09
Пользователь №: 52 809

|
Цитата(taoga @ Aug 26 2011, 22:03)  Здравствуйте! Заменил uIP на lwIP 1.3.2. За основу взял простой пример
tcpecho_raw.rar ( 3.58 килобайт )
Кол-во скачиваний: 85Как и раньше не использую 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.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|