[rtems commit] bsp/atsam: Optimize XDMAD_Handler()

Sebastian Huber sebh at rtems.org
Wed Mar 6 12:07:32 UTC 2019


Module:    rtems
Branch:    master
Commit:    b82a4b4f5258d37d32aae19da11314e80318594a
Changeset: http://git.rtems.org/rtems/commit/?id=b82a4b4f5258d37d32aae19da11314e80318594a

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Mar  6 13:06:27 2019 +0100

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(-)

diff --git a/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c b/bsps/arm/atsam/contrib/libraries/libchip/source/xdmad.c
index 0be891d..444e2cf 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;
 				}




More information about the vc mailing list