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

 
 
> Грамотная работа с EDMA, SDRAM --EDMA--> L2
lamateur
сообщение Dec 5 2008, 05:30
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 26-06-08
Пользователь №: 38 561



Здравствуйте!

Возникло сомнение, что правильно передаю данные через EDMA из внешней памяти (SDRAM) во внутреннюю (L2).

А именно, на стартер ките на базе С6416 передача 16-ти КБайт занимает примерно 54000 тиков таймера, что соотвествует примерно 0.6 мсек реального времени (720 МГц) или скорости 25 МБайт/с. По-хорошему, скорость обмена между внешней и внутренней памятью должна быть раз в 20 больше!
Передачу делаю Блок-синхронизированную из 2D в 1D: транслируется квадрат байтов размера 128 на 128.

Замер времени производился на участке проверки соответствующего бита CIPR-регистра. Именно этот цикл проверки и занимает 54000 тиков.
Прерывание я не отправляю, поскольку далее программа работает с переданными данными и необходимо знать, что передача окончена.

вот пример участка кода, на котором производится замер:

EDMA_setChannel(hEdma_fragm);
while (1) {
if (EDMA_intTest(FRAGM_EDMA_TCC)) {
EDMA_intClear(FRAGM_EDMA_TCC);
break;
}

Подскажите, пожалуйста, где искать ошибку.
1) Неправильно настроил канал передачи
2) Нельзя напрямую многократно опрашивать регистр CIPR
3) Существуют какие-то настройки памяти, которые надо изменить (например, через DSP/BIOS)
4) Неправильно произведен замер времени
...

Сообщение отредактировал lamateur - Dec 5 2008, 06:21
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
bav
сообщение Dec 10 2008, 10:50
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 21-06-05
Из: Санкт-Петербург
Пользователь №: 6 184



в общем, как писал выше, подозрение в не корректности подсчета тактов.
другое дело, может, DMA долго инициализируется на передачу. попробуй обычное копирование с оптимизацией.
скажу, что таких проблем не было. правда, DMA у меня гонял потоки по видеопортам.
проводил эксперименты по работе кэша и по копированию данных во внудреннюю память с помощью QDMA, там скорости были значительно выше, чем у Вас.

вот, откопал текст для таймера

Timer.h

Код
#include "csl_timer.h"

#define CPU_FREQUENCY 720000000
#define CLOCK_SCALE  8
// не понятно, делитель стоит на 8, т. е. должен быть делитель на 8

class Timer
{
TIMER_Handle handle;
// int    overhead;
int    strt;
int    stp;
int    clocks;

public:
   Timer();
   ~Timer();

int  count();
void start();
void stop();
int  ms();
int  us();
int  tic();

};


Timer.cpp

Код
#include "timer.h"


Timer::Timer()
{
handle = TIMER_open(TIMER_DEVANY, TIMER_OPEN_RESET);

TIMER_configArgs(handle, 0x000002C0, 0xFFFFFFFF, 0x00000000);
//калибровка
//вычисление времени срабатывания
// int start_ = count(); /* called twice to avoid L1D miss.*/
//     start_ = count();
// int stop_  = count();
// overhead   = stop_ - start_;
}
//----------------------------------------
Timer::~Timer()
{
TIMER_close(handle);
}
//----------------------------------------
int Timer::count()
{
return TIMER_getCount(handle);
}
//----------------------------------------
void Timer::start()
{
strt = TIMER_getCount(handle);
}
//----------------------------------------
void Timer::stop()
{
stp = TIMER_getCount(handle);
clocks = stp - strt;// - overhead;
}
//----------------------------------------
int Timer::tic()
{
return clocks * CLOCK_SCALE;
}
//----------------------------------------
int Timer::ms()
{
return (long)(clocks / (CPU_FREQUENCY / 1000 / CLOCK_SCALE) );
}
//----------------------------------------
int Timer::us()
{
return (long)(clocks / (CPU_FREQUENCY / 1000000 / CLOCK_SCALE) );
}
//----------------------------------------




сейчас поищу другие тексты



вот, как делал копирование:



Код
.......

#include <csl_dat.h>

.......

DAT_open (DAT_CHAANY, DAT_PRI_HIGH, DAT_OPEN_2D);
unsigned short * src_ = src.Data();//x, y);
unsigned short * src__ = &src_[x - offset_block + (y - offset_block)*width];
Uint32 copy_ID1 = DAT_copy2d (
     DAT_2D1D,
     (void*)src__,
     (void*)in_buf,
     width_o_block*sizeof(unsigned short),
     height_o_block,
     width*sizeof(unsigned short) );
DAT_wait(copy_ID1);

.............
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- lamateur   Грамотная работа с EDMA   Dec 5 2008, 05:30
- - bav   думаю, п.4 попробуй поварьировать с разными разме...   Dec 5 2008, 12:06
- - bve   Попробуйте грамотно расположить массив во внешней ...   Dec 5 2008, 12:26
- - rokhan   1) Скорее всего вы неправильно настроили. 2) Можно...   Dec 8 2008, 15:31
- - lamateur   bav, 1) для других размеров массивов объем переда...   Dec 9 2008, 07:58
- - rokhan   1. Если вы использовали стандартный DSP/BIOS проек...   Dec 9 2008, 09:30
- - bav   Цитата3) Память представляет из себя две спаренные...   Dec 9 2008, 10:42
|- - lamateur   Цитата(bav @ Dec 9 2008, 13:42) задается ...   Dec 9 2008, 13:24
- - bav   не знаю, может быть. посмотри таблицу Device Confi...   Dec 9 2008, 13:32
- - lamateur   rokhan, Да, стандартный dsp/bios проект для dsk641...   Dec 10 2008, 08:35
- - bav   как узнать через CCS не знаю. не приходилось. это ...   Dec 10 2008, 09:41
- - lamateur   bav, я на всякий случай еще раз акцентирую внимани...   Dec 10 2008, 10:29
- - rokhan   1. Почитай http://focus.ti.com/lit/an/spraa02/spra...   Dec 10 2008, 13:31
- - lamateur   rokhan, Крутой документ этот spraa02! Буду раз...   Dec 10 2008, 13:50
- - lamateur   Теперь, когда переделал, еще раз спасибо! Нав...   Dec 11 2008, 09:00
- - lamateur   Столкнулся с проблемой, что при передаче по EDMA к...   Mar 3 2009, 08:19


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

 


RSS Текстовая версия Сейчас: 31st July 2025 - 12:07
Рейтинг@Mail.ru


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