ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
1206796 Топик полностью
klen (08.05.2022 15:41, просмотров: 321) ответил framer на Рассуждения в слух. Может что то не так в процедуре прерывания от eth? Может что то делает с контроллером дма?
в обработчике прерывания еth только чтения причины и отпускание семафора 
     inline void eth_irq_handler()
        {
             ETH_HandleTypeDef* heth = &EthHandle ;
             BaseType_t higher_priority_task_woken ;
             
             if (__HAL_ETH_DMA_GET_IT(heth, ETH_DMACSR_RI)) // Packet received
               if (__HAL_ETH_DMA_GET_IT_SOURCE(heth, ETH_DMACIER_RIE))
                 {
                   __HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMACSR_RI | ETH_DMACSR_NIS); // Clear the Eth DMA Rx IT pending bits
                   eth_rx_semaphore_give_fFrom_isr(&higher_priority_task_woken);                  
                 }

             if (__HAL_ETH_DMA_GET_IT(heth, ETH_DMACSR_TI)) // Packet transmitted
                if (__HAL_ETH_DMA_GET_IT_SOURCE(heth, ETH_DMACIER_TIE))
                 {
                   __HAL_ETH_DMA_CLEAR_IT(heth, ETH_DMACSR_TI | ETH_DMACSR_NIS); // Clear the Eth DMA Tx IT pending bits
                   eth_tx_semaphore_give_fFrom_isr(&higher_priority_task_woken);
                 }

            
             if (__HAL_ETH_DMA_GET_IT(heth, ETH_DMACSR_AIS)) // ETH DMA Error
               {
                 if (__HAL_ETH_DMA_GET_IT_SOURCE(heth, ETH_DMACIER_AIE))
                 {
                   heth->ErrorCode |= HAL_ETH_ERROR_DMA;

                   if (__HAL_ETH_DMA_GET_IT(heth, ETH_DMACSR_FBE)) // if fatal bus error occurred
                     {
                       heth->DMAErrorCode = READ_BIT(heth->Instance->DMACSR, (ETH_DMACSR_FBE | ETH_DMACSR_TPS | ETH_DMACSR_RPS)); // Get DMA error code
                       __HAL_ETH_DMA_DISABLE_IT(heth, ETH_DMACIER_NIE | ETH_DMACIER_AIE); // Disable all interrupts
                       heth->gState = HAL_ETH_STATE_ERROR; // Set HAL state to ERROR
                     }
                   else
                   {
                     heth->DMAErrorCode = READ_BIT(heth->Instance->DMACSR, (ETH_DMACSR_CDE | ETH_DMACSR_ETI | ETH_DMACSR_RWT | ETH_DMACSR_RBU | ETH_DMACSR_AIS)); // Get DMA error status
                     __HAL_ETH_DMA_CLEAR_IT(heth, (ETH_DMACSR_CDE | ETH_DMACSR_ETI | ETH_DMACSR_RWT |  ETH_DMACSR_RBU | ETH_DMACSR_AIS)); // Clear the interrupt summary flag
                   }
                   if((HAL_ETH_GetDMAError(heth) & ETH_DMACSR_RBU) == ETH_DMACSR_RBU)
                         eth_rx_semaphore_give_fFrom_isr(&higher_priority_task_woken);
                 }
               }
    

           scheduler_t::yeld_from_isr( higher_priority_task_woken ) ;           
        }