diff --git a/kernel/common/console.c b/kernel/common/console.c index 89597a08147c93b87823df138306ee2e7cd3fbe7..5b6a6fa192674c9227698245813cfd3e44124200 100644 --- a/kernel/common/console.c +++ b/kernel/common/console.c @@ -60,6 +60,7 @@ STATIC UINT32 ConsoleSendTask(UINTPTR param); STATIC UINT8 g_taskConsoleIDArray[LOSCFG_BASE_CORE_TSK_LIMIT]; STATIC SPIN_LOCK_INIT(g_consoleSpin); +STATIC SPIN_LOCK_INIT(g_consoleWriteSpinLock); #define SHELL_ENTRYID_INVALID 0xFFFFFFFF #define SHELL_TASK_PRIORITY 9 @@ -749,7 +750,8 @@ STATIC ssize_t DoWrite(CirBufSendCB *cirBufSendCB, CHAR *buffer, size_t bufLen) return 0; } #endif - LOS_CirBufLock(&cirBufSendCB->cirBufCB, &intSave); + + LOS_SpinLockSave(&g_consoleWriteSpinLock, &intSave); while (written < (INT32)bufLen) { /* Transform for CR/LR mode */ if ((buffer[written] == '\n') || (buffer[written] == '\r')) { @@ -763,7 +765,8 @@ STATIC ssize_t DoWrite(CirBufSendCB *cirBufSendCB, CHAR *buffer, size_t bufLen) toWrite -= cnt; written += cnt; } - LOS_CirBufUnlock(&cirBufSendCB->cirBufCB, intSave); + LOS_SpinUnlockRestore(&g_consoleWriteSpinLock, intSave); + /* Log is cached but not printed when a system exception occurs */ if (OsGetSystemStatus() == OS_SYSTEM_NORMAL) { (VOID)LOS_EventWrite(&cirBufSendCB->sendEvent, CONSOLE_CIRBUF_EVENT); @@ -1629,7 +1632,6 @@ STATIC UINT32 ConsoleSendTask(UINTPTR param) CirBufSendCB *cirBufSendCB = consoleCB->cirBufSendCB; CirBuf *cirBufCB = &cirBufSendCB->cirBufCB; UINT32 ret, size; - UINT32 intSave; CHAR *buf = NULL; (VOID)LOS_EventWrite(&cirBufSendCB->sendEvent, CONSOLE_SEND_TASK_RUNNING); @@ -1648,9 +1650,7 @@ STATIC UINT32 ConsoleSendTask(UINTPTR param) } (VOID)memset_s(buf, size + 1, 0, size + 1); - LOS_CirBufLock(cirBufCB, &intSave); (VOID)LOS_CirBufRead(cirBufCB, buf, size); - LOS_CirBufUnlock(cirBufCB, intSave); (VOID)WriteToTerminal(consoleCB, buf, size); (VOID)LOS_MemFree(m_aucSysMem1, buf); diff --git a/lib/libscrew/include/los_cir_buf.h b/lib/libscrew/include/los_cir_buf.h index 9e990ec05efd0d4a543a8d112aadb0b196d469bc..62def9153ad705a6a815f8dde0b7de7f1ba2f9a1 100644 --- a/lib/libscrew/include/los_cir_buf.h +++ b/lib/libscrew/include/los_cir_buf.h @@ -56,22 +56,6 @@ typedef struct { CHAR *fifo; } CirBuf; -STATIC INLINE VOID LOS_CirBufLock(CirBuf *cirbufCB, UINT32 *intSave) -{ - if (cirbufCB == NULL) { - return; - } - LOS_SpinLockSave(&cirbufCB->lock, intSave); -} - -STATIC INLINE VOID LOS_CirBufUnlock(CirBuf *cirbufCB, UINT32 intSave) -{ - if (cirbufCB == NULL) { - return; - } - LOS_SpinUnlockRestore(&cirbufCB->lock, intSave); -} - extern UINT32 LOS_CirBufInit(CirBuf *cirbufCB, CHAR *fifo, UINT32 size); extern VOID LOS_CirBufDeinit(CirBuf *cirbufCB); extern UINT32 LOS_CirBufWrite(CirBuf *cirbufCB, const CHAR *buf, UINT32 size); diff --git a/lib/libscrew/src/los_cir_buf.c b/lib/libscrew/src/los_cir_buf.c index c090ed16f6ffefa5d4397d256d192dea79508288..27462913e30289f396042293275177af20fd974f 100644 --- a/lib/libscrew/src/los_cir_buf.c +++ b/lib/libscrew/src/los_cir_buf.c @@ -30,6 +30,7 @@ */ #include "los_cir_buf.h" +#include "los_spinlock.h" UINT32 LOS_CirBufUsedSize(CirBuf *cirbufCB) @@ -103,14 +104,17 @@ STATIC UINT32 OsCirBufWriteLoop(CirBuf *cirbufCB, const CHAR *buf, UINT32 size) UINT32 LOS_CirBufWrite(CirBuf *cirbufCB, const CHAR *buf, UINT32 size) { - UINT32 cpSize; + UINT32 cpSize = 0; + UINT32 intSave; - if ((cirbufCB == NULL) || (buf == NULL) || (size == 0)) { + if ((cirbufCB == NULL) || (buf == NULL) || (size == 0) || (cirbufCB->status != CBUF_USED)) { return 0; } + LOS_SpinLockSave(&cirbufCB->lock, &intSave); + if ((cirbufCB->fifo == NULL) || (cirbufCB->remain == 0)) { - return 0; + goto EXIT;; } if (cirbufCB->startIdx <= cirbufCB->endIdx) { @@ -119,6 +123,8 @@ UINT32 LOS_CirBufWrite(CirBuf *cirbufCB, const CHAR *buf, UINT32 size) cpSize = OsCirBufWriteLinear(cirbufCB, buf, size); } +EXIT: + LOS_SpinUnlockRestore(&cirbufCB->lock, intSave); return cpSize; } @@ -173,14 +179,17 @@ STATIC UINT32 OsCirBufReadLoop(CirBuf *cirbufCB, CHAR *buf, UINT32 size) UINT32 LOS_CirBufRead(CirBuf *cirbufCB, CHAR *buf, UINT32 size) { - UINT32 cpSize; + UINT32 cpSize = 0; + UINT32 intSave; - if ((cirbufCB == NULL) || (buf == NULL) || (size == 0)) { + if ((cirbufCB == NULL) || (buf == NULL) || (size == 0) || (cirbufCB->status != CBUF_USED)) { return 0; } + LOS_SpinLockSave(&cirbufCB->lock, &intSave); + if ((cirbufCB->fifo == NULL) || (cirbufCB->remain == cirbufCB->size)) { - return 0; + goto EXIT; } if (cirbufCB->startIdx >= cirbufCB->endIdx) { @@ -189,6 +198,8 @@ UINT32 LOS_CirBufRead(CirBuf *cirbufCB, CHAR *buf, UINT32 size) cpSize = OsCirBufReadLinear(cirbufCB, buf, size); } +EXIT: + LOS_SpinUnlockRestore(&cirbufCB->lock, intSave); return cpSize; }