[an error occurred while processing this directive]
Вопросы по ассемблеру для 62-х TMS
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено SSS 12 июля 2005 г. 14:59

Имеется исходник функции, написанной на ассемблере (TMS320C6202), написанный человеком в горячечном пылу догнать и перегнать Китай и на данный момент благополучно свалившем. Исходник оформлен как функция, вызываемая из С-шной проги, что-то типа:

SIO_get(In, (Ptr *)(&DanImp));
Numb = Pack(DanImp,dp,Rez);
if (Numb)
{
SIO_put(OutCons, (Ptr *)(&Rez), NImp<<2);
}

должно выполняться примерно следующее: передача указателя на вх буфер - DanImp(512 слов по 32, представляющие собой амплитудные отсчеты импульсов сигнала с временам прихода в начале и 0 в промежутке между ними, т.е. в паузах между импульсами) в ассмовую функцию Pack. Функция вытягивает время прихода импульса, максимальное значение амплитуды и длительность импульса, кладет это все тройками в промежуточный буфер - dp, причем в начало засовывается число этих троек. Как только число троек переваливает за 509, переписывает это в вых буфер - Rez и продолжает заполнять промежуточный сначала. Т.к. происходит своего рода упаковка данных, то прежде чем будет сформирован вых массив данных, произойдет вызов функции три раза, и только на третьем будет сформирован вых массив. Функция возвращает Numb - число слов в выходном массиве, два раза 0, на третий – 511(чистых троек 170*3=510 + слово-число слов в буфере, стоящее в начале буфера). Вся прелесть в том, что в отладчике все работает как часы, но в жизни(то бишь в камне) производится вызов функции и выход из нее, всего один раз и полное повисания проца. Причем результатом ее работы является полная ахинея. К С и DSP/BIOS-у никаких претензий, все буфера нормально объявлены и под них выделена память, и без этой функции претензий никаких. Я не призываю досконально разбираться в исходнике. Мне просто нужен совет типа – может, какие-то регистры неправильно используются, может инструкции, может это не так написано, а то не сяк в плане нормального пережевывания исходника компилером. А может есть какие-то правила употребления того с этим. Повторюсь – в отладчике все пучком. А вообще – СПАСИТЕ. Уже неделю трахаюсь с этим исходником, ну не спец я по TI.

Сам ассмовый текст:

.global _Pack
.text


_Pack:
; A4 - ВХ БУФЕР ДЛЯ ВХ БЛОКА ДАННЫХ
; B4 - ПРОМ БУФЕР
; A6 - ВЫХОД БУФЕР


MVK .S2 512, B9
|| MVK .S1 0, A3
MVK .S1 0, A1
|| MVK .S2 1, B0
MVK .S2 0, B7 ; ПОРОГ
|| ZERO .D2 B2
|| ZERO .D1 A5
MVK .S 509, B12
MVK .S 511, B13
|| ZERO .D2 B1
|| ZERO .D1 A15

MV .D A6, A8
|| MV .L A4, B15
|| MV .S B4, A11
LDW .D *B4++[1], A12 ; СЧЕТЧИК ВЫХ ОТСЧЕТОВ
NOP 4
MPY .M1 A12, 4, A13
NOP
ADD .L B4, A13, B4
LABEL11: LDW .D1 *A4++[1], B5
[B0] LDW .D1 *A4, A10
[B2] LDW .D1 *A4, B10
|| [B2] MV .S A4, A14
ADD .L1 A3, 1, A3 ;ИНКРЕМЕНТ СЧЕТЧИКА ДЛИНЫ ВХ БЛОКА
CMPEQ .L1 A3, B9, A2 ;ПРОВЕРКА ДЛИНЫ ВХ БЛОКА
CMPEQ .L2 -1, B5, B2 ;ПРОВЕРКА НАЛИЧИЯ -1
|| CMPEQ .L1X 0, B5, A1
[B0] MV .S1 B5, A0
|| OR .L2 A2, B2, B1
[!B0] CMPLT .L2 B7, B5, B2; НАХ МАКС ЗНАЧ АМПЛИТУДЫ
[B2] MV .L2 B5, B7 ; МАКС АМПЛИТУДА В ИМПУЛЬСЕ
|| [B1] ZERO .D A2
|| [B1] B .S2 LABEL13
[B0] MVK .S2 1, B2
|| [!B0] ZERO .L2 B2
|| [B0] ZERO .D2 B0
[A1] MVK .S2 1, B0
|| [A1] SHR .S1 B7, 1, A7
;
LABEL14 NOP
[A1] CMPLT .L1 B10, A7, A2
[A2] MV .L1 B10, A10
|| [A2] MV .L2 A4, B14
|| [A2] MV .S A14, A4
[A2] LDW .D *++A4[1], B10
[A2] B .S LABEL14
[A2] MV .S A4, A14
[A2] MV .S B14, A4
[A2] ZERO .D A2
NOP 2

; АДАПТАЦИЯ ВРЕМ ПРИХ К ПОРОГУ
[A1] CMPLT .L1 A10, A7, A2
|| [A1] SUB .S1 A3, A5, A5
[A1] SUB .D A5, 2, A5 ; ДЛИТЕЛЬНОСТЬ ИМПУЛЬСА
[A2] SUB .D1 A7, A10, A10
|| [A2] SUB .S2 B10, A7, B10
[A2] CMPGT .L1 A10, B10, A2
[A2] ADD .D1 A0, 1, A0 ; ВРЕМЯ НАЧАЛА ИМПУЛЬСА
[A2] ZERO .D A2

;ЗАПОЛНЕНИЕ ПРОМЕЖУТОЧНОГО БУФЕРА

[A1] STW .D A0, *B4++[1]
|| [A1] ADD .L A12, 1, A12
[A1] STW .D B7, *B4++[1]
|| [A1] ADD .L A12, 1, A12
[A1] STW .D A5, *B4++[1]
|| [A1] ADD .S A12, 1, A12
[A1] MV .S B4, A13
[A1] MV .S A11, B4
[A1] STW A12, *B4
|| [A1] MV .S A13, B4
|| [A1] CMPGT .L A12, B12, A2

;ВЫВОД ВЫХОДНЫХ ЗНАЧЕНИЙ
MV .L B1, A15
[A2] MV .L B1, A15
[A2] MVK .S 1, B1
[A2] ZERO .D A12
[A2] MV .S A11, B4
[A2] LDW .D *B4++[1], B11
[A2] ADD .L A12, 1, A12
NOP 3
[A2] ADD .S B11, 1, B11
[A2] STW .D B11, *A6++[1]
LABEL12 NOP
[A2] LDW .D *B4++[1], B11
[A2] ADD .L A12, 1, A12
NOP 3
[A2] STW .D B11, *A6++[1]
[A2] CMPLT .L A12, B13, A2
[A2] B .S LABEL12
NOP 5
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[B1] MV .D A8, A6
|| [B1] MV .L A11, B4
|| [B1] MVK .S 0, A12
[B1] STW A12, *B4
[B1] ADD B4, 4, B4
|| [B1] MV A15, B1
[A1] MV .S A3, A5
|| [A1] ZERO .D1 A1
|| [A1] ZERO .D2 B7

[!B1] B .S1 LABEL11
NOP 5


LABEL13: MV .S A8, A6
LDW .D *A6, A8
MV .S B15, A4
NOP 2
B .S2 B3
STW .D A8, *A4
NOP 6



Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru