From 58f1fe92ee9c68ffd08bccd19f67eafbbc968a71 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Wed, 11 Jan 2012 18:02:20 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@3788 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/hal/platforms/Win32/hal_lld.c | 12 ++++++++++++ os/hal/platforms/Win32/serial_lld.c | 26 ++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) (limited to 'os/hal/platforms/Win32') diff --git a/os/hal/platforms/Win32/hal_lld.c b/os/hal/platforms/Win32/hal_lld.c index 48d017f2f..183185c98 100644 --- a/os/hal/platforms/Win32/hal_lld.c +++ b/os/hal/platforms/Win32/hal_lld.c @@ -83,8 +83,10 @@ void ChkIntSources(void) { #if HAL_USE_SERIAL if (sd_lld_interrupt_pending()) { + dbg_check_lock(); if (chSchIsPreemptionRequired()) chSchDoReschedule(); + dbg_check_unlock(); return; } #endif @@ -93,9 +95,19 @@ void ChkIntSources(void) { QueryPerformanceCounter(&n); if (n.QuadPart > nextcnt.QuadPart) { nextcnt.QuadPart += slice.QuadPart; + + CH_IRQ_PROLOGUE(); + + chSysLockFromIsr(); chSysTimerHandlerI(); + chSysUnlockFromIsr(); + + CH_IRQ_EPILOGUE(); + + dbg_check_lock(); if (chSchIsPreemptionRequired()) chSchDoReschedule(); + dbg_check_unlock(); } } diff --git a/os/hal/platforms/Win32/serial_lld.c b/os/hal/platforms/Win32/serial_lld.c index 6b76ebbc7..170067c4a 100644 --- a/os/hal/platforms/Win32/serial_lld.c +++ b/os/hal/platforms/Win32/serial_lld.c @@ -113,7 +113,9 @@ static bool_t connint(SerialDriver *sdp) { printf("%s: Unable to setup non blocking mode on data socket\n", sdp->com_name); goto abort; } + chSysLockFromIsr(); chIOAddFlagsI(sdp, IO_CONNECTED); + chSysUnlockFromIsr(); return TRUE; } return FALSE; @@ -140,7 +142,9 @@ static bool_t inint(SerialDriver *sdp) { case 0: closesocket(sdp->com_data); sdp->com_data = INVALID_SOCKET; + chSysLockFromIsr(); chIOAddFlagsI(sdp, IO_DISCONNECTED); + chSysUnlockFromIsr(); return FALSE; case SOCKET_ERROR: if (WSAGetLastError() == WSAEWOULDBLOCK) @@ -149,8 +153,11 @@ static bool_t inint(SerialDriver *sdp) { sdp->com_data = INVALID_SOCKET; return FALSE; } - for (i = 0; i < n; i++) + for (i = 0; i < n; i++) { + chSysLockFromIsr(); sdIncomingDataI(sdp, data[i]); + chSysUnlockFromIsr(); + } return TRUE; } return FALSE; @@ -165,7 +172,9 @@ static bool_t outint(SerialDriver *sdp) { /* * Input. */ + chSysLockFromIsr(); n = sdRequestDataI(sdp); + chSysUnlockFromIsr(); if (n < 0) return FALSE; data[0] = (uint8_t)n; @@ -174,7 +183,9 @@ static bool_t outint(SerialDriver *sdp) { case 0: closesocket(sdp->com_data); sdp->com_data = INVALID_SOCKET; + chSysLockFromIsr(); chIOAddFlagsI(sdp, IO_DISCONNECTED); + chSysUnlockFromIsr(); return FALSE; case SOCKET_ERROR: if (WSAGetLastError() == WSAEWOULDBLOCK) @@ -253,10 +264,17 @@ void sd_lld_stop(SerialDriver *sdp) { } bool_t sd_lld_interrupt_pending(void) { + bool_t b; + + CH_IRQ_PROLOGUE(); + + b = connint(&SD1) || connint(&SD2) || + inint(&SD1) || inint(&SD2) || + outint(&SD1) || outint(&SD2); + + CH_IRQ_EPILOGUE(); - return connint(&SD1) || connint(&SD2) || - inint(&SD1) || inint(&SD2) || - outint(&SD1) || outint(&SD2); + return b; } #endif /* HAL_USE_SERIAL */ -- cgit v1.2.3