GE IS210DRTDH1A(IS200DRTDH1A)
IS210DRTDH1A(IS200DRTDH1A)
IS210DRTDH1A(IS200DRTDH1A)
通过Partition_Create()函数创建一个内存分区,函数定义为
int Partition_Create(mempartition *mp,unsigned int unum,unsigned int usize);
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,07KT95C 07KT95D
GJR5252800R020007KT95
GJR5252900R010107KT96
GJR5253000R010007KT97F1, 07KT97D
GJR5253000R012007KT97
GJR5253000R016007KT97C
GJR5253000R016207KT97D, 07KT97B, 07KT97C
GJR5253000R020007KT97
GJR5253000R026007KT97-ARCNET
GJR5253000R026207KT97B
GJR5253000R026807KT97B
GJR5253000R027007KT97
GJR5253000R027207KT97D
GJR5253000R027507KT97B
GJR5253000R027607KT97
GJR5253000R027707KT97B
GJR5253000R027807KT97B
GJR5253100R016007KT98E2, 07KT98F
GJR5253100R026007KT98 B
GJR5253100R027007KT98 H1
GJR5253100***6007KT98C
GJR5253100***6207KT98
GJR5253200R116107KP93B
GJV3072401R107 KR 228
GJV3072403R107KR264dR1, 07KR264b
GJV3072415R107KR220dR1, 07 KR 220 R1
GJV3072428R207KR240R2 ,07KR240bR2, 07 KR240dR2
GJV3072440R207 KR 228 R2
NLWC-07-KIT
DSAI30357120001-CL
DSAI30557120001-BX/3
DSAO30157120001-DZ/4
DS***11057350001-E
DS***11157350001-CN
DSBB10257310256-A / 1
DSBB10757310256-BE
DSBB11057330001E
DSBB110A57330001-Y
DSBB17057310256-DL
DSBB17557310256-CC/I
DSBBN001-0
DSBBN002-0
DSBC11057310256-E/1
DSBC11157310256-K/1
DSBC17057310256-DB
DSBSN001
DSCA11457510001-AA
DSCA12457520001-BU
DSCA125A57520001-CY
DSCA13057510001-AT
DSCA17057310256-DB / 4
DSCA180B57520001-G2
DSCA190V57310001-PK
DSCA31057520001-AH/1
DSCA32557520001
DSCI112
DSCL11057310001-HD
DSCL110A57310001-KY
DSCS11557520001-AD/4
DSCS1165752 0001-BZ
DSCS11757520001-CN / 9
DSCS13157310001-LM
DSCS150DSCS141
DSDI3015760001-DF/2
DSDO30157160001-CC
DSDON001
DSHM10157350001-AB/2
DSHM1105735095
DSHM1305735095-K
DSHM30157350001-K/1
DSHM30257350001-DS
DSIC11157330001-T / 2
DSIH70057350001-AR / 6
DSIH715735099-BA
DSIH75VF5735300-H
DSIH90057350001-CT / 1
D***B1105736 0001A/4
D***B11257360001EV/1, 57360001EV/2
D***B11557360001-CO/5
D***B1165736 0001-EB/2
D***B1235736 0001-AH3
D***B12457360001-U/3
D***B1255736001-AW/3
D***B126A57360001-NR
D***B12757360001-HG/2
D***B1335736 0001-CY
D***B1375736 0001-FA
D***B14457360001-EL, 57360001-EL/1
D***B1515736 0001-K
D***B17357360001-GN
D***B1755736 0001-KG
D***B17657960001-HX
D***B178
D***B34057360001-CT/3
D***C112IN5736-1001-CB-03, 5736 0001-HC
D***D1105736045-A
D***D112
D***D113
DSPB110 57340001-A/3
DSPB112 57340001-K/2
DSPB120 57340001-T
DSPC150 57310256-AF/2
DSPC154 57310001-BY
