реклама на сайте
подробности

 
 
> Хоть кто-н-дь работает с ВНЕШНЕЙ ПАМЯТЬЮ на adsp21X, или никто не работает с ADSP219x?
partsun
сообщение Jun 1 2007, 07:06
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 24-04-07
Пользователь №: 27 276



wacko.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bmf
сообщение Jun 5 2007, 07:39
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 146
Регистрация: 6-01-05
Из: Украина
Пользователь №: 1 831



уточню на примерах

1
...
int far *ptr=(int far *) (((unsigned long)VALSEG<<16) | (unsigned)(off));
*ptr++=value1;
*ptr++=value2;
...
value3=*ptr;

2
static void _ideReadWord(unsigned far *adr)
{
unsigned i;
for(i=0;i<256;i++) {
*adr++ =io_space_read(IDE_DATAREG);
}
}

3
inline void SetEntryVal(bool bFat32,unsigned far *buf,unsigned thisoff,unsigned long *pval)
{
if(!bFat32) {
*((WORD *)(buf+thisoff))=*((WORD *)pval+1);
} else {
unsigned far *ptr=buf+thisoff*2;
*ptr++=*(((WORD *)pval+1));
*ptr= (*ptr & 0xF000) | (*(((WORD *)pval)) & 0x0FFF);
}
}

Если вы помните, тоже самое применялось и в x86 в DOS small модели, все указатели по умолчанию до 64к, а для дпинных успользовалось far для задания другого сегмента.
Для этого DSP это более чем оправдано, т.к. быстрые DSP алгоритмы живут во внутренней памяти и использование смещения при адресации лишь приведет к потери быстродействияю.
В ранних версиях VDSP такое обращение возможно было только через специальные функции external_memory_read и external_memory_write. Использование far - чистый Си наглядный и переносимый код
Go to the top of the page
 
+Quote Post
partsun
сообщение Jun 5 2007, 09:26
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 21
Регистрация: 24-04-07
Пользователь №: 27 276



smile.gif a14.gif
Понятно,
а чего делает:
assert(sizeof(&abc)==2 && sizeof(&def)==1);

ТАМ много места жрЁТ... мне места даже не хватило

Сообщение отредактировал partsun - Jun 5 2007, 10:04
Go to the top of the page
 
+Quote Post
bmf
сообщение Jun 5 2007, 12:24
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 146
Регистрация: 6-01-05
Из: Украина
Пользователь №: 1 831



Цитата(partsun @ Jun 5 2007, 12:26) *
assert(sizeof(&abc)==2 && sizeof(&def)==1);

это только при первоначальной отладке (проверяется истинность выражения), в релизе не используется
можно везде убрать убрать с помощью
#define assert()
или использовать опцию компиляции для релиза -DNDEBUG

а для работы с внешней памятью общий смысл такой
- замена указателя на тип far (длина уже 32 бит)
и работа с ним как обычно в Си
для инициализации соответственно надо привести типы к одному
пример
int far * ptr=(int far *) 0x123456L;
0x12 - ляжет в DMPG
0x3456 - как смешение

все по правилам стандартного Си не более.
пример операций c указателями:
ptr++;
ptr+=5;
*ptr++==..
*(ptr+1)=..
*(ptr+100)=..
..=*ptr++;
..=(ptr+10);

возможны и другии вариации использования модификатора far
лучше сразу для проверки смотреть в сгенеренный ассемблерный листинг
и для эффективного кода оптимизация должна быть включена
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016