Некоторые результаты работы с прерваниями.
Ситуация следующая. В начале программы принудительно (программно) генерируется прерывание от DSP ядра - (на самом деле RISC пишет DSP_IRQ)
Затем обрабатывается прерывание, где сбрасывается этот флаг. Так вот по логике прерывание должно вызваься один раз, и больше не вызыватся. Однако
наблюдается вызов прерывания дважды, что видно по счетчику.
Есть гипотеза, что при работе из-под RISC ядра, влияет мост пересинхронизации на процесс сброса прерываний. При введении дополнительной, искусственной
задержки, прерывание выполняется один раз.
Код
Код:
void DSP_IRQ_IRQHandler(void)
{
DSP_IRQ->IRQ = 0x0001;
PORTB->SET = 1 << 11;
sleep_clk(5); // 5 - 2 вызова, 6 - 1
Alt++;
}
Несмотря на эту ситуацию будем считать, прерывание работает и сбрасывается.
Аналогично я работаю с прерыванием от McBSP.
Настройка события прерывания FIFO полупуст
Код:
// SPCRH
DSP_BSP1->SPSA = MCBSP_SPSA_SPCRH_NUM;// Ïðåðûâàíèå îò ïåðåäàò÷èêà
DSP_BSP1->CtrlD = (
0
//|((0 <<MCBSP_SPCRH_XINTM_SHIFT_FIELD)& MCBSP_SPCRH_XINTM_SHIFT_MASK) // XRDY
//|((1 <<MCBSP_SPCRH_XINTM_SHIFT_FIELD)& MCBSP_SPCRH_XINTM_SHIFT_MASK) // XSOB
//|((2 <<MCBSP_SPCRH_XINTM_SHIFT_FIELD)& MCBSP_SPCRH_XINTM_SHIFT_MASK) // XEOB
//|((3 <<MCBSP_SPCRH_XINTM_SHIFT_FIELD)& MCBSP_SPCRH_XINTM_SHIFT_MASK) // XSYNCERR
|((4 <<MCBSP_SPCRH_XINTM_SHIFT_FIELD)& MCBSP_SPCRH_XINTM_SHIFT_MASK) // FIFO
//|((5 <<MCBSP_SPCRH_XINTM_SHIFT_FIELD)& MCBSP_SPCRH_XINTM_SHIFT_MASK) // FIFO
//|((6 <<MCBSP_SPCRH_XINTM_SHIFT_FIELD)& MCBSP_SPCRH_XINTM_SHIFT_MASK) // FIFO
//|((7 <<MCBSP_SPCRH_XINTM_SHIFT_FIELD)& MCBSP_SPCRH_XINTM_SHIFT_MASK) // FIFO
) << (16*(MCBSP_SPSA_SPCRH_NUM&1));
Обработчик
Код:
void DSP_BSP1_IRQHandler(void)
{
*(uint32_t *)(0x30000078) = 0xFFFF;
DSP_IRQ->IRQ = 0x7FFF;//(1 << 6);
NVIC->ICPR[0] = 0xFFFFFFFF;
if (
((1<<MCBSP_SPSR_XFIFOF_SHIFT_FIELD)&(DSP_BSP1->CtrlD)) == 0
)
{
DataSend++;
DSP_BSP1->DXR = DataSend;
Alt2++;
}
else
{
Alt1++;
}
temp0 = DSP_IRQ->IRQ;
}
Я даже специально устанавливаю и сбрасываю ВСЕ прерывания. Только вот ощущение, что прерывания 6 бита и 13 (с нуля) не сбрасываются,
вне зависимости от задержки в мосте пересинхронизации. Почему? Да потому, что внешнего синхроимпульса нет, поэтому очередь не опустошается, но заполняется и прерывания в конце концов вызываться должны перестать, и флаг прерывания должен сбросится несмотря на задержку в мосте пересинхронизации. Жду я несколько секунд - заведомо должно все сработать.(если нет каких-то особенностей) Судя по счетчикам, в прерывание восемь раз в FIFO поступали данные, поскольку пишем пока флаг позволяет. А затем прерывание вызывается несколько сотен тысяч раз, чем дольше жду дем больше вызовов. При этом основной цикл, либо вообще не вызвается, либо вызывается 1 или 2 раза, то есть, фактически, управления не получает.
В чем проблема? Прошу ответить сотрудников фирмы Миландр (или кто заинтересовался и сможет объяснить).