syslink各模块_第1页
syslink各模块_第2页
syslink各模块_第3页
syslink各模块_第4页
syslink各模块_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、3.1、NotifyNotify组件将硬件中断抽象成多组逻辑事件,是一种简单快捷的发送低于32bit信息的通信方式。Notify组件提供了以下接口:1. 初始化并配置Notify组件;Notify_attach();2. 注册/注销事件;Notify_registerEvent()/Notify_unregisterEvent()/Notify_registerEventSingle()/Notify_unregisterEventSingle()3. 发送带参数的事件给某处理器;Notify_sendEvent()4. 通过回调函数接收事件;Notify_FnNotifyCbck()5. 使

2、能/禁用事件;Notify_diableEvent()/Notify_enableEvent()6. 其他逻辑接口;Notify_eventAvailable()/Notify_intLineRegistered()/Notify_numIntLines()/Notify_restore()注:1. 同一个中断号可以注册多个事件,同一个事件可以有多个回调函数或者多个宿主(可以是处理器、线程或者任务),事件被触发后所有宿主都会被唤醒;2. 一个事件可以接收多个宿主发送来的通知(notification),事件所携带的参数最大支持32bit;3. 事件是有优先级的,EventId越小优先级越高,事

3、件0的优先级最高,随着EventId增大优先级依次递减;当多个事件被触发,优先级最高的会最先响应;4. Notify模块使用硬件中断,因此不能被频繁调度。Notify组件常用于传递附带消息少于32bit的场景,如信令传递、buffer指针传递等。在信令传递时使用高优先级的事件,如事件0;而在传递buffer指针是可以使用低优先级的事件,如事件30等。在Notify_sentEvent() API中带有参数waitClear,该参数为可选参数,如果waitClear为TRUE,这就意味着多宿主事件无法及时响应,必须等待前一宿主事件结束后才能响应下一宿主;如果waitClear为FALSE,最好不

4、要为事件附带参数,否则多宿主事件可能会由于消息被覆盖而出现丢消息的现象。该API最好不要在中断服务程序(ISR)中调用(特别是waitClear = TRUE时),否则会导致中断调度出现异常(表现之一:高优先级的中断响应会延迟);此外该API不能再使用GateMP模块锁保护的程序段中调用,否则可能会导致操作系统死锁。由于其他模块使用了Notify机制,因此在SysLink中预留了部分事件号,这部分事件号用户需要慎重选用(如果你没有使用其他组建的话,可以考虑占用这部分事件号),在注册事件前可以使用Notify_eventAvailable()来检查该事件是否可用,即该中断号上的该事件号是否被注册

5、。ModuleEvent IdsFrameQBufMgr0FrameQ1MessageQ(TransportShm)2RingIO3NameServerRemoteNotify43.2、MessageQMessageQ,顾名思义,基于队列的消息传递。MessageQ有以下特点: 实现了处理期间变长消息的传递; 消息的传递都是通过操作消息队列来实现的; 每个消息队列可以有多个写者,但只能有一个读者;每个任务(task)可以对多个消息队列进行读写; 一个宿主在准备接收消息时,必须先创建消息队列,而在发送消息前,需要打开预定的接收消息队列;MessageQ组件常用在满足以下条件的场景中:1. 在消息

6、传递中有多个写者,但仅有一个读者;2. 所需要传递的消息超过32bit,且长度可变;读写者的缓冲区大小相同;3. 处理期间需要频繁传递消息,在这种情况下,消息被依次放入队列,能保证不会丢消息;4. 消息队列为空时,调用MessageQ_get()获取消息时会被阻塞,直到消息队列被写入消息;5. 支持处理器间移动消息队列,在这种情况下,调用MessageQ_open()来定位队列位置,而消息传递部分代码不需要改动;MessageQ组件提供了以下几个API:1. 消息队列初始化:MessageQ_Params_init()2. 消息队列创建/销毁:MessageQ_create()/Message

7、Q_delete(),create创建消息队列,并分配相应存储空间3. 消息队列打开/关闭:MessageQ_open()/MessageQ_close(),open时会返回远程处理器上的QueID的地址。4. 为消息队列分配堆内存:MessageQ_alloc()/MessageQ_free()5. 为消息队列注册/注销堆内存:MessageQ_registerHeap()/MessageQ_unregisterHeap()6. 向消息队列中放入/获取消息:MessageQ_put()/MessageQ_get()7. 其他逻辑API: 获取消息队列ID:MessageQ_getQueueI

