📄 pmc.c
字号:
/*************************************************************************//* *//* Copyright Mentor Graphics Corporation 2002 *//* All Rights Reserved. *//* *//* THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS *//* THE PROPERTY OF MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS *//* SUBJECT TO LICENSE TERMS. *//* *//*************************************************************************//*************************************************************************//* *//* FILE NAME VERSION *//* *//* pmc.c Nucleus PLUS 1.14 *//* *//* COMPONENT *//* *//* PM - Partition Memory Management *//* *//* DESCRIPTION *//* *//* This file contains the core routines for the Partition Memory *//* Management component. *//* *//* DATA STRUCTURES *//* *//* None *//* *//* FUNCTIONS *//* *//* PMC_Create_Partition_Pool Create a Partition Pool *//* PMC_Delete_Partition_Pool Delete a Partition Pool *//* PMC_Allocate_Partition Allocate a partition from a *//* pool *//* PMC_Deallocate_Partition Deallocate a partition from *//* a pool *//* PMC_Cleanup Cleanup on timeout or a *//* terminate condition *//* *//* DEPENDENCIES *//* *//* cs_extr.h Common Service functions *//* tc_extr.h Thread Control functions *//* pm_extr.h Partition functions *//* hi_extr.h History functions *//* *//* HISTORY *//* *//* DATE REMARKS *//* *//* 03-01-1993 Created initial version 1.0 *//* 04-19-1993 Verified version 1.0 *//* 08-09-1993 Corrected pointer retrieval *//* loop, resulting in version 1.0a *//* 08-09-1993 Verified version 1.0a *//* 03-01-1994 Moved non-core functions into *//* supplemental files, changed *//* function interfaces to match *//* those in prototype, added *//* register options, changed *//* protection logic to reduce *//* overhead, resulting in *//* version 1.1 *//* *//* 03-18-1994 Verified version 1.1 *//* 04-17-1996 updated to version 1.2 *//* 03-24-1998 Released version 1.3 *//* 03-26-1999 Released 1.11m (new release *//* numbering scheme) *//* 04-17-2002 Released version 1.13m *//* 11-07-2002 Released version 1.14 *//*************************************************************************/#define NU_SOURCE_FILE#include "cs_extr.h" /* Common service functions */#include "tc_extr.h" /* Thread control functions */#include "pm_extr.h" /* Partition functions */#include "hi_extr.h" /* History functions */#include "profiler.h" /* ProView interface *//* Define external inner-component global data references. */extern CS_NODE *PMD_Created_Pools_List;extern UNSIGNED PMD_Total_Pools;extern TC_PROTECT PMD_List_Protect;/* Define internal component function prototypes. */VOID PMC_Cleanup(VOID *information);/*************************************************************************//* *//* FUNCTION *//* *//* PMC_Create_Partition_Pool *//* *//* DESCRIPTION *//* *//* This function creates a memory partition pool and then places it *//* on the list of created partition pools. *//* *//* CALLED BY *//* *//* Application *//* PMCE_Create_Partition_Pool Error checking shell *//* *//* CALLS *//* *//* CSC_Place_On_List Add node to linked-list *//* [HIC_Make_History_Entry] Make entry in history log *//* [TCT_Check_Stack] Stack checking function *//* TCT_Protect Data structure protect *//* TCT_Unprotect Un-protect data structure *//* *//* INPUTS *//* *//* pool_ptr Partition pool control block *//* pointer *//* name Partition pool name *//* start_address Starting address of the pool *//* pool_size Number of bytes in the pool *//* partition_size Number of bytes in each *//* partition of the pool *//* suspend_type Suspension type *//* *//* OUTPUTS *//* *//* NU_SUCCESS *//* *//* HISTORY *//* *//* DATE REMARKS *//* *//* 03-01-1993 Created initial version 1.0 *//* 04-19-1993 Verified version 1.0 *//* 03-01-1994 Changed function interfaces to *//* match those in prototype, *//* added register options, *//* resulting in version 1.1 *//* *//* 03-18-1994 Verified version 1.1 *//* *//*************************************************************************/STATUS PMC_Create_Partition_Pool(NU_PARTITION_POOL *pool_ptr, CHAR *name, VOID *start_address, UNSIGNED pool_size, UNSIGNED partition_size, OPTION suspend_type){R1 PM_PCB *pool; /* Pool control block ptr */INT i; /* Working index variable */BYTE_PTR pointer; /* Working byte pointer */PM_HEADER *header_ptr; /* Partition block header ptr*/NU_SUPERV_USER_VARIABLES /* Switch to supervisor mode */ NU_SUPERVISOR_MODE(); /* Move input pool pointer into internal pointer. */ pool = (PM_PCB *) pool_ptr;#ifdef NU_ENABLE_STACK_CHECK /* Call stack checking function to check for an overflow condition. */ TCT_Check_Stack();#endif#ifdef NU_ENABLE_HISTORY /* Make an entry that corresponds to this function in the system history log. */ HIC_Make_History_Entry(NU_CREATE_PARTITION_POOL_ID, (UNSIGNED) pool, (UNSIGNED) name, (UNSIGNED) start_address);#endif /* First, clear the partition pool ID just in case it is an old pool control block. */ pool -> pm_id = 0; /* Fill in the partition pool name. */ for (i = 0; i < NU_MAX_NAME; i++) pool -> pm_name[i] = name[i]; /* Save the starting address and size parameters in the partition control block. */ pool -> pm_start_address = start_address; pool -> pm_pool_size = pool_size; pool -> pm_partition_size = partition_size; /* Setup the partition pool suspension type. */ if (suspend_type == NU_FIFO) /* FIFO suspension is selected, setup the flag accordingly. */ pool -> pm_fifo_suspend = NU_TRUE; else /* Priority suspension is selected. */ pool -> pm_fifo_suspend = NU_FALSE; /* Clear the suspension list pointer. */ pool -> pm_suspension_list = NU_NULL; /* Clear the number of tasks waiting on the partition pool. */ pool -> pm_tasks_waiting = 0; /* Initialize link pointers. */ pool -> pm_created.cs_previous = NU_NULL; pool -> pm_created.cs_next = NU_NULL; /* Initialize the partition parameters. */ pool -> pm_available = 0; pool -> pm_allocated = 0; pool -> pm_available_list = NU_NULL; /* Convert the supplied partition size into something that is evenly divisible by the sizeof an UNSIGNED data element. This insures UNSIGNED alignment. */ partition_size = ((partition_size + sizeof(UNSIGNED) - 1)/sizeof(UNSIGNED)) * sizeof(UNSIGNED); /* Loop to build and link as many partitions as possible from within the specified memory area. */ pointer = (BYTE_PTR) start_address; while (pool_size >= (PM_OVERHEAD + partition_size)) { /* There is room for another partition. */ /* Cast the current pointer variable to a header pointer. */ header_ptr = (PM_HEADER *) pointer; /* Now, build a header and link it into the partition pool available list- at the front. */ header_ptr -> pm_partition_pool = pool; header_ptr -> pm_next_available = pool -> pm_available_list; pool -> pm_available_list = header_ptr; /* Increment the number of partitions available in the pool. */ pool -> pm_available++; /* Decrement the number of bytes remaining in the pool. */ pool_size = pool_size - (PM_OVERHEAD + partition_size); /* Increment the working pointer to the next partition position. */ pointer = pointer + (PM_OVERHEAD + partition_size); } /* Protect against access to the list of created partition pools. */ TCT_Protect(&PMD_List_Protect); /* At this point the partition pool is completely built. The ID can now be set and it can be linked into the created partition pool list. */ pool -> pm_id = PM_PARTITION_ID; /* Link the partition pool into the list of created partition pools and increment the total number of pools in the system. */ CSC_Place_On_List(&PMD_Created_Pools_List, &(pool -> pm_created)); PMD_Total_Pools++;#ifdef INCLUDE_PROVIEW _RTProf_DumpPartitionPool(RT_PROF_CREATE_PARTITION_POOL,pool,RT_PROF_OK);#endif /* INCLUDE_PROVIEW */ /* Release protection against access to the list of created partition pools. */ TCT_Unprotect(); /* Return to user mode */ NU_USER_MODE(); /* Return successful completion. */ return(NU_SUCCESS);}/*************************************************************************//* *//* FUNCTION *//* *//* PMC_Delete_Partition_Pool *//* *//* DESCRIPTION *//* *//* This function deletes a memory partition pool and removes it from*//* the list of created partition pools. All tasks suspended on the *//* partition pool are resumed with the appropriate error status. *//* Note that this function does not free any memory associated with *//* either the pool area or the pool control block. *//* */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -