首页 资讯 应用 高压 设计 行业 低压 电路图 关于

嵌入式

旗下栏目: PLC 嵌入式 单片机 DCS

OSAL之缓冲管理

嵌入式 | 发布时间:2017-10-04 | 人气: | #评论# |本文关键字:OSAL,缓冲管理
摘要:OSAL 缓冲管理的代码实现主要在 Osal_bufmgr.c 与 Osal_bufmgr.h 两个文件中。在平时写代码时,总是没有过多地在意缓冲,缓冲空间的地址甚至大小全都交给了编译器。对于一个操作系统来说

OSAL缓冲管理的代码实现主要在Osal_bufmgr.cOsal_bufmgr.h两个文件中。在平时写代码时,总是没有过多地在意缓冲,缓冲空间的地址甚至大小全都交给了编译器。对于一个操作系统来说,缓冲的管理也是重要的一部分,总不能让申请的缓冲区地址毫无规律可言,或着分布地很散,当需要使用到的时候却找不到了。缓冲管理可以将申请的缓冲区集中在某个特定地址区域内,当需要的时候给分配空间,不需要的时候则释放,这段地址区域的空间可以重复使用,不造成空间的浪费,而且可以将不同地址的缓冲地址组织管理,清晰地知道每个缓冲区的位置与大小。

1、定义缓冲管理结构

typedef struct bm_desc{  struct bm_desc *next_ptr;   uint16          payload_len; } bm_desc_t;

其中的next_ptr元素将所有的缓冲区组成一段链表,方便管理操作;payload_len元素用来表明缓冲区的空间。

2、定义两个指向缓冲区首部与尾部的宏定义

#define START_PTR( bd_ptr )  ( (bd_ptr) + 1 )#define END_PTR( bd_ptr ) ( (uint8 *)START_PTR( bd_ptr ) + (bd_ptr)->payload_len )

3、定义一个缓冲管理列表,用于管理缓冲区

static bm_desc_t *bm_list_ptr = NULL;

 

osal_bm_alloc() 分配缓冲空间

参数:

size-分配的大小

1、给缓冲分配指定大小的内存空间

bd_ptr = osal_mem_alloc( sizeof( bm_desc_t ) + size );

申请的内存空间包括两部分:管理首部+缓冲区的长度

2、填充管理首部

bd_ptr->payload_len  = size;

3、将刚申请的缓冲区添加到缓冲还礼列表中

bd_ptr->next_ptr = bm_list_ptr;bm_list_ptr = bd_ptr;

OSAL之缓冲管理

 

osal_bm_free() 释放缓冲空间、

参数:

payload_ptr-指向需要释放的缓冲区

1、获取又缓冲管理列表

loop_ptr = bm_list_ptr;

2、遍历缓冲管理列表来查找对应的缓冲区

while ( loop_ptr != NULL ){......prev_ptr = loop_ptr;loop_ptr = loop_ptr->next_ptr;}

3、判断是否找到指定的缓冲区

if ( payload_ptr >= (void *)START_PTR( loop_ptr ) &&         payload_ptr <= (void *)END_PTR( loop_ptr) )

4、查找到后,存在两种情况

(1)要释放的缓冲是缓冲管理列表下第一个缓冲

if ( prev_ptr == NULL )

则调整缓冲管理列表的的头指针,然后释放缓冲区内存

bm_list_ptr = loop_ptr->next_ptr;osal_mem_free( loop_ptr );

OSAL之缓冲管理OSAL之缓冲管理

(2)不是缓冲管理列表的第一个缓冲,则将该缓冲区从缓冲管理列表正剔除,然后释放对应的内存空间

prev_ptr->next_ptr = loop_ptr->next_ptr;osal_mem_free( loop_ptr );


OSAL之缓冲管理OSAL之缓冲管理

 


bm_desc_from_payload() 查找制定地址所属的缓冲区

参数:

payload_ptr-要查找的地址

1、获取缓冲管理列表

loop_ptr = bm_list_ptr;

2、遍历缓冲管理列表指导找到对应的缓冲区

while ( loop_ptr != NULL ){  if ( payload_ptr >= (uint8 *)START_PTR( loop_ptr ) &&       payload_ptr <= (uint8 *)END_PTR( loop_ptr) )  {    break;  }  loop_ptr = loop_ptr->next_ptr;}

3、返回查找到缓冲管理地址

return ( loop_ptr );

 

osal_bm_adjust_header() 向前调整缓冲数据位置

参数:

payload_ptr-指向缓冲区的某个位置

size-要调整的个数,可正可负,正向前调整,负则向后调整

1、查找payload_ptr所指地址对应的管理缓冲

bd_ptr = bm_desc_from_payload( (uint8 *)payload_ptr );

2、根据size调整指针地址位置

new_payload_ptr = (uint8 *)( (uint8 *)payload_ptr - size );

3、如果调整完后的数据指针地址还在原来的管理缓冲的管理下,则返回调整后的位置地址

if ( new_payload_ptr >= (uint8 *)START_PTR( bd_ptr ) &&         new_payload_ptr <= (uint8 *)END_PTR( bd_ptr ) ){return ( (void *)new_payload_ptr );}

 

osal_bm_adjust_tail() 调整缓冲尾部位置

参数:

payload_ptr-指向缓冲区的某个位置

size-要调整的个数,可正可负,正向前调整,负则向后调整(从代码看来只能向前调整)

1、查找payload_ptr所属的缓冲区

bd_ptr = bm_desc_from_payload( (uint8 *)payload_ptr );

2、调整缓冲区尾部的位置

new_payload_ptr = (uint8 *)END_PTR( bd_ptr ) - size;

3、如果调整完后的数据指针地址还在原来的管理缓冲的管理下,则返回调整后的位置地址

if ( new_payload_ptr >= (uint8 *)START_PTR( bd_ptr ) &&

   new_payload_ptr <= (uint8 *)END_PTR( bd_ptr ) )

{

  return ( (void *)new_payload_ptr );

}



责任编辑:电气自动化网
首页 | 资讯 | 应用 | 高压 | 设计 | 行业 | 低压 | 电路图 | 关于

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版

Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。