⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fdebug.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 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 + -