8、d() 获取消息队列中消息数:MessageQ_count() 在消息队列中嵌入消息:MessageQ_setReplyQueue() 为消息队列解阻塞:MessageQ_unblock() 为调试消息队列加入Trace:MessageQ_setMsgTrace()3.3、ListMPListMP实现了多宿主双向循环链表,即该双向循环链表为多个处理器共同拥有,可以由多个处理器共同维护,共同使用。ListMP的实现区别于一般的双向循环链表,因此它不仅具有双向循环链表的特性外,还增添了其他的特性,比如以下几点: 实现了简单的多宿主协议,支持多个读写者(multi-reader、multi-writ

9、ee); 使用Gate作为内部保护机制,防止多个宿主处理器同时访问该链表;ListMP的实现并未加入通知机制,如果需要的话,可以在外部封装是引入Notify机制来实现;使用ListMP机制来管理的buffers都需要从共享内存区分配,包括从堆内存分配的buffers以及动态分配的内存。ListMP组件常用于满足一下条件的场景中:1. 需要被多个宿主访问并且需要频繁传递消息或者数据;2. 可用于无规则的消息传递,基于链表实现,因此读者可以遍历所有对象,并选出需要的对象进行处理;如果硬件支持快速队列,则无法完成队列遍历操作(WHY);3. 可以自定义消息优先级,同样是基于链表实现,读者可以随意的选

10、择在链表头部还是链表的尾部来插入消息或者实现链表对象的位置调整,进而实现消息的优先级选择;如果硬件支持快速队列,则无法完成队列遍历操作(WHY);4. 无内置通知机制,可以灵活的外部通知机制来实现。譬如根据实际情况,选用Notify来实现,亦或是使用选用MessageQ则可以使用最少的中断资源实现性能优良的通知机制,缺点是需要额外的代码实现通知机制。ListMP组件提供了以下API接口:1. ListMP参数初始化:ListMP_Params_init()2. ListMP创建/销毁:ListMP_create()/ListMP_delete()3. ListMP打开/关闭:ListMP_op

11、en()/ListMP_close()4. ListMP相关链表操作: 判断链表空:ListMP_empty() 获取保护锁:ListMP_getGate() 获取链表头/表尾:ListMP_getHead()/ListMP_getTail() 链表插入操作:ListMP_insert() 获取链表上游元素/下游元素:ListMP_next()/ListMP_prev() 插入元素到链表头/尾:ListMP_putHead()/ListMP_putTail() 删除元素:ListMP_remove()3.4、GateMPGateMP是针对于多处理器共享资源的一种保护机制,就如其名字一样,把共享

12、资源比作房子,那么GateMP就是这个房子的门。GateMP组件实现了开关门的机制,用于保护共享资源一次只被一个处理器读写。根据SOC硬件资源配置的不同,GateMP的实现有所不同。对于硬件支持Hardware Spinlock的可以基于H/W spinlock来实现GateHwSpinlock;而对于没有该硬件资源的系统中,则使用软件方法(Peterson算法)来实现GatePeterson。GateMP组件框架如下:GateMP组件对用户提供了以下API接口:1. GateMP初始化:GateMP_Params_init();2. GateMP创建/删除:GateMP_create()/G

13、ateMP_delete();3. GateMP打开/关闭:GateMP_open()/GateMP_close();4. 进入/离开GateMP保护:GateMP_enter()/GateMP_leave();5. 获取当前GateMP的保护类型:GateMP_getLocalProtect()/GateMP_getRemoteProtect();注:如果某个处理器在想使用被某个GateMP保护的共享资源,那么该处理器会被阻塞,直到该资源被释放(即GateMP_leave())。3.5、HeapMPHeapMP主要包括HeapBufMP和HeapMemMP,用于共享内存区的堆内存配置和管理。

14、HeapMP具备以下几个特征: 支持多宿主,即无论是运行HLOS的主处理器还是运行SYS/BIOS的从处理器都可以配置和管理堆内存; 可以将共享内存区配置成缓冲池(buffer pools); 可以从共享内存区分配和释放缓冲区;3.5.1、HeapBufMPHeapBufMP为用户提供了固定大小的缓冲池管理接口;HeapBufMP组件为用户提供的API接口如下:1. HeapBufMP创建/删除:HeapBufMP_create();HeapBufMP_delete();2. HeapBufMP打开/关闭:HeapBufMP_open();HeapBufMP_close();3. HeapBu

15、fMP参数初始化:HeapBufMP_Params_init();4. HeapBufMP分配/释放内存:HeapBufMP_alloc();HeapBufMP_free();5. HeapBufMP获取所有状态:HeapBufMP_getExtendedStats();HeapBufMP_getStats();3.5.2、HeapMultiBufMP在SysLink包中并没有找到相关API,但SysLink UserGuide中有提到.HepMultiBufMP为用户提供了可配置大小的缓冲池管理接口。3.5.3、HeapMemMPHeapMemMp为用户提供了基于堆的可变大小的内存管理机制。

16、HeapMemMp组件为用户提供的接口如下:1. HeapMemMP参数初始化:HeapMemMP_Params_init();2. HeapMemMP创建/删除:HeapMemMP_create()/HeapMemMP_delete();3. HeapMemMP打开/关闭:HeapMemMP_open()/HeapMemMP_close();4. HeapMemMP分配/释放内存:HeapMemMP_alloc()/HeapMemMP_free();5. HeapMemMP获取内存状态:HeapMemMP_getExtendedStats()/HeamMemMP_getStats();6.

