в общем, как писал выше, подозрение в не корректности подсчета тактов.
другое дело, может, 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);
.............