rtems;:双端内存管理器
19.1: 介绍
%A
%A 双端口内存指的是可以由两个处理器同时访问的内存芯片( 例如DMA存储器 )。在RTEMS中为该芯片提供了系统服务。RTEMS的双端口内存管理器为双端口内存区(DPMA)提供了地址变换供能。 管理器包含下面的API:
%A
%A rtems_port_create- 创建端口
%A
%A rtems_port_ident- 获取端口的ID标识
%A
%A rtems_port_delete- 删除端口
%A
%A rtems_port_external_to_internal- 将双端口内存的外部地址变为内部地址
%A
%A rtems_port_internal_to_external- 将双端口内存的内部地址变为外部地址
%A 19.2: 背景
%A
%A 双端内存区(DPMA)是一个连续内存区,该区域可以被多个处理器访问。DPMA的属主使用内部地址访问DPMA,其他处理器使用外部地址访问DPMA。RTEMS将端口(port)定义为内部地址和外部地址的映射。
%A
%A 在两种硬件体系中可以看到双端内存,一个是紧耦合多处理器系统,系统中双端内存被多个处理器节点共享,用于处理器间的通信。另一个是具有智能外设的处理系统。为了提高系统吞吐量,使用DPMA传输数据。后者在嵌入式系统中更为多见,例如ARM+DSP的视频压缩系统,前端的视频采集和编码使用DSP完成,然后使用双端内存将采集好的数据传输给ARM处理器在LCD上面显示。
%A
%A
%A 19.3: 操作
%A 19.3.1 : 创造一个端口
%A
%A rtems_port_create为DPMA创建一个用户命名的端口。用户定义内部和外部存储映射。RTEMS为新建的DPMA分配控制块DPCB。RTEMS也为双口内存端口创建唯一的ID标识。 RTEMS不会初始化双口内存,也不会访问其中的数据。
%A
%A 函数原型:
%A
%A rtems_status_code rtems_port_create(
%A
%A rtems_name name,
%A
%A void *internal_start,
%A
%A void *external_start,
%A
%A rtems_unsigned32 length,
%A
%A rtems_id *id
%A
%A );
%A
%A 返回值代表的状态:
%A
%A RTEMS_SUCCESSFUL- 成功地创造端口
%A
%A RTEMS_INVALID_NAME- 无效任务名字
%A
%A RTEMS_INVALID_ADDRESS- 地址没有按照4字节对齐模式对齐
%A
%A RTEMS_INVALID_ADDRESS- ID标识是空值
%A
%A RTEMS_TOO_MANY- 太多双口存储器区被创建
%A
%A
%A 19.3.2 : 获得端口ID标识
%A
%A 当创建端口时, RTEMS 产生一个唯一的ID标识。ID标识可使用二种方法获得。 首先, rtems_port_create 函数返回值,其次rtems_port_ident 函数。
%A
%A 函数原型:
%A
%A rtems_status_code rtems_port_ident(
%A
%A rtems_name name,
%A
%A rtems_id *id
%A
%A );
%A
%A 返回值代表的状态 :
%A
%A RTEMS_SUCCESSFUL- 成功地获得 ID
%A
%A RTEMS_INVALID_ADDRESS- ID 标识是空值
%A
%A RTEMS_INVALID_NAME- 找不到对应名称
%A
%A 描述:
%A
%A 函数按照名称获取ID。如果有重名,将返回第一个找到的端口的ID
%A
%A
%A 19.3.3 : 变换地址
%A
%A rtems_port_external_to_internal将地址从外部地址转为内部地址。 rtems_port_internal_to_external 函数处理正号相反。如果转换地址超过DPMA范围,将会返回原始的错误地址。
%A
%A 函数原型:
%A
%A rtems_status_code rtems_port_external_to_internal(
%A
%A rtems_id id,
%A
%A void *external,
%A
%A void **internal
%A
%A );
%A
%A 返回值代表的状态:
%A
%A RTEMS_INVALID_ADDRESS- 内部地址空值
%A
%A RTEMS_SUCCESSFUL- 转换成功
%A
%A 注意:
%A
%A 可从 ISR 中调用该函数是可召唤的。
%A
%A 函数原型:
%A
%A rtems_status_code rtems_port_internal_to_external(
%A
%A rtems_id id,
%A
%A void *internal,
%A
%A void **external
%A
%A );
%A
%A 返回值代表的状态:
%A
%A RTEMS_INVALID_ADDRESS- 外部地址是空值
%A
%A RTEMS_SUCCESSFUL- 成功的转换
%A
%A
%A 19.3.4 : 删除一个 DPMA 端口
%A
%A rtems_port_delete 函数的将DPMA端口从RTEMS中删除。删除后控制块DPCB将会释放。
%A
%A 函数原型:
%A
%A rtems_status_code rtems_port_delete(
%A
%A rtems_id id
%A
%A );
%A
%A 返回值代表的状态:
%A
%A RTEMS_SUCCESSFUL- 成功地删除
%A
%A RTEMS_INVALID_ID- 无效的ID标识
%A%A
%A
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。