17、HeapMemMP恢复内存初始状态:HeapMemMP_restore();3.6、FrameQFrameQ是专门为传递视频帧而设计出来的组件。FrameQ的基本数据结构是可用于queue/dequeue数据的数据队列,封装了视频帧缓存指针、帧数据类型、帧宽、帧高、时间戳等信息。对于FrameQ模块具有以下特征: 支持多个读者,但写者唯一; 可以分配和释放Frames; 可以对指向同一块内存区多次分配和初始化成新的帧buffer; FrameQ允许有多个队列,在多通道的运用中,视频帧会根据通道号被分配到相应的帧队列中;FrameQ中用于buffer管理的模块称为FrameQBufMgr,该模块

18、用于提供buffer管理接口和通知机制。FrameQ提供以下API接口:1. FrameQ组件初始化/销毁:FrameQ_setup()/FrameQ_destroy();2. 创建/删除FrameQ实例:FrameQ_create()/FrameQ_delete();3. 打开/关闭FrameQ实例:FrameQ_open()/FrameQ_close();FrameQ_openByAddr();4. 为FrameQ实例分配/释放内存:FrameQ_alloc()/FrameQ_free();FrameQ_allocv/FrameQ_freev();5. 插入/释放FrameQ中帧:Fram

19、eQ_put()/FrameQ_get();FrameQ_putv()/FrameQ_getv();6. 复制给定的帧:FrameQ_dup();7. 注册/注销FrameQ通知:FrameQ_registerNotifier()/FrameQ_unregisterNotifier();8. 强制发送通知:FrameQ_sendNotify()9. 获取FrameQ中有效帧数/已被释放的帧数:FrameQ_getNumFrames()/FrameQ_getNumFreeFrames(); FrameQ_getvNumFrames()/FrameQ_getvNumFreeFrames()10.

20、FrameQ控制:FrameQ_control()11. 获取FrameQ的头指针:FrameQ_getExtendedHeaderPtr();12. 获取帧buffer/帧大小/帧数:FrameQ_getFrameBuffer()/FrameQ_getFrameBufSize()/FrameQ_getNumFrameBuffers();13. 获取空数据帧大小/位置:FrameQ_getFrameBufValidSize()/FrameQ_getFrameBufDataStartOffset();14. 设置空数据帧大小/位置:FrameQ_setFrameBufValidSize()/Fr

21、ameQ_setFrameBufDataStartOffset();15. 获取FrameQ默认设置:FrameQ_getConfig();3.7、RingIORingIO是基于数据流的环形缓冲buffer,而且针对于音视频数据的特性做了优化。RingIO支持一下特性: 仅支持一个读者和一个写者; 读写相对独立,可以在不同的进程或者处理器中同时进行读写操作;RingIO为用户提供了以下接口:1. RingIO参数初始化:RingIO_Params_init();2. 创建/删除RingIO对象:RingIO_create()/RingIO_delete();3. 打开/关闭RingIO对象:R

22、ingIO_open()/RingIO_close();RingIO_openByAddr();4. 获取共享内存请求:RingIO_sharedMemReq();5. 注册/注销RingIO通知:RingIO_registerNotifier()/RingIO_unregisterNotifier();6. 强制发送RingIO通知:RingIO_sendNotify();7. 获取RingIO通知类型:RingIO_setNotifyType();8. 设置/获取水印标志/通知类型:RIngIO_setWaterMark()/RIngIO_getWaterMark()9. 获取/释放Rin

23、gIO数据:RingIO_acquire()/RingIO_release();10. 设置/获取RingIO属性:RingIO_setvAttribute()/RingIO_getvAttribute();11. 设置/获取RingIO固定大小的属性:RingIO_setAttribute()/RingIO_getAttribute();12. 刷新RingIO的buffer:RingIO_flush();13. 获取有效/空buffer大小:RingIO_getValidSize()/RingIO_getEmptySize();14. 获取有效/空属性大小:RingIO_getValidA

24、ttrSize()/RingIO_getEmptyAttrSize();15. 获取用户需求buffer的大小/位置:RingIO_getAcquiredSize()/RingIO_getAcquiredOffset();4、公共组件(基础组件)Utility Modules包括SharedRegion(IPC中属于类库ti.sdo.ipc.SharedRegion)、List、Trace、MultiProc、NameServer等,这些模块是上层组件实现的基础。在IPC包中,该组件对应于类库ti.sdo.utils.4.1、SharedRegion(非常重要,SysLink模块最基础的模块)

25、4.1.1、SharedRegion总览SharedRegion顾名思义,是共享内存区的意思。SharedRegion模块负责管理共享内存区。在一个有共享内存的多核架构中,普遍会遇到共享内存映射虚拟地址转换问题,如下图所示:SharedRegion有两种配置方式,即静态配置方法(对于SYS/BIOS侧可以通过cfg脚本配置,而对于HLOS则当从处理器被加载的时候会通过读取SYS/BIOS共享内存区配置信息来获取,请参考内核driver/dsp/syslink/notify_shmdriver/notify_shm_drv.c中实现)和动态配置方法(通过SharedRegion模块提供的API SharedRegion_setEntry()来设置,但值得注意的是这个API只是把入口信息

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论