Доброго всем дня! Подскажите пожалуйста в следующем вопросе. Имеется стек протоколов на базе чипа Wiznet 3150, он связан с процессором LPC2214 в режиме Direct посредством использования интерфейса внешней шины с использованием 8 разрядной шины данных. Так же в системе имеется ПЛИС ( CoolRunerXPLA3 на 512 макроячеек) -она реализует протокол обмена с остальными устройствами в системе и имеет подключения к шине данных ПРОЦЕССОР - СТЕК. Общая идея такова - данные из компьютера гонятся в стек, реализующий функции сетевого интерфейса, по двум каналам - один управляющий - для процессора, предназначен для приема команд, отдаваемых хостом непосредственно LPC2214 и управляющих процессом приема\передачи данных по второму каналу, второй канал - данные, которые должны загонятся в ПЛИС, и которые ПЛИС гонит дальше по протоколу, который она реализует . Требуется данные загонять в ПЛИС с как можно большей скоростью. Поэтому вопрос следующий - каким образом можно связать стек и ПЛИС, чтобы добится максимального быстродействия? У меня следующие варианты :
1) Возможно ли организовать обмен так , чтобы плис ловила посылки данных , передаваемые от стека к процессору? Поцессор начинал бы прием данных с выставления флага на одном из выводов , плис по этому флагу ловила бы посылки от стека. В функции процессора входило бы управление стеком и обработка флагов от плис (. Вопрос в том, как засинхронизировать работу плис и контроллера со стеком, чтобы плис ловила требуемые посылки....Либо задержки считать, либо по числу тактов... Как в таком случае можно посчитать количество тактов, необходимое для определенного куска кода....( работаю в IAR 4.40, есть ли там , как KEIL счетчик тактов? ) 2) Буферизовать данные со стека в памяти процессора , а затем передавать их из процессора в плис. Во первых , получается большая временная задержка : считывание из стека - запись в ОЗУ процессора - считывание из ОЗУ процессора - ПЛИС. Плюс постоянное переключение между стеком и плис. Во вторых, не хотелось бы тратить ОЗУ процессора на реализацию больших буферов. В третьих - придется тратить ресурсы ПЛИС на реализацию интерфейся памяти, чтобы обмениваться данными с процессором.
3) Вариант №1 , но буферизировать данные не в памяти процессора, а во внешней ОЗУ... Здесь есть ряд вопросов - возможно ли перекопировать данные из памяти стека в память внешнего ОЗУ напрямую ? Например используя memcpy :
void *memcpy(void *s1, const void *s2, size_t n) { char *su1 = (char *)s1; // адрес памяти стека const char *su2 = (const char *)s2; // адрес памяти внешнего ОЗУ
for (; 0 < n; ++su1, ++su2, --n) { *su1 = *su2; } return (s1); }
Заранее спасибо за ответы!!!
|