nabbla (nabbla1) wrote,
nabbla
nabbla1

Продолжаем отладку обнаружения точек

Чего-то расслабился, пора возвращаться к своим баранам. Итак, кусочек картинки успевает обработаться, но потом "слетает" либо с исчерпанием "динамической памяти" (Heap memory, она нам исключительно под списки ярких точек), либо с исчерпанием очереди заданий для видеопроцессора (видать, точек так много обнаружено, что не успеваем все обработать - а очередная строка уже поступает!)

Да, "на лету" - это сложнее, чем как у наших заклятых друзей, с сохранением двух кадров в память и "неторопливой обработкой" на DSP...

Подумалось: может быть, и секунды не хватило, чтобы экспозиция пришла к норме? Решил вместо выжидания секунды просто дождаться "отмашки" с компьютера по UART:

	;нее, давайте тупо с компьютера дождёмся
	SIO		UART
	NOP		IN


И не тут-то было: начинает сразу же работать!

Да как так-то...



RAW Hazard - догадался Штирлиц! В смысле, Read-After-Write.

Поскольку левая часть команды (DestAddr) выполняется на такт позже правой части (SrcAddr), то команда SIO (выбрать устройство ввода-вывода) и IN (получить данные со входа) выполняются одновременно, то есть IN работает ещё со "старым" устройством.

Такая проблема может возникнуть только у пары "SIO" - "IN". Если SIO и OUT - они обе команды DestAddr, и заведомо пойдут одна за другой. IN и OUT работающие одновременно - тоже никакой проблемы, поскольку устройство ввода и устройство вывода по сути независимы, даже если называются одинаково (UART). С SPI всё несколько хитрее, но и там, насколько помню, одновременная подача IN и OUT была допустима - всё равно, пока не начнётся передача, на выход давать нечего, поэтому будет терпеливо ждать окончания посылки, и как раз вместо байта "на выход" защёлкнется (вдвинется по однму биту за раз) байт "на вход".

Исправляется это довольно легко. В первую очередь, определяем в компиляторе новый "ресурс", crIO:

TCommandResource = (crAcc, crC, crX, crY, crZ, crSP, cri, crj, crk, crInv, crMemBus, crMemX, crMemY, crMemZ, crMemSP, crIO);


Под ресурсом мы понимаем нечто, что обе "половинки команды" могут захотеть использовать одновременно, но делать этого они не должны! У нас тут были регистры Acc, C, X, Y, Z, i, j, k, Inv, т.к при одновременной записи в регистр и чтении из него, мы прочитаем СТАРОЕ значение, а это не то поведение, которое мы обычно ожидаем, когда пишем программу (мы ожидаем, что команды выполняются одна за другой, строка за строкой), хотя можно это дело "побороть", что позволит очень здорово поменять местами два значения.

Дальше, числится ресурс MemBus - это следствие нашей жадности, мы пока поставили всего один вычислитель "эффективного адреса", поэтому, хоть память и двухпортовая в ПЛИС, но адрес и на чтение и на запись формируется только один. Поэтому можно либо читать из памяти, либо записывать в память, но не всё сразу.

Далее идут "хитрые" ресурсы MemX, MemY, MemZ и MemSP - это отголосок ещё большей жадности, когда я надеялся убрать лишний мультиплексор базового адреса. Тогда нельзя было одновременно записывать, к примеру, в [X+2j+i], и в то же время читать значение регистра Y. И вот именно такие сочетания были призваны "отловить" эти "ресурсы". Но почему-то Place&Route стал страшно тупить без этого лишнего мультиплексора - и я вернул всё взад, а эти 4 ресурса "отключил", введя "список активных ресурсов" в конфигурации компилятора.

Ну и теперь добавился IO.

Далее, добавим этот ресурс в ActiveHazards и в описание команд SIO и IN:

  ActiveHazards = [crAcc, crC, crX, crY, crZ, crSP, cri, crj, crk, crInv, crMemBus, crIO]


Затем:

  object TQuatCoreCommand
    Key = 'SIO'
    Code = 16
    Mask = 240
    DataMask = 15
    Description = 'Selects I/O device'
    Place = [cpDest]
    Resources = [crIO]
    DataType = dtNumeric
  end


и

  object TQuatCoreCommand
    Key = 'IN'
    Code = 144
    Mask = 248
    Description = 'read from selected input device'
    Place = [cpSrc]
    Resources = [crIO]
    DataType = dtNumeric
  end


Компилируем компилятор :)), потом компилируем программу VideoProcessing.asm, и получаем следующие предупреждения:

Конфликт (Hazard) между командами SIO и IN, файл VideoProcessing.asm, процедура main, строки:
			SIO		UART
			NOP		IN
Вставляем NOP

