AlexTim
Dec 20 2006, 21:15
Собственно сделано устройство, альтеровская корка 4.0. Передаю пакетами по 32 слова в режиме Burst Memory Write Master Transaction данные в выделенный сегмент памяти размером 4 Мбайта.
Точнее хотелось бы, но когда мои донные должны были бы попасть в адреса на границе 4 кбайт, мост выставляет ошибку и корка выдает 'Disconnect Without Data'. И если обработать ошибку, то уходишь в цикл и крутишся до посинения.
Если дампить память данные действительно иногда теряются.
voffka
Dec 21 2006, 16:53
Спецификация PCI 2.3 (page 66):
This might be because the burst crosses a resource boundary or a resource conflict occurs.
Если транзакция пересекает границу 4 KB (resource boundary), то это и вызывает Disconnect (в соответствии со спецификацией). Необходимо избегать таких пакетов (варьировать размер/адрес таким образом, чтобы не пересекалась граница 4KB).
AlexTim
Dec 21 2006, 17:24
Похоже, но
- почему граница проходит через каждые 4КВ
- и я перередаю пакетами по 32 слова т.е. 128 байт и границу, если она есть, не пересекаю
voffka
Dec 21 2006, 17:41
1. 4KB - размер страницы памяти. Транзакция может работать с данными, располагающимися в одной странице.
2.Здесь имеет значение не размер транзакции,а совокупность адреса и размера. Т.е. если транзакция размером 128 байт обращается по адресу, удаленному от границы меньше,чем на 128 байт, то происходит пересечение границы.
AlexTim
Dec 21 2006, 18:03
Спасибо, что Вы подтвердили мои мысли.
Когда система выделяет раздел памяти он выравнивает границу до 2 КБ, но мы не верили и проверяли - не обнанывает.
Чтобы хоть как то, пришлось последнюю посылку сокращать на 2 слова. В результате в дампе последние 2 слова пустые.
Сложившаяся ситуация совершенно не устраивает, и вообще все как то абсурдно получается.
voffka
Dec 21 2006, 18:08
не за что)
А почему бы не выровнять адрес обращений?тогда не пришлось бы обрезать посылку.
AlexTim
Dec 21 2006, 18:25
Я ж говорю - выровнено.
И загружаю адреса: ххххххх00 либо ххххххх80.
У меня было такое, что bridge обрывал чтение на половине, даже без выравнивания. Заменил команду чтения на Memory Read Multiple, частично помогло. Для записи делать ничего не пришлось, т.к. данные всегда улетали полностью. Сделал следующее: проверяю количество действительно переданных слов. (Даже если операция чтения/записи заканчивается по Target Disconnect without data, те данные которые успели передаться с установленными IRDY и TRDY - валидны. См. описание PCI) Потом повторяется команда, но уже не сначала а со следующего адреса, по которому данные не были переданы. А вообще странно что именно последние 2 слова не прописываются.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.