
GE IS200DRTDH1A
GEIS210DRTDH1A(IS200DRTDH1A)IS210DRTDH1A(IS200DRTDH1A)IS210DRTDH1A(IS200DRTDH1A)通过Partition_Create()函数创建一个内存分区,函数定义为intPartition_Create(mempartition*mp,unsignedintunum,unsignedintusize);mp为创建的内存分区,unum为该分区中内存块数量,usize为内存块大小。函数流程图如图2所示。对于块内存的申请,采用c语言提供的malloc函数从内存中申请。这对于程序设计者而言提供了极大的方便,对于系统分区不适合嵌入式应用(该实时系统设计应用于嵌入式设备中)需求的情况下,可以删除该分区另外再建立。不过这样做的情况应该尽可能少,因为多次调用malloc/free会产生较多的内存碎片。在做设计时,应该尽可能预先设定好分区数量和各个分区中内存块的数量和大小,尽管系统提供了重建分区的功能。每个块内存的***部分存储该分区对象,其后才是各个内存块。在内存块空闲时,其内部存储了下一个节点的的指针。分配以后,该信息丢失,直接分配给申请者,这样省掉了存储每个内存块信息额外的RAM开销。内存释放时,直接加到该分区空闲内存链表的尾部,同时设定下一个节点内存块信息为NULL。这样在多次分配与释放后,内存块的位置会发生比较大的变化。系统设置了一个全局链表mempartion**partition_list来存储所有的内存分区指针,该链表的长度可以动态定义。也就是说分区的数量可以动态定义。链表中的分区需要进行排序,排序的标准是每个分区中内存块的大小,内存块小的分区排在前面,内存块大的排在后面。因为分区采用***适配的算法,排序以后可以减少内存浪费。同时,系统提供了Mem_Alloc/Mem_Free两个函数来支持系统分区的申请和释放。申请的算法很简单,采用***适配方法从分区链表中找到合适内存分区,如果该区空闲内存链表不为空,则返回该链表***个内存块地址,否则查看下一个分区。如果找不到合适的内存块,则返回空指针。释放算法稍微复杂一些,它需要先检查该内存块属于哪个分区。这样做非常必要,如果把一个小块放到大块的内存分区中,一个任务申请了该空间,则该空间的一部分将跨越到另一个内存块,对该内存块的操作可能覆盖另一个内存块的数据。如果把一个大块放到了小块的分区中,则在分配的时候将分配了多余的空间,造成了内存空间的浪费。找到所图2创建内存分区流程图属分区后,直接把该块放到该区空闲内存链表的尾部。上述系统分区的方式其实是小范围动态分区上实现的静态方式。因为每个内存块大小是固定的,这样不可避免地要浪费一部分空间。对于这个问题的解决,系统还提供了一种纯动态的解决办法,就是调用malloc/free函数来申请内存块。2.1.3内存用户区的动态内存分配从内存划分图中可以看到有一块用户内存区,这是一块内核不会使用的内存区。该区留给用户使用,对于这块区域的申请和释放不调用系统提供的Mem_Alloc/Mem_Free函数,而是直接调用c语言提供的malloc/free函数。malloc具有不确定性,因为它的执行时间和空闲内存块的数量有关,而且多次使用malloc/free调用和释放内存块,可能产生大量的内存碎片。所以这种方式的调用要谨慎。由于用户内存区大小是可配置的,所以用户可以控制该区大小以减少碎片产生的问题。同时对于系统调用,例如任务堆栈分配,不会因为碎片太多而导致分配失败的问题。3.小结动静结合的方式给用户提供了比较大的自由度,用户可以从系统分区中申请内存块,也可以从用户内存区申请内存块。这样增加了系统的灵活性,同时也限制了大量碎片产生的可能(在不频繁删除建立系统内存分区的前提下)。也增加了部分c代码的可移植性。GJR5252800R010007KT95,07KT95F,07KT95C07KT95DGJR5252800R020007KT95GJR5252900R010107KT96GJR5253000R010007KT97F1,07KT97DGJR5253000R012007KT97GJR5253000R016007KT97CGJR5253000R016207KT97D,07KT97B,07KT97CGJR5253000R020007KT97GJR5253000R026007KT97-ARCNETGJR5253000R026207KT97BGJR5253000R026807KT97BGJR5253000R027007KT97GJR5253000R027207KT97DGJR5253000R027507KT97BGJR5253000R027607KT97GJR5253000R027707KT97BGJR5253000R027807KT97BGJR5253100R016007KT98E2,07KT98FGJR5253100R026007KT98BGJR5253100R027007KT98H1GJR5253100***6007KT98CGJR5253100***6207KT98GJR5253200R116107KP93BGJV3072401R107KR228GJV3072403R107KR264dR1,07KR264bGJV3072415R107KR220dR1,07KR220R1GJV3072428R207KR240R2,07KR240bR2,07KR240dR2GJV3072440R207KR228R2NLWC-07-KITDSAI30357120001-CLDSAI30557120001-BX/3DSAO30157120001-DZ/4DS***11057350001-EDS***11157350001-CNDSBB10257310256-A/1DSBB10757310256-BEDSBB11057330001EDSBB110A57330001-YDSBB17057310256-DLDSBB17557310256-CC/IDSBBN001-0DSBBN002-0DSBC11057310256-E/1DSBC11157310256-K/1DSBC17057310256-DBDSBSN001DSCA11457510001-AADSCA12457520001-BUDSCA125A57520001-CYDSCA13057510001-ATDSCA17057310256-DB/4DSCA180B57520001-G2DSCA190V57310001-PKDSCA31057520001-AH/1DSCA32557520001DSCI112DSCL11057310001-HDDSCL110A57310001-KYDSCS11557520001-AD/4DSCS11657520001-BZDSCS11757520001-CN/9DSCS13157310001-LMDSCS150DSCS141DSDI3015760001-DF/2DSDO30157160001-CCDSDON001DSHM10157350001-AB/2DSHM1105735095DSHM1305735095-KDSHM30157350001-K/1DSHM30257350001-DSDSIC11157330001-T/2DSIH70057350001-AR/6DSIH715735099-BADSIH75VF5735300-HDSIH90057350001-CT/1D***B11057360001A/4D***B11257360001EV/1,57360001EV/2D***B11557360001-CO/5D***B11657360001-EB/2D***B12357360001-AH3D***B12457360001-U/3D***B1255736001-AW/3D***B126A57360001-NRD***B12757360001-HG/2D***B13357360001-CYD***B13757360001-FAD***B14457360001-EL,57360001-EL/1D***B15157360001-KD***B17357360001-GND***B17557360001-KGD***B17657960001-HXD***B178D***B34057360001-CT/3D***C112IN5736-1001-CB-03,57360001-HCD***D1105736045-AD***D112D***D113DSPB11057340001-A/3DSPB11257340001-K/2DSPB12057340001-TDSPC15057310256-AF/2DSPC15457310001-BY)