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

📄 memory_check_vx.h

📁 vxworks 内存检查代码
💻 H
字号:
/**
 * VxWorks Memory Pool Check                                   V1.00, 14.6.2002
 * -------------------------                           (c) Rene H. Straub, 2002
 * 
 * This software checks a VxWorks memory pool for consistency. It allows
 * to find to buffer overwrites which often corrupt the VxWorks memory list. 
 * I wrote this software while looking for a nasty bug in our software. By
 * using this code I finally was able to isolate and find the bug within
 * some hours (after 4 days of debugging). I hope you will find this code
 * as useful as I did.
 *
 * Principles of Operation:
 *  Each VxWorks memory pool contains a double linked list of free memory nodes. 
 *  Each node represents one block of free memory. Blocksizes can range from 16 
 *  bytes to some megabytes.
 *  Each free node is also a starting point to the list of allocated memory.
 *  In contrast to the free node list, this is a single linked list. 
 * 
 *  The memory check function walks through the free memory list and for each 
 *  node, checks the allocated memory it manages.
 *  All pointers are checked versus the memory boundaries you specified in the 
 *  call to memCheckSetup(). Next and previous node pointers are checked 
 *  for consistency. 
 *  If any of these tests fail a message is displayed and the error counter
 *  is increased. If errors have been found the function halts the current task,
 *  at the end of the test.
 *
 * Application Notes:
 *  1. Locate the file "/h/private/mempartlibp.h" and change the #include 
 *     statement in this file accordingly.
 *  2. Compile and link the memory check implementation to your project.
 *  3. Call memCheckSetup() once, specifying the memory pool you'd like to check.
 *     You can specify 0 to select the default memory pool. Also specify the
 *     memory range this pool covers.
 *  4. Call memCheck() from within your code. If you are looking for a bug you
 *     will most likely place calls to memCheck() around the erraneous code.
 *     Otherwise you'll have to decide on your own, where a check is useful.
 *  
 *  For a quick test of the functions call memCheckTest(). If everything works
 *  as expected, it should report an error in the memory list.
 *
 *
 * Important:
 *  1. In order to check a memory pool, the pool must be locked to prevent
 *     other tasks from modifying the memory list. The memCheck() function takes
 *     the sempahore of the pool at the start of the test and releases it at
 *     the end. While the test is running no memory can be allocated or freed
 *     in this pool by other tasks. So you better not call this in a time-critical 
 *     situation.
 *  2. Don't call this method from an ISR.
 *  3. In order not to fall in endless loops the code aborts if too many
 *     memory blocks are detected. If your code allocated a lot of memory blocks
 *     you might need to adapt the defines MAX_FREE_NODES and MAX_ALLOC_BLOCKS.
 *
 * Supported targets:
 *  This code has been successfully used on the following platforms.
 *  - VxWorks 5.4, Motorola Power PC
 *
 * Warranty:
 *  This software is provided as-is. There is no warranty whatsoever. You use 
 *  this software at your own risk. 
 *  In no way shall the author be made responsible for any damage caused by the
 *  use of this software.
 *
 * Copyright and Terms Of Use:
 *  You may use and redistribute this software as long as the original
 *  copyright statement remains intact. You are free to modify the code.
 *  Please let me know if you find this software useful, or if you found
 *  improvements (or bugs).
 * 
 * @author   : Rene Straub, rene.straub@yetnet.ch
 * @date     : 14.6.2002
 * @version  : 1.00
 **/

//--- includes ----------------------------------------------------------------

#ifdef __cplusplus
extern "C" {
#endif

// Need to access some VxWorks internals...
#include </rtos_vob/h/private/mempartlibp.h>    // select your path ...
#include <tasklib.h>


//--- defines -----------------------------------------------------------------

// A handy macro to call the memory check
#define MEM_CHECK()   memCheck(__FILE__, __LINE__)

// Debug level (specify 0 for normal use, use 1 and 2 for debugging only)
#define SHOW_LEVEL    0           // 0: Errors only.
                                  // 1: Errors, free nodes and summary
                                  // 2: All messages (be warned this may
                                  //    produce thousands of messages !)


//--- prototypes --------------------------------------------------------------

/**
 * Configures the check function.
 * Call this function once before calling memCheck(). If you want to check more
 * than one memory partition, you must call memCheckSetup() again before using 
 * another partition.
 *
 * @param   partition     In. VxWorks memory partition. If 0 the default
 *                            partition is used.
 * @param   lowAddr       In. Lowest valid address in this memory partition.
 * @param   highAddr      In. Highest valid address in this memory partition.
 * @see     memCheck()
 **/
extern void memCheckSetup(PART_ID partition, void* lowAddr, void* highAddr);

/**
 * Checks VxWorks memory list.
 * If the memory list is ok, the function returns without an error. Otherwise
 * a debug message is printed and the calling task is suspended.
 *
 * @param   pszFile       In. File name, from where test is called.
 * @param   line          In. Line number, from where test is called.
 * @see     memCheckSetup()
 **/
extern void memCheck(const char* pszFile, unsigned line);

/**
 * Tests memory check function (only for debugging)
 *
 * This function intentionally corrupts a memory-node and then calls the check
 * function to find the corrupt memory node. 
 * If everything works well, the function will report an error and stop the 
 * calling task.
 * @note: This function is only for debugging, never use it in a real project.
 **/ 
extern void memCheckTest(void);



#ifdef __cplusplus
} /* end extern "C" */
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -