📄 fdebug.c
字号:
/*
=================================================================
Description: About Heap Infomation Get and Check
Author: Zealea.Kuethy
Date: 02.12.16
=================================================================
*/
#include "includes.h"
//#include "structs.h"
#include "ErrCode.h"
#include "ErrTask.h"
#include "ZPrint.h"
#if 0
#define FILLBYTE 0xCC
extern char _lc_bh[]; //base segment addr
extern char _lc_eh[]; //end segment addr
extern char *__breakaddr; // current point between base and extra
char *HeapAddrStart = _lc_bh; // for good look and easy to read
char *HeapAddrEnd = _lc_eh; // for good look and easy to read
/*
================================================================
Description: Heap Start Address is _lc_bh;
================================================================
*/
_inline INT8U* GetHeapStart (void)
{
return (INT8U*)HeapAddrStart;
}
/*
================================================================
Description: Heap End Address is _lc_eh;
================================================================
*/
_inline INT8U* GetHeapEnd (void)
{
return (INT8U*)HeapAddrEnd;
}
/*
================================================================
Description: return __breakaddr , __breakaddr = __breakaddr + -
size,
================================================================
*/
_inline INT8U* GetHeapCurrent (void)
{
return (INT8U*)__breakaddr;
}
/*
================================================================
Description: Heap Left
================================================================
*/
_inline INT32U HeapLeft_32u (void)
{
return (INT32U)(GetHeapEnd() - GetHeapCurrent ());
}
#define PRINTTIME 10
static INT8U PrintTimes=0;
void DebugHeapLeft (void)
{
INT32U vHeapUsed, vHeapLeftK_32u, vHeapLeft_32u = 0;
INT8U *vHeapStart, *vHeapEnd, *vHeapCurrent;
// if(++PrintTimes<PRINTTIME) return ;
PrintTimes=0;
vHeapLeft_32u = HeapLeft_32u ();
vHeapStart = GetHeapStart ();
vHeapEnd = GetHeapEnd ();
vHeapCurrent = GetHeapCurrent ();
vHeapLeftK_32u = vHeapLeft_32u / 1024L;
vHeapUsed = vHeapCurrent - vHeapStart;
Printu ("\r\n=========================Heap Infomation====================\r\n");
Printu ("HeapStart:%p\t", vHeapStart);
Printu ("HeapEnd:%p\r\n", vHeapEnd);
Printu ("HeapCurrent:%p\t", vHeapCurrent);
Printu ("HeapUsed:%x\r\n", vHeapUsed);
Printu ("HeapLeft(Byte):%x\t", vHeapLeft_32u);
Printu ("HeapLeft(K):%x\r\n", vHeapLeftK_32u);
Printu ("========================================================\r\n");
}
/////////////////////////////////////////////////////////////////
//Description: About OSMEM
//Author: Zealea.Kuethy
//Date: 02....
////////////////////////////////////////////////////////////////
/*
=============================================================
Description: Get Mem Start Addr
=============================================================
*/
INT8U* OSMemGetStartAddr_ptr (OS_MEM *pmem)
{
if (0 == pmem) return 0;
return (INT8U*)(pmem -> OSMemAddr);
}
/*
=============================================================
Description: Get Mem Blocks Total
=============================================================
*/
INT8U OSMemGetTotalBlock (OS_MEM *pmem)
{
if (0 == pmem) return 0;
return pmem -> OSMemNBlks;
}
/*
==============================================================
Descirption: Query Mem FreeBlock, Mem Create by OSMEMCreate ();
==============================================================
*/
INT8U OSMemQueryFreeBlock (OS_MEM *pmem)
{
if (0 == pmem)
{
return 0;
}
return (INT8U)(pmem -> OSMemNFree);
}
/*
=============================================================
Description: Get Mem Blocks Used
=============================================================
*/
INT8U OSMemGetUsedBlock (OS_MEM *pmem)
{
if (0== pmem) return 0;
return (INT8U)(OSMemGetTotalBlock (pmem) - OSMemQueryFreeBlock (pmem));
}
/*
=============================================================
Description: Get Mem Blocks Size
=============================================================
*/
INT32U OSMemGetBlockSize_32u (OS_MEM *pmem)
{
if (0 == pmem) return 0;
return (pmem -> OSMemBlkSize);
}
/*
===============================================================
Description: Get Firset Free Blks Addr and Get all Free Addr
===============================================================
*/
INT8U* OSMemGetFirstFreeAddr_ptr (OS_MEM *pmem)
{
if (pmem == 0) return 0;
return (INT8U*)pmem -> OSMemFreeList;
}
INT8U *OSMemGetNextFreeAddr_ptr (OS_MEM *pmem, INT8U* prev)
{
if (0 == prev) return 0;
return (INT8U*)( prev + OSMemGetBlockSize_32u (pmem));
}
void DebugMemQueryFreeBlock (OS_MEM *pmem)
{
INT8U TotalNumber, usednumber, freeNumber;
INT8U *startaddr, *FirstAddr;
INT32U BlockSize;
startaddr = OSMemGetStartAddr_ptr(pmem);
TotalNumber = OSMemGetTotalBlock (pmem);
BlockSize = OSMemGetBlockSize_32u (pmem);
freeNumber = OSMemQueryFreeBlock (pmem);
usednumber = OSMemGetUsedBlock (pmem);
FirstAddr = OSMemGetFirstFreeAddr_ptr (pmem);
Printu ("StartAddr:%p\t", startaddr);
Printu ("TotalNumber:%x\t", TotalNumber);
Printu ("BlockSize:%x\r\n", BlockSize);
Printu ("Free Block:%x\t", freeNumber);
Printu ("Used Block:%x\t", usednumber);
Printu ("First Free Addr:%p\r\n",FirstAddr);
}
/*
about stkchk
*/
/*
=============================================================================
Description: DebugStkChkInitalize..
Author: Zealea.Kueth
=============================================================================
*/
INT8U DebugStkInit (INT8U prio, OS_STK *pTop, OS_STK *pBottom)
{
OS_STK *pchk;
prio = prio;
pchk = pBottom;
while ((pchk <= pTop))
{
*pchk = FILLBYTE;
pchk ++;
}
return TRUE;
}
/*
=============================================================================
Description: Stack Over Flow Indcation
Author: Zealea.Kueth
=============================================================================
*/
void StackOverFlow (INT8U prio)
{
INT8U TempPrio = prio;
Printu ("Stackoverflow:%x\r\n", TempPrio);
return ;
}
/*
===========================================================================
Description: Check Stack Memory
Argument: prio, DEBUG_STK_DATA (store return value),
StackTopPtr, StackBottomPtr
Author: Kue.Zealea
Date: 02...
===========================================================================
*/
INT8U DebugStkChk (INT8U prio, OS_STK *pTop, OS_STK *pBottom)
{
OS_TCB *ptcb;
OS_STK *pchk;
INT8U TempPrio;
INT32U free;
INT32U size;
free = 0;
TempPrio = prio;
size = pTop - pBottom;
OS_ENTER_CRITICAL();
ptcb = OSTCBPrioTbl [prio];
OS_EXIT_CRITICAL();
Printu ("优先级:%x\t",TempPrio);
Printu ("大小:%lx\r\n", size);
Printu ("当前栈顶:%p\t", ptcb->OSTCBStkPtr);
Printu ("最大栈顶:%p\r\n", pTop);
Printu ("栈底:%p\r\n", pBottom);
if ((ptcb -> OSTCBStkPtr) <= pBottom)
{
StackOverFlow(prio);
//pdata -> OSFree = 0;
//pdata -> OSUsed = size * sizeof (OS_STK);
return FALSE;
}
pchk = pBottom;
while ((pchk <= pTop))
{
if (*pchk != FILLBYTE)
{
break;
}
free ++;
pchk ++;
}
Printu ("最小堆栈:%lx\r\n", free);
//pdata -> OSFree = free * sizeof (OS_STK);
//pdata -> OSUsed = (size - free )* sizeof(OS_STK);
return TRUE;
}
#if GK110F_DEBUGVERSION
void MemCpy( INT8U *DesPtr, const INT8U *SourcePtr, INT16U Size)
{
if (NULL== DesPtr|| NULL==SourcePtr)
{
Printu("Non Pointer\r\n");
ErrExit (ERR_NONPTR);
}
if ((DesPtr>=(SourcePtr+Size)) || (SourcePtr>=(DesPtr+Size)))
{
for (; Size--; *DesPtr++ = *SourcePtr++)
;
}
else
{
Printu ("Error MemCpy\r\n");
ErrExit (ERR_MEMCPY);
}
}
#else
void MemCpy( INT8U *DesPtr, const INT8U *SourcePtr, INT16U Size)
{
memcpy(DesPtr,SourcePtr,Size);
}
#endif
#define ERR_MEMCHECK 0x9872
BOOLEAN CheckBlockBuf(INT8U *BufPtr, INT16U Size,INT8U FlagChar)
{
ASSERT(Size);
ASSERT(BufPtr);
while(Size--)
{
if((*BufPtr++)!=FlagChar)
{
ErrExit(ERR_MEMCHECK);
return FALSE;
}
}
return TRUE;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -