diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-03-06 13:06:27 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2019-03-06 13:07:17 +0100 |
commit | b82a4b4f5258d37d32aae19da11314e80318594a (patch) | |
tree | fd9e8f4e3248b6ddd7cdb4a890eb5a282a1e5d3a /bsps | |
parent | bsp/atsam: Fix SPI CS change support (diff) | |
download | rtems-b82a4b4f5258d37d32aae19da11314e80318594a.tar.bz2 |
bsp/atsam: Optimize XDMAD_Handler()
Load the channel interrupt mask only once.
Diffstat (limited to 'bsps')
-rw-r--r-- | bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c | 22 |
1 files changed, 14 insertions, 8 deletions
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; } |