STM32串口驱动(拼音检索测试通过)(环形队列+内存动态分配+DMA)(2)

2019-01-27 16:45

内存分配2 (原文件名:内存分配2.JPG)

在上图中可以看到,虽然起始地址为20000的内存区有16个空白的字节,但是仍然无法为任务分配到四个字节的物理内存。 (2)运行的时间不确定的问题

在free()函数中,存在着一些内存合并等功能,例如将释放完成以后,将空间上相近的两个空白区域合并为同一个,将存在内存碎片的区域重新整合,甚至可能使用了二叉树等非线性数据结构,等等操作。 而这些函数所耗费的时间是无法确定的,在实际的应用中,对于内存这种全局变量,多个任务都要用到,为避免会存在可重入性的问题,必须采用信号同步的方法,或者暂时关闭中断的方法,来同步对各个任务对共享资源的使用。这样,导致了系统死区时间的增加,响应速度的变慢,不确定性增加。

因此,在大多数嵌入式系统中,通常采用静态内存块池的方法。将系统空余的内存统一管理,生成一系列的大小固定的内存块池,在实际的操作中,以这一整个内存块进行操作。 实现过程

首先定义内存管理块的结构体 typedef struct OSMEMTCB{

void *OSMemFreeList;//用于指向该管理区中的空白的内存块 u8 OSMemBlkSize;//用于该管理区中的每个内存块的字节数 u8 OSMemNBlks;//用于该管理区中的分为多少个内存块 u8 OSMemFreeNBlks;//用于该管理区还剩多少空白内存块

}OSMEMTcb;

将一个静态的存储区分配给内存配置函数,内存管理块的各个列表的含义如下图所示:

内存分配3 (原文件名:内存分配3.JPG)

每个内存块的头四个字节用于存储下一个内存块的指针地址,直到倒数第一个为止,最后一个指针指向一个空的指针,表明已经到达内存区的的末端。

在实际运用过程中,OSMemFreeList是指向空白的内存块的指针,通过它来申请内存,当申请到内存块以后,OSMemFreeList指向当前数据块的下一个内存块节点地址(内存管理函数已经自动将所有内存块通过指针链接成一个单向链表),当释放内存块的时候,将OSMemFreeList指向当前释放的内存块,将当前内存块的下一个内存块指针指向先前的OSMemFreeList。OSMemFreeNBlks保存着该内存区空白块的数量,若内存块已满,返回错误代码,OSMemBlkSize指的是每个内存块内字节数量,它的大小可以根据需要指定,理论上是它越小,内块的利用率就越高,例如保存一个101个字节的数据,若一个内存块的大小是10个字节,则需要11个内存块,若一个内存块的大小是100个字节,则需要2个内存块,最后一个内存块仅仅使用了一个字节。但并非内存块的越小越好,因为保存下个内存块节点的地址需要4个地址位,内存块越小,保存地址的数据所占比例越高。在实际操作32字节过程中,可以定义大小不同的内存块,灵活运用。

内存分配4 (原文件名:内存分配4.JPG)

内存配置函数的核心代码:OSMemCreate(......)

内存分配5 (原文件名:内存分配5.JPG)

for(i=0;i

plink=(void **)(link); //将二维指针定位到框的首位 *plink=(void *)(link+blksize); //该内存块的地址存放的 //是第二片内存区的首地址

link+=blksize; //一维指针重新定位 }

//最后一个二维指针指向一个空指针

获取内存块的核心代码:OSMemGet(......)

tcb=(*ptr).OSMemFreeList;

if((*ptr).OSMemFreeNBlks==0){return (void *)0;}//如果空白内存块的数量为 //返回,若正确返回,收到的数据应该是0

(*ptr).OSMemFreeNBlks--; //空白内存块块数量减一 //空白内存块指针指向下一个内存区

//tcb指向的是内存块节点指针,不能直接使用,加上偏移值4个字节 index=(u8 *)tcb; index+=4; //返回内存块指针 return index;

释放内存块的核心代码:OSMemDelete(......)

(void **)tcb=(*ptr).OSMemFreeList; //将OSMemFreeList重新指向这个已经变成空白了的指针 (*ptr).OSMemFreeList=tcb; //将这个空白的指针的下个指针指向原先的空白区指针 (*ptr).OSMemFreeNBlks++; //空白内存块数量加1

值得说明的是,工程文件中的OSQMem.h文件中

OS_MEM_MAX //最多允许的内存块管理区 OS_MEM_USART1_MAX 1024 //发送缓冲区的内存大小 OS_MEM_USART1_BLK 32 //每一个块的长度

而 USART.h文件中

DMA_MODE //定义是采用DMA模式,还是普通的中断模式 推荐是用DMA模式

原文出处:

http://www.amobbs.com/thread-4516795-1-1.html


STM32串口驱动(拼音检索测试通过)(环形队列+内存动态分配+DMA)(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:概率论与数理统计期末考试之计算题、解答题(经典含答案)DOC

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: