сравнивая с работающей системой получил что 4d это прерывание ETH
его код
Код
extern "C" void ETH_IRQHandler(void)
{
// снимаем флаг прерывания
ETH_DMAClearITPendingBit(ETH_DMA_IT_R | ETH_DMA_IT_T | ETH_DMA_IT_NIS | ETH_DMA_IT_AIS);
// прерывание Ethernet
OS::TISRW isrw;
JobQueue.push_isr_empty(&c_Eth);
}
оно вызывается порядка 5000 раз в секунду
JobQueue - очередь заданий как описано в руководстве по ос
OS::channel<TEth*, 20> JobQueue;
метод push_isr_empty
Код
template<typename T, uint16_t Size, typename S>
INLINE void OS::channel<T, Size, S>::push_isr_empty(const T& item)
{
TCritSect cs;
if(!pool.get_count_inline())
{;
pool.push_back_inline(item);
resume_all_isr(ConsumersProcessMap); }
}
осуществляет вставку объекта в очередь если очередь пустая, я криво этот метод написал?
класс channel буфер модифицированный как обсуждалось
тут (добавлены инлайн функции)
ну с другой стороны... разве можно повторно зайти в прерывание не выйдя из него? отладчик показывает что программа спокойно в него входит...
Сообщение отредактировал сарматъ - Oct 20 2013, 11:32