Конфликт (Hazard) между командами SIO и IN, файл VideoProcessing.asm, процедура [global], строки:
	DebugLoop:		SIO	UART
				NOP	IN
Вставляем NOP


Что интересно, эту штуку в DebugLoop я не заметил в прошлый раз! Потому как он один раз передал изображение - и снова начал ждать какого-нибудь символа на вход, теперь уже с входа UART, т.к он и на прошлой итерации уже был выбран.

Ещё прикольно, что здесь написано процедура [global] - действительно, я обработчики прерываний убрал "за пределы" процедуры main, а потом и этот цикл запихнул туда же. И всё уже предусмотрено :)

Разумеется, меня раздражают вставляемые NOP, поэтому чуть-чуть поковыряюсь в программе, размещу SIO UART чуть ранее.

Работает!

Но изображение всё равно пересвечено оказалось. Я что, не закончил играться с настройками экспозиции, и остановился на каких-то кривых?

Включил оочень старую прошивку - получил такую картинку:


Форменное безобразие же! (Напомню: настройки экспозиции сидят не у меня в прошивке, а где-то в ПЗУ аналоговой камеры. Поэтому они при "смене прошивки" меняться не должны!)

Ладно, ещё разок в меню покопаемся, прошьём старую программу. Заодно проверим, всё ли правильно работает, когда адресация оперативной памяти снова стала 8-битной.

Да, похоже, что у меню камеры есть интересная особенность. Когда меняешь настройки изображения - они отображаются сразу. Если долго ничего не делать - меню исчезает, и настройки как будто бы не сбиваются. Но после выключения питания и последующего включения они пропадают. А чтобы не пропадали, обязательно нужно ткнуть в меню Save-Exit:



В прошлый раз я этого не сделал - и поплатился.

Ещё опробовал WDR (Wide Dynamic Range) - чего-то не понравилось, опять эти отражатели выходят пересвечены в ноль, до одного гигантского пятна. Контрастность ещё попробовал убрать с 3 до 1 - ничего не поменялось. Ну да ладно.

И ещё давайте наконец-то закроем это зеркало, чтобы не мешалось!


Хоть так, чехлом от мультиметра. Вообще, надо чего-то более "штатное" здесь сделать, шторку какую... На кадре выходит так:


Если его по порогу 255 преобразовать в ч/б, выйдет так:


Вот здесь алгоритм уже должен сработать!


По ходу дела ещё выползло две неприятных вещи. Первая: стабилизатор 7805 за несколько часов непрерывной работы перегревается, и иногда после этого "сбрасывает" напряжение с выхода, заставляя всё перезагрузиться. На нём ровно ватт выделяется, и сейчас он без теплоотвода стоял. Надо всё-таки поставить.

И второе: когда я тумблером вырубаю питание, при включённых в компьютер JTAG и RS485 (или даже чём-то одном) на шине +3,3 вольта оказывается около 1,5 вольт, а на шине +5 вольт - чуть больше 1 вольта. И этого вольта хватает, чтобы ЖК-экранчик сохранил выведенное сообщение! Да и в других местах может чего-то сохраняться, например, Ethernet-контроллер может сохранять свои настройки, в т.ч тактовой частоты по CLKout, и мало ли что ещё. Надо иметь в виду - и иногда начисто это дело обесточивать, ну для душевного спокойствия!

Но в целом, всё работает достаточно предсказуемо, поэтому продолжим отладку... Сейчас у нас наконец-то картинка, по которой алгоритм должен сработать правильно. Если он этого не сделает - сделаем ещё "дамп памяти" - и начнём его анализировать.
Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

Recent Posts from This Journal

  • Нахождение двух самых отдалённых точек

    Пока компьютер долго и упорно мучал симуляцию, я пытался написать на ассемблере алгоритм захвата на ближней дистанции. А сейчас на этом коде можно…

  • Слишком общительный счётчик

    Вчера я чуть поторопился отсинтезировать проект,параметры не поменял: RomWidth = 8 вместо 7, RamWidth = 9 вместо 8, и ещё EnableByteAccess=1, чтобы…

  • Балансируем конвейер QuatCore

    В пятницу у нас всё замечательно сработало на симуляции, первые 16 миллисекунд полёт нормальный. А вот прошить весь проект на ПЛИС и попробовать "в…

  • Огари разговаривают

    Сегодня по пути на работу встретил огарей прямо в Лосином острове, на берегу Яузы. Эти были на удивление бесстрашны, занимались своими делами, не…

  • Ковыряемся с сантехникой

    Наконец-то закрыл сколько-нибудь пристойно трубы, подводящие к смесителю, в квартире в Москве: А в воскресенье побывал на даче, там очередная…

  • Мартовское велосипедное

    Продолжаю кататься на работу и с работы на велосипеде, а также в РКК Энергию и на дачу. Хотя на две недели случился перерыв, очередная поломка,…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 3 comments