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

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

Отправлено ВН 13 октября 2003 г. 16:21
В ответ на: Объясните - что значит не выравнен (+) отправлено 99600036 13 октября 2003 г. 15:12

Циклический буфер в 21xx обязан начинаться с адреса, кратного 2^N.
Причем 2^N должна больше-равна длине буфера Т.е. младшие N разрядов нач. адреса буфера д.б. равны 0.
Пример. Цикл. буфер длиной 5 может начинаться с
адресов 0,8,16,24 и т.д. Поскольку ближайшее к 5 и большее ее 2^N есть 8.
Соотв. цикл. буфер длиной 32 с адресов 0,32,64,96,128...
Далее, буфер автоматом становится циклическим, даже если его таким и не объявляли, как только регистр L, соответствующий I регистру, через к-рый к буферу обращаются, не равен 0.
Адресация при этом идет по модулю =длине буфера.
Для простоты можно записать так:
NextAddr=Base+(OldAddress+Index)mod(Length).
Или, используя названия adsp регистров:
new I=Base+(old I+M)mod(L).
Base - базовый адрес буфера. Он формируется аппаратно, при выполнении программы, из пары L и I, как только L!=0.
Base=I&(!((2^N)-1)). ! - инверсия.
Совпадение Base с начальным адресом буфера только в случае соотв. расположения буфера, т.е. N младших разрядов нач. адреса=0.
Это автоматом должно происходить при объявлении буфера циклическим. Или явным присвоением ему нач. адреса. В старой adsp-ной математике такая возможность была, программер частично выполнял функции линкера. В новой не знаю.
Ну а если L=0, то это обычная адресация, для к-рой:
new I=old I+M. Или для 21xx ее можно считать циклической с L=16384.
Что произойдет если буфер циклическим не объявлен и его размещение доверено линкеру, а в программе используется циклическая адресация этого буфера, т.е. L!=0?
Пример с буфером длиной 5, размещенным по адресу, например 3.
Пусть I7=3,M7=1,L7=5. Base (выше), но не I7, стало равно 0, как только в L7 запихали 5.
Т.о. после первого обращения I7 будет равен 4, как и положено.
После второго он должен бы быть равен 5, но 5 по модулю 5 это 0, т.е. I7 будет равен 0.
После 3-го - 1 и т.д., пока опять до 5 не доберется и опять 5 в 0 не превратятся.
Мораль простая, если буфер циклическим не объявлен и нет уверенности в его размещении по соотв. адресу, не использовать цикл. адресацию при обращении к данному буферу. И наоборот, если используется цикл. адресация, требуется либо объявление его циклическим, либо соотв. размещение в памяти вручную.

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

Ответы


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

Имя (обязательно): 
Пароль: 
E-mail: 

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

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

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


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

E-mail: info@telesys.ru