Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Для использования двойного буферирования нужно приложить дополнительные усилия.

Отправлено misyachniy 22 мая 2008 г. 12:37
В ответ на: Спасибо. Чей-то кривовато реализовано видать у кейла... Ибо я лично ничего такого тормозящего туда не привнес... отправлено Гудвин 22 мая 2008 г. 12:25

После посылки пакета размером 64 байта не нужно ждать конца передачи, а засылать следующий.
Затем ждать сигнала конца передачи и заталкивать следующий пакет.
Таким образом обеспечивается непрерывность подачи данных.

То есть нужно завести переменную в которую увеличивать на 1 при заталкивании пакета и уменьшать при получении сигнала конец передачи.

При непрерывной посылке большого пакета я делал проще.

[quote]
//-----------------------------------------------------------------------------
void SendLongBlock (unsigned int Length)
{
unsigned int TXcount;
BigCounter=Length;

// 1 пункт страница 447 документ 6175E-ATAARM-04-Apr-06
while (AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXPKTRDY); // Занят?
// подстраховка, может флаг не сброшен
if (AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP)
AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP);


while (BigCounter)
{
// 2 пункт
TXcount=64; while (TXcount--) AT91C_BASE_UDP->UDP_FDR[2] = (char)0x55; // пересылаем данные
// 3 пункт

if (BigCounter!=Length)
{
while (!(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP));
AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP);
}

AT91C_BASE_UDP->UDP_CSR[2] |= AT91C_UDP_TXPKTRDY; // передаем
BigCounter-=64;
// 4 пункт
TXcount=64; while (TXcount--) AT91C_BASE_UDP->UDP_FDR[2] = (char)0x55; // пересылаем данные
// 5 пункт
while (!(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP));
// 6 пункт
AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP);
// 7 пункт
AT91C_BASE_UDP->UDP_CSR[2] |= AT91C_UDP_TXPKTRDY; // передаем
BigCounter-=64;
}
while (!(AT91C_BASE_UDP->UDP_CSR[2] & AT91C_UDP_TXCOMP));
AT91C_BASE_UDP->UDP_CSR[2] &= ~(AT91C_UDP_TXCOMP);
}
//-----------------------------------------------------------------------------
[/quote]


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите двойку на единицу:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru