Вопрос возник из-за того, что данные в буфер UDP помещаются от 2-х разных источников прерывания (условно назовем их 1 и 2). После определенного количества прерываний необходимо передать пакет данных (55 байт) по USB. Но при этом данные продолжают идти и их необходимо записывать во второй банк. Известно, что перед записью в первый банк надо опрашивать флаг TXPKTRDY, а при записи во второй банк этот флаг не опрашивается. Прерывания 1 и 2 могут быть в любой очередности. Тут возникает проблема, как определить свободен ли банк 1, чтобы продолжать туда запись или же свободен банк 0, чтобы проверить флаг TXPKTRDY и произвести туда запись? Пропуски слов допускаеются, если банк 0 еще не готов.
Вот участок кода с обрабочиками прерываний 1 и 2:
CODE
__ramfunc void pause_timer1_irq()
{
unsigned int dummy;
//если принято 32-итное слово без ошибок
if(i_shA==32 & rcrc1!=0)
{
if(!(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY))
{
regUDP->UDP_FDR[AT91C_EP_IN] = 11; //командное слово
regUDP->UDP_FDR[AT91C_EP_IN] = recA&0xff;//разбиваем 32-битное слово recA по байтам
int m_stat = recA>>8;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = recA>>16;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = recA>>24;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
kA++;
}
}
//если принято 11 слов, то необходимо отправить пакет
if(kA==12)
{
regUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
kA=0;
}
i_shA=0;
rcrc1=0;
dummy = PauseTimerBase1->TC_SR;
}
__ramfunc void pause_timer2_irq()
{
unsigned int dummy;
if(i_shB==32 & rcrc2!=0)
{
if(!(regUDP->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY))
{
regUDP->UDP_FDR[AT91C_EP_IN] = 12;
regUDP->UDP_FDR[AT91C_EP_IN] = recB&0xff;
int m_stat = recB>>8;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = recB>>16;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
m_stat = recB>>24;
regUDP->UDP_FDR[AT91C_EP_IN] = m_stat&0xff;
kB++;
}
}
if(kB==12)
{
regUDP->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY;
kB=0;
}
i_shB=0;
rcrc2=0;
dummy = PauseTimerBase2->TC_SR;
}
Это неправильный код, так как я фактически не использую второй банк. Как в таком случае использовать второй банк?
Причина редактирования: Нарушение п.3.4 Правил форума.