/********************************************************************************************************* ** 函数名称: __tshellTtyInputHistorySave ** 功能描述: shell 记录一条输入. ** 输 入 : psicContext 输入上下文 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ static VOID __tshellHistorySave (__PSHELL_INPUT_CTX psicContext) { PLW_CLASS_TCB ptcbCur; __PSHELL_HISTORY_CTX psihc; __PSHELL_HISTORY psihHistory; PLW_LIST_RING pring; LW_TCB_GET_CUR_SAFE(ptcbCur); psihc = __TTINY_SHELL_GET_HIS(ptcbCur); pring = psihc->SIHC_pringHeader; while (pring) { /* 循环查找是否与以前的相同 */ psihHistory = _LIST_ENTRY(pring, __SHELL_HISTORY, SIH_ringManage); if (lib_strcmp(psihHistory->SIH_cInputSave, CTX_BUFFER) == 0) { /* 如果相同 */ if (pring == psihc->SIHC_pringHeader) { return; /* 如果是表头, 则不需要处理 */ } else { _List_Ring_Del(&psihHistory->SIH_ringManage, &psihc->SIHC_pringHeader); _List_Ring_Add_Ahead(&psihHistory->SIH_ringManage, &psihc->SIHC_pringHeader); /* 放在表头位置 */ return; } } pring = _list_ring_get_next(pring); if (pring == psihc->SIHC_pringHeader) { break; } } psihHistory = (__PSHELL_HISTORY)__SHEAP_ALLOC(sizeof(__SHELL_HISTORY) + lib_strlen(CTX_BUFFER)); if (psihHistory) { lib_strcpy(psihHistory->SIH_cInputSave, CTX_BUFFER); _List_Ring_Add_Ahead(&psihHistory->SIH_ringManage, &psihc->SIHC_pringHeader); /* 加入新的输入 */ psihc->SIHC_uiCounter++; if (psihc->SIHC_uiCounter > __INPUT_SAVE_MAX) { /* 需要删除最老的一条 */ PLW_LIST_RING pringPrev = _list_ring_get_prev(psihc->SIHC_pringHeader); psihHistory = _LIST_ENTRY(pringPrev, __SHELL_HISTORY, SIH_ringManage); _List_Ring_Del(&psihHistory->SIH_ringManage, &psihc->SIHC_pringHeader); __SHEAP_FREE(psihHistory); psihc->SIHC_uiCounter--; } } }
/********************************************************************************************************* ** 函数名称: __smpProcCallfunc ** 功能描述: 处理核间中断调用函数 ** 输 入 : pcpuCur 当前 CPU ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ static VOID __smpProcCallfunc (PLW_CLASS_CPU pcpuCur) { #define LW_KERNEL_OWN_CPU() (PLW_CLASS_CPU)(_K_klKernel.KERN_pvCpuOwner) UINT i, uiCnt; PLW_IPI_MSG pipim; PLW_LIST_RING pringTemp; PLW_LIST_RING pringDelete; VOIDFUNCPTR pfuncAsync; PVOID pvAsync; LW_SPIN_LOCK_IGNIRQ(&pcpuCur->CPU_slIpi); /* 锁定 CPU */ pringTemp = pcpuCur->CPU_pringMsg; uiCnt = pcpuCur->CPU_uiMsgCnt; for (i = 0; i < uiCnt; i++) { _BugHandle((!pcpuCur->CPU_pringMsg), LW_TRUE, "ipi call func error!\r\n"); pipim = _LIST_ENTRY(pringTemp, LW_IPI_MSG, IPIM_ringManage); if ((LW_KERNEL_OWN_CPU() == pcpuCur) && (pipim->IPIM_iOption & IPIM_OPT_NOKERN)) { /* 此函数不能再内核锁定状态执行*/ pringTemp = _list_ring_get_next(pringTemp); continue; } pringDelete = pringTemp; pringTemp = _list_ring_get_next(pringTemp); _List_Ring_Del(pringDelete, &pcpuCur->CPU_pringMsg); /* 删除一个节点 */ pcpuCur->CPU_uiMsgCnt--; if (pipim->IPIM_pfuncCall) { pipim->IPIM_iRet = pipim->IPIM_pfuncCall(pipim->IPIM_pvArg);/* 执行同步调用 */ } pfuncAsync = pipim->IPIM_pfuncAsyncCall; pvAsync = pipim->IPIM_pvAsyncArg; KN_SMP_MB(); pipim->IPIM_iWait = 0; /* 调用结束 */ KN_SMP_WMB(); LW_SPINLOCK_NOTIFY(); if (pfuncAsync) { pfuncAsync(pvAsync); /* 执行异步调用 */ } } KN_SMP_MB(); if (pcpuCur->CPU_pringMsg == LW_NULL) { LW_CPU_CLR_IPI_PEND2(pcpuCur, LW_IPI_CALL_MSK); /* 清除 */ } LW_SPIN_UNLOCK_IGNIRQ(&pcpuCur->CPU_slIpi); /* 解锁 CPU */ LW_SPINLOCK_NOTIFY(); }
/********************************************************************************************************* ** 函数名称: API_CoroutineDelete ** 功能描述: 删除一个指定的协程. ** 输 入 : pvCrcb 协程句柄 ** 输 出 : ERROR ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API ULONG API_CoroutineDelete (PVOID pvCrcb) { INTREG iregInterLevel; REGISTER PLW_CLASS_COROUTINE pcrcbDel = (PLW_CLASS_COROUTINE)pvCrcb; REGISTER PLW_CLASS_COROUTINE pcrcbNow; PLW_CLASS_TCB ptcbCur; if (!LW_SYS_STATUS_IS_RUNNING()) { /* 系统必须已经启动 */ _ErrorHandle(ERROR_KERNEL_NOT_RUNNING); return (ERROR_KERNEL_NOT_RUNNING); } if (LW_CPU_GET_CUR_NESTING()) { /* 不能在中断中调用 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n"); _ErrorHandle(ERROR_KERNEL_IN_ISR); return (ERROR_KERNEL_IN_ISR); } if (!pcrcbDel) { _DebugHandle(__ERRORMESSAGE_LEVEL, "coroutine handle invalidate.\r\n"); _ErrorHandle(EINVAL); return (EINVAL); } LW_TCB_GET_CUR_SAFE(ptcbCur); /* 当前任务控制块 */ pcrcbNow = _LIST_ENTRY(ptcbCur->TCB_pringCoroutineHeader, LW_CLASS_COROUTINE, COROUTINE_ringRoutine); /* 获得当前协程 */ if (pcrcbNow == pcrcbDel) { /* 删除当前协程 */ return (API_CoroutineExit()); } LW_SPIN_LOCK_QUICK(&ptcbCur->TCB_slLock, &iregInterLevel); _List_Ring_Del(&pcrcbDel->COROUTINE_ringRoutine, &ptcbCur->TCB_pringCoroutineHeader); /* 从协程表中删除 */ LW_SPIN_UNLOCK_QUICK(&ptcbCur->TCB_slLock, iregInterLevel); MONITOR_EVT_LONG2(MONITOR_EVENT_ID_COROUTINE, MONITOR_EVENT_COROUTINE_DELETE, ptcbCur->TCB_ulId, pcrcbDel, LW_NULL); if (pcrcbDel->COROUTINE_bIsNeedFree) { _StackFree(ptcbCur, pcrcbDel->COROUTINE_pstkStackLowAddr, LW_TRUE); /* 释放内存 */ } return (ERROR_NONE); }
/********************************************************************************************************* ** 函数名称: _dmaWaitnodeAlloc ** 功能描述: 从缓冲区中申请一个 DMA 等待节点 ** 输 入 : NONE ** 输 出 : 新申请出的节点, 缓冲区内没有空闲接点时, 返回 LW_NULL; ** 全局变量: ** 调用模块: *********************************************************************************************************/ __PDMA_WAITNODE _dmaWaitnodeAlloc (VOID) { REGISTER PLW_LIST_RING pringNewNode; REGISTER __PDMA_WAITNODE pdmanNewNode; if (_G_pringDmanFreeHeader) { /* 还存在空闲的节点 */ pringNewNode = _G_pringDmanFreeHeader; _List_Ring_Del(_G_pringDmanFreeHeader, &_G_pringDmanFreeHeader); /* 删除表头的节点 */ pdmanNewNode = _LIST_ENTRY(pringNewNode, __DMA_WAITNODE, DMAN_ringManage); return (pdmanNewNode); /* 返回新节点 */ } else { return (LW_NULL); /* 没有新节点了 */ } }
/********************************************************************************************************* ** 函数名称: __tshellReadlineClean ** 功能描述: shell 退出时清除 readline 信息. ** 输 入 : ulId 线程 ID ** pvRetVal 返回值 ** ptcbDel 删除的 TCB ** 输 出 : 读取个数 ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID __tshellReadlineClean (LW_OBJECT_HANDLE ulId, PVOID pvRetVal, PLW_CLASS_TCB ptcbDel) { __PSHELL_HISTORY_CTX psihc = __TTINY_SHELL_GET_HIS(ptcbDel); __PSHELL_HISTORY psihHistory; if (psihc) { while (psihc->SIHC_pringHeader) { psihHistory = _LIST_ENTRY(psihc->SIHC_pringHeader, __SHELL_HISTORY, SIH_ringManage); _List_Ring_Del(&psihHistory->SIH_ringManage, &psihc->SIHC_pringHeader); __SHEAP_FREE(psihHistory); } __SHEAP_FREE(psihc); __TTINY_SHELL_SET_HIS(ptcbDel, LW_NULL); } }
/********************************************************************************************************* ** 函数名称: _CoroutineDeleteAll ** 功能描述: 释放指定线程所有的协程空间. ** 输 入 : ptcb 线程控制块 ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _CoroutineFreeAll (PLW_CLASS_TCB ptcb) { REGISTER PLW_CLASS_COROUTINE pcrcbTemp; REGISTER PLW_LIST_RING pringTemp; pringTemp = ptcb->TCB_pringCoroutineHeader; while (pringTemp) { _List_Ring_Del(pringTemp, &ptcb->TCB_pringCoroutineHeader); /* 从协程表中删除 */ pcrcbTemp = _LIST_ENTRY(pringTemp, LW_CLASS_COROUTINE, COROUTINE_ringRoutine); if (pcrcbTemp->COROUTINE_bIsNeedFree) { _StackFree(ptcb, pcrcbTemp->COROUTINE_pstkStackLowAddr, LW_TRUE); } pringTemp = ptcb->TCB_pringCoroutineHeader; } }
/********************************************************************************************************* ** 函数名称: API_CoroutineExit ** 功能描述: 在当前线程正在执行的协程删除 ** 输 入 : NONE ** 输 出 : ERROR ** 全局变量: ** 调用模块: API 函数 *********************************************************************************************************/ LW_API ULONG API_CoroutineExit (VOID) { INTREG iregInterLevel; PLW_CLASS_CPU pcpuCur; PLW_CLASS_TCB ptcbCur; REGISTER PLW_CLASS_COROUTINE pcrcbExit; REGISTER PLW_CLASS_COROUTINE pcrcbNext; REGISTER PLW_LIST_RING pringNext; if (!LW_SYS_STATUS_IS_RUNNING()) { /* 系统必须已经启动 */ _ErrorHandle(ERROR_KERNEL_NOT_RUNNING); return (ERROR_KERNEL_NOT_RUNNING); } if (LW_CPU_GET_CUR_NESTING()) { /* 不能在中断中调用 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n"); _ErrorHandle(ERROR_KERNEL_IN_ISR); return (ERROR_KERNEL_IN_ISR); } LW_TCB_GET_CUR_SAFE(ptcbCur); pcrcbExit = _LIST_ENTRY(ptcbCur->TCB_pringCoroutineHeader, LW_CLASS_COROUTINE, COROUTINE_ringRoutine); /* 获得当前协程 */ if (&pcrcbExit->COROUTINE_ringRoutine == _list_ring_get_next(&pcrcbExit->COROUTINE_ringRoutine)) { /* 仅有这一个协程 */ #if LW_CFG_THREAD_DEL_EN > 0 API_ThreadExit(LW_NULL); #endif /* LW_CFG_THREAD_DEL_EN > 0 */ return (ERROR_NONE); } pringNext = _list_ring_get_next(&pcrcbExit->COROUTINE_ringRoutine); pcrcbNext = _LIST_ENTRY(pringNext, LW_CLASS_COROUTINE, COROUTINE_ringRoutine); /* 获得下一个协程 */ LW_SPIN_LOCK_QUICK(&ptcbCur->TCB_slLock, &iregInterLevel); _List_Ring_Del(&pcrcbExit->COROUTINE_ringRoutine, &ptcbCur->TCB_pringCoroutineHeader); /* 从协程表中删除 */ LW_SPIN_UNLOCK_QUICK(&ptcbCur->TCB_slLock, iregInterLevel); ptcbCur->TCB_pringCoroutineHeader = pringNext; /* 转动到下一个协程 */ MONITOR_EVT_LONG2(MONITOR_EVENT_ID_COROUTINE, MONITOR_EVENT_COROUTINE_DELETE, ptcbCur->TCB_ulId, pcrcbExit, LW_NULL); if (pcrcbExit->COROUTINE_bIsNeedFree) { _StackFree(ptcbCur, pcrcbExit->COROUTINE_pstkStackLowAddr, LW_TRUE); /* 释放内存 */ } iregInterLevel = KN_INT_DISABLE(); /* 关闭中断 */ INIT_DUMMY_STACK(); pcpuCur = LW_CPU_GET_CUR(); pcpuCur->CPU_pcrcbCur = &_K_pcrcbDummy; pcpuCur->CPU_pcrcbNext = pcrcbNext; archCrtCtxSwitch(LW_CPU_GET_CUR()); /* 协程切换 */ KN_INT_ENABLE(iregInterLevel); /* 打开中断 */ return (ERROR_NONE); /* 理论上是无法运行到这里的 */ }
/********************************************************************************************************* ** 函数名称: _dmaDeleteFromWaitList ** 功能描述: 从指定 DMA 通道的等待队列删除一个节点 ** 输 入 : pdmanNode 要删除的节点. ** 输 出 : NONE ** 全局变量: ** 调用模块: *********************************************************************************************************/ VOID _dmaDeleteFromWaitList (__PDMA_CHANNEL pdmacChannel, __PDMA_WAITNODE pdmanNode) { _List_Ring_Del(&pdmanNode->DMAN_ringManage, &pdmacChannel->DMAC_pringHead); /* 从队列中删除 */ pdmacChannel->DMAC_iNodeCounter--; /* 数量 -- */ }