nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Прыжок веры

Взять - и прошить сразу "в железо" - вдруг прям возьмёт и зафурычит?

Но ещё нужно отдать "технический долг" - сделать наконец-то, чтобы можно было и дамп оперативной памяти запросить (внутренней памяти, каковой сейчас 512 слов, или 1024 байта), и картинку передать (она сидит во внешней, статической памяти, объёмом 1 мегабайт), потому как без этого сложно будет хоть о чём-то говорить...

Вот существующий код:
;рано или поздно мы попадаем сюда...				
;endless:		JMP	endless	
DebugLoop:		SIO	UART
			ERL	0
			ERH	0	;заблаговременно, чтобы не было IO Hazard	
			NOP	IN
;чуть позже будем определять, какой символ нам дали, а пока тупо отправим картинку
				
			;самое смешное: у нас в 16-битный регистр не влезет то число, до которого делать итерации!
			;либо применить FMA, либо тупо 2 вложенных цикла
			; j	29
	; @@OuterLoop:	Acc	24575		;24576 * 30 = 1024 * 720 
	; @@InnerLoop:	OUT	[ER++]
			; SUB	1
			; JGE	@@InnerLoop
			; jLOOP	@@OuterLoop
				
			;а теперь давайте дамп передадим
			SP	0x400	;кривовато, мы привязываемся к разрядности адреса, но для сельской местности сойдёт
			Acc	1023
@@Loop:			OUT	[SP++]
			SUB	1
			JGE	@@Loop
				
			JMP	DebugLoop


Как видно, код для передачи изображения попросту "закомментирован", а код для передачи дампа памяти дописан.

Не хватает только разбора информации, приходящей по UART, пусть даже простейшего...


Самое простое, что можно сделать - это командовать с UART с помощи одного-единственного символа. Пока ничего не поступает - мы сидим и ждём (так уже сделано), посылаем "D" (Dump) - получаем дамп памяти, посылаем "I" (Image) - получаем изображение.

Попробуем:
DebugLoop:	SIO	UART
		ERL	0
		ERH	0	;заблаговременно, чтобы не было IO Hazard	
		Acc	IN
		SUB	'E'	;если пришло D (Dump), будет отрицательное, а если I (Image) - положительное
		JL	@@MemDump
;чуть позже будем определять, какой символ нам дали, а пока тупо отправим картинку
				
		;самое смешное: у нас в 16-битный регистр не влезет то число, до которого делать итерации!
		;либо применить FMA, либо тупо 2 вложенных цикла
		j	29
 @@OuterLoop:	Acc	24575		;24576 * 30 = 1024 * 720 
 @@InnerLoop:	OUT	[ER++]
		SUB	1
		JGE	@@InnerLoop
		jLOOP	@@OuterLoop
		JMP	DebugLoop
				
				;а теперь давайте дамп передадим
@@MemDump:	SP	0x400	;кривовато, мы привязываемся к разрядности адреса, но для сельской местности сойдёт
		Acc	1023
@@Loop:		OUT	[SP++]
		SUB	1
		JGE	@@Loop
		JMP	DebugLoop


Попробуем компильнуть, получается 254 слова кода! Хорошо, всё ещё влезаем в ОДИН блок внутренней памяти. В той ПЛИС, которая у меня в макете, 5576ХС4Т, таких блоков 24 штуки (по 512 байт каждый), и задействовано пока что 3 штуки, один для кода и два для оперативной памяти. На 5576ХС6Т, которую мне хотелось бы применить в штатном изделии, их всего 10 штук. Понятно, можно и внешнюю ПЗУ будет подключить, но не хочется...

По такому случаю зеркальце закрыли обёрточной бумагой:


Запускаем - и сразу же "Ошибка: нет сигнала" на экранчике. Ну хорошо, а дамп памяти и картинку я получу??

Дамп очень похож на правду, особенно самый первый:


Для сравнения, начальное содержание памяти, согласно компилятору:
000    0x??02
001    0x??03
002    0x??22
003    0x??54
004    0x??00
005    0x??01
006    0x??03
007    0x??22
008    0x??66
009    0x??00
00A   0x??18
00B   0x??02
00C   0x??22
00D   0x??6F
00E   0x??02


У нас передаются сначала младшие байты памяти, а потом уже старшие.

Я довольно далеко "методом пристального взгляда" проверил - как будто бы память осталась в первозданном виде, разве что в области стека мы чуть-чуть "наследили".

А вот когда я заказываю изображение - оно вроде бы начинает поступать, но очень быстро прерывается. Должно-то идти чуть ли не 8 секунд без перерыву, а тут "вжик" - и полная остановка.

Тем не менее, полного зависания не происходит - всё так же спокойно реагирует на подаваемые "команды".

Но если я повторно заказываю дамп памяти, ответ немножко, самую малость, меняется:


Первые два байта сменились. Но что такое C4? Ну, кроме взрывчатки. Глянем в листинге. Ага:

B8  8A31      OutOfMemory:    C       OutOfMemStr
B9  B032                      JMP     IntHandler
BA  8A33      GPU_WDT:        C       NoVideoSignal
BB  B032                      JMP     IntHandler
BC  8A34      GPU_UFLO:       C       UnderflowInt
BD  B032                      JMP     IntHandler
BE  8A35      GPU_OFLO:       C       OverflowInt
BF  1003      IntHandler:     SIO     LCD
C0  CD36                      X       CommonError
C1  F3BD                      CALL    print
C2  CD83                      X       C
C3  F3BD                      CALL    print
C4  1005      DebugLoop:      SIO     UART


Это адрес возврата во время вызова процедуры print при работе обработчика прерываний. А что за нолик такой?

Да вообще не вопрос, все ходы записаны:

    print proc
DC  F380                  [SP++]  Acc
DD  FDCD                  SP      X


Ага, используется ещё одна ячейка стека, куда сохраняется Acc. Почему там оказывается строго нолик - это интересный вопрос. Кажется, что во время передачи дампа он должен дойти до "-1", только тогда мы выйдем из цикла.

То есть, вот это прерывание "Нет сигнала" продолжает "долбиться" ещё и ещё. Да, что-то такое припоминаю.

Но через некоторое время я попробовал снова - "перепрошил" в память ПЛИС (не во flash) - и вдруг получил такое:



Получается, на этот раз никаких исключительных ситуаций не возникло (и действительно, на ЖК-экранчике всё то же самое), но ни одной точки он так и не нашёл. По крайней мере, и не завис нигде в нашем новом коде - честно дошёл до конца и отобразил свои результаты, пусть и нулевые на этот раз!

А попробуем-ка мы картинку запросить:


Не знаю, что это такое.

Что ж, я считаю, результат для первого включения совсем неплохой - что-то определённо шевелится. А если бы с первого раза заработало - это очень плохой знак, значит там бы затаился совершенно злой баг, которого потом пришлось бы несколько лет ловить!
Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 1 comment