From b82a4b4f5258d37d32aae19da11314e80318594a Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 6 Mar 2019 13:06:27 +0100 Subject: bsp/atsam: Optimize XDMAD_Handler() Load the channel interrupt mask only once. --- .../atsam/contrib/libraries/libchip/source/xdmad.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'bsps/arm') diff --git a/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c b/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c index 0be891d2e9..444e2cf92e 100644 --- a/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c +++ b/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c @@ -307,10 +307,7 @@ static void XDMAD_Handler(void *arg) { sXdmad *pDmad; Xdmac *pXdmac; - sXdmadChannel *pCh; - uint32_t xdmaChannelIntStatus, xdmaGlobaIntStatus, xdmaGlobalChStatus; - uint8_t bExec; - uint8_t _iChannel; + uint32_t xdmaGlobaIntStatus, xdmaGlobalChStatus; pDmad = arg; pXdmac = pDmad->pXdmacs; @@ -318,17 +315,26 @@ static void XDMAD_Handler(void *arg) xdmaGlobalChStatus = XDMAC_GetGlobalChStatus(pXdmac); while (xdmaGlobaIntStatus != 0) { - _iChannel = 31 - __builtin_clz(xdmaGlobaIntStatus); - xdmaGlobaIntStatus &= ~(UINT32_C(1) << _iChannel); + uint8_t _iChannel; + sXdmadChannel *pCh; + uint8_t bExec; + _iChannel = 31 - __builtin_clz(xdmaGlobaIntStatus); pCh = &pDmad->XdmaChannels[_iChannel]; bExec = 0; + xdmaGlobaIntStatus &= ~(UINT32_C(1) << _iChannel); + if ((xdmaGlobalChStatus & (XDMAC_GS_ST0 << _iChannel)) == 0) { - xdmaChannelIntStatus = XDMAC_GetMaskChannelIsr(pXdmac, _iChannel); + uint32_t xdmaChannelIntMask; + uint32_t xdmaChannelIntStatus; + + xdmaChannelIntMask = XDMAC_GetChannelItMask(pXdmac, _iChannel); + xdmaChannelIntStatus = XDMAC_GetChannelIsr(pXdmac, _iChannel); + xdmaChannelIntStatus &= xdmaChannelIntMask; if (xdmaChannelIntStatus & XDMAC_CIS_BIS) { - if ((XDMAC_GetChannelItMask(pXdmac, _iChannel) & XDMAC_CIM_LIM) == 0) { + if ((xdmaChannelIntMask & XDMAC_CIM_LIM) == 0) { pCh->state = XDMAD_STATE_DONE; bExec = 1; } -- cgit v1.2.3