LW_API PVOID API_RegionGetAlign (LW_OBJECT_HANDLE ulId, size_t stByteSize, size_t stAlign) { REGISTER PLW_CLASS_HEAP pheap; REGISTER UINT16 usIndex; REGISTER PVOID pvAllocate; usIndex = _ObjectGetIndex(ulId); if (LW_CPU_GET_CUR_NESTING()) { /* 不能在中断中调用 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "called from ISR.\r\n"); _ErrorHandle(ERROR_KERNEL_IN_ISR); return (LW_NULL); } #if LW_CFG_ARG_CHK_EN > 0 if (!stByteSize) { _DebugHandle(__ERRORMESSAGE_LEVEL, "ulByteSize invalidate\r\n"); _ErrorHandle(ERROR_REGION_SIZE); return (LW_NULL); } if (!_ObjectClassOK(ulId, _OBJECT_REGION)) { /* 对象类型检查 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "region handle invalidate.\r\n"); _ErrorHandle(ERROR_KERNEL_HANDLE_NULL); return (LW_NULL); } if ((stAlign < sizeof(PVOID)) || (stAlign & (stAlign - 1))) { /* 检查对齐关系 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "iAlign invalidate.\r\n"); _ErrorHandle(ERROR_REGION_ALIGN); return (LW_NULL); } __KERNEL_ENTER(); /* 进入内核 */ if (_Heap_Index_Invalid(usIndex)) { /* 缓冲区索引检查 */ __KERNEL_EXIT(); /* 退出内核 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "region handle invalidate.\r\n"); _ErrorHandle(ERROR_KERNEL_HANDLE_NULL); return (LW_NULL); } #else __KERNEL_ENTER(); /* 进入内核 */ #endif pheap = &_K_heapBuffer[usIndex]; __KERNEL_EXIT(); /* 退出内核 */ pvAllocate = _HeapAllocateAlign(pheap, stByteSize, stAlign, __func__); if (!pvAllocate) { /* 是否分配成功 */ _ErrorHandle(ERROR_REGION_NOMEM); } return (pvAllocate); }
LW_API ULONG API_RegionAddMem (LW_OBJECT_HANDLE ulId, PVOID pvMem, size_t stByteSize) { REGISTER PLW_CLASS_HEAP pheap; REGISTER UINT16 usIndex; usIndex = _ObjectGetIndex(ulId); 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 LW_CFG_ARG_CHK_EN > 0 if (!pvMem || !_Addresses_Is_Aligned(pvMem)) { /* 检查地址是否对齐 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "pvLowAddr is not aligned.\r\n"); _ErrorHandle(ERROR_KERNEL_MEMORY); return (ERROR_KERNEL_MEMORY); } if (_Heap_ByteSize_Invalid(stByteSize)) { /* 分段太小 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "ulRegionByteSize is too low.\r\n"); _ErrorHandle(ERROR_REGION_SIZE); return (ERROR_REGION_SIZE); } if (!_ObjectClassOK(ulId, _OBJECT_REGION)) { /* 对象类型检查 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "region handle invalidate.\r\n"); _ErrorHandle(ERROR_KERNEL_HANDLE_NULL); return (ERROR_KERNEL_HANDLE_NULL); } __KERNEL_ENTER(); /* 进入内核 */ if (_Heap_Index_Invalid(usIndex)) { /* 缓冲区索引检查 */ __KERNEL_EXIT(); /* 退出内核 */ _DebugHandle(__ERRORMESSAGE_LEVEL, "region handle invalidate.\r\n"); _ErrorHandle(ERROR_KERNEL_HANDLE_NULL); return (ERROR_KERNEL_HANDLE_NULL); } #else __KERNEL_ENTER(); /* 进入内核 */ #endif pheap = &_K_heapBuffer[usIndex]; __KERNEL_EXIT(); /* 退出内核 */ _HeapAddMemory(pheap, pvMem, stByteSize); return (ERROR_NONE); }