本文测试板卡为创龙科技 SOM-TL138F 是一款基于 TI OMAP-L138(定点/浮点 DSP C674x + ARM9)+ 紫光同创 Logos/Xilinx Spartan-6 低功耗 FPGA 处理器设计的工业级核心板。核心板内部OMAP-L138 与 Logos/Spartan-6 通过 uPP、EMIFA、I2C 通信总线连接,并通过工业级 B2B连接器引出网口、EMIFA、SATA、USB、LCD 等接口。

核心板经过专业的 PCB Layout 和高低温测试验证,稳定可靠,可满足各种工业应用环境。用户使用核心板进行二次开发时,仅需专注上层运用,降低了开发难度和时间成本,可快速进行产品方案评估与技术预研

ex02_messageq

示例名字:MessageQ

功能说明:基于队列的消息传递,负责GPP与DSP端的可变长度的短消息交互。

图 49

参考英文资料:

图 50

运行命令:

Target# cd demo-rootfs/ex02_messageq/debug/

Target# ls

Target# ./run.sh

成功运行提示如下图:

图 51

特点:

  1. 实现了处理期间变长消息的传递;
  2. 消息的传递都是通过操作消息队列来实现的;
  3. 每个消息队列可以有多个写者,但只能有一个读者;每个任务(task)可以对多个消息队列进行读写;
  4. 一个宿主在准备接收消息时,必须先创建消息队列,而在发送消息前,需要打开预定的接收消息队列;

常用在以下场景中:

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

提供的API接口:

  1. 消息队列初始化:MessageQ_Params_init()
  2. 消息队列创建/销毁:MessageQ_create()/MessageQ_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. 获取消息队列ID:MessageQ_getQueueId()
  8. 获取消息队列中消息数:MessageQ_count()
  9. 在消息队列中嵌入消息:MessageQ_setReplyQueue()
  10. 为消息队列解阻塞:MessageQ_unblock()
  11. 为调试消息队列加入Trace:MessageQ_setMsgTrace()

ex03_notify

示例名字:Notify

功能说明:将硬件中断抽象成多组逻辑事件,是一种简单快捷的发送低于32bit信息的通信方式。

参考英文资料:

图 52

运行命令:

Target# cd demo-rootfs/ex03_notify/debug/

Target# ls

Target# ./run.sh

成功运行提示如下图:

图 53

特点:

  1. 同一个中断号可以注册多个事件,同一个事件可以有多个回调函数或者多个宿主(可以是处理器、线程或者任务),事件被触发后所有宿主都会被唤醒;
  2. 一个事件可以接收多个宿主发送来的通知(notification),事件所携带的参数最大支持32bit;
  3. 事件是有优先级的,EventId越小优先级越高,事件0的优先级最高,随着EventId增大优先级依次递减;当多个事件被触发,优先级最高的会最先响应;
  4. Notify模块使用硬件中断,因此不能被频繁调度。

提供的API接口:

  1. 初始化并配置Notify组件:Notify_attach();
  2. 注册/注销事件:Notify_registerEvent()/Notify_unregisterEvent()/
  3. 发送带参数的事件给某处理器:Notify_sendEvent()
  4. 通过回调函数接收事件:Notify_FnNotifyCbck()
  5. 使能/禁用事件:Notify_disableEvent()/Notify_enableEvent()
  6. 其他逻辑接口:Notify_eventAvailable()/Notify_intLineRegistered()/

Notify组件常用于传递附带消息少于32bit的场景,如信令传递、buffer指针传递等。在信令传递时使用高优先级的事件,如事件0。而在传递buffer指针是可以使用低优先级的事件,如事件30等。

在Notify_sentEvent() API中带有参数waitClear,该参数为可选参数,如果waitClear为TRUE,这就意味着多宿主事件无法及时响应,必须等待前一宿主事件结束后才能响应下一宿主;如果waitClear为FALSE,最好不要为事件附带参数,否则多宿主事件可能会由于消息被覆盖而出现丢消息的现象。

该API最好不要在中断服务程序(ISR)调用(特别是waitClear=TRUE时),否则会导致中断调度出现异常(表现之一:高优先级的中断响应会延迟)。此外该API不能再使用GateMP模块锁保护的程序段中调用,否则可能会导致操作系统死锁。

由于其他模块使用了Notify机制,因此在SysLink中预留了部分事件号,这部分事件号用户需要慎重选用(如果没有使用其他组件,可以考虑占用这部分事件号),在注册事件前可以使用Notify_eventAvailable()来检查该事件是否可用,即该中断号上的该事件号是否被注册。

表 2

 

Module

Event IDs

FrameQBufMgr

0

FrameQ

1

MessageQ(TransportShm)

2

RingIO

3

NameServerRemoteNotify

4

 
 
 

ex04_sharedregion

示例名字:SharedRegion

功能说明:SharedRegion模块负责管理共享内存区。在一个有共享内存的多核架构中,普遍会遇到共享内存映射虚拟地址转换问题。

参考英文资料:

图 54

运行命令:

Target# cd demo-rootfs/ex04_sharedregion/debug/

Target# ls

Target# ./run.sh

成功运行提示如下图:

图 55

提供的API接口:

  1. SharedRegion_clearEntry()
  2. SharedRegion_entryInit()
  3. SharedRegion_getCacheLineSize()
  4. SharedRegion_getEntry()、SharedRegion_setEntry()
  5. SharedRegion_getHeap()
  6. SharedRegion_getId()
  7. SharedRegion_getIdByName()
  8. SharedRegion_getNumRegions()
  9. SharedRegion_getPtr()
  10. SharedRegion_getSRPtr()
  11. SharedRegion_isCacheEnabled()
  12. SharedRegion_translateEnabled()

一般来说配置一个SharedRegion需要关心以下几个参数:

  1. base:The base address,共享内存区的基地址,这个所谓的基地址实际上是映射后的虚拟地址,并非物理地址;
  2. len:The length,共享内存区的大小,对于同一片共享内存,其所有者的查找表中该项值应该是相同的;
  3. name:The name of the region,该共享内存区的名字;
  4. isValid:Whether the region is valid,对于该处理器而言,是否具有权限去访问该共享内存区;
  5. ownerProcId:The id of the processor which owns the region,管理该内存区的处理器ID,该处理器具有创建HeapMemMP的权限,而其他处理器只有使用的权限;
  6. cacheEnable:Whether the region is cacheable,是否为该共享内存区创建cache;
  7. cacheLineSize:The cache line size,cache的大小;
  8. createHeap:Whether a heap is created for the region,是否使用Heap(堆)管理该内存区域;

ex05_heapbufmp

示例名字:HeapBufMP

功能说明:为用户提供了固定大小的缓冲池管理接口。

参考英文资料:

图 56

运行命令:

Target# cd demo-rootfs/ex05_heapbufmp/debug/

Target# ls

Target# ./run.sh

成功运行提示如下图:

图 57

提供的API接口:

  1. HeapBufMP创建/删除:HeapBufMP_create()/HeapBufMP_delete()
  2. HeapBufMP打开/关闭:HeapBufMP_open()/HeapBufMP_close()
  3. HeapBufMP参数初始化:HeapBufMP_Params_init()
  4. HeapBufMP分配/释放内存:HeapBufMP_alloc()/HeapBufMP_free()
  5. HeapBufMP获取所有状态:HeapBufMP_getExtendedStats()/HeapBufMP_getStats()

ex06_listmp

示例名字:ListMP

功能说明:实现了多宿主双向循环链表,即该双向循环链表为多个处理器共同拥有,可以由多个处理器共同维护,共同使用。

参考英文资料:

图 58

运行命令:

Target# cd demo-rootfs/ex06_listmp/debug/

Target# ls

Target# ./run.sh

成功运行提示如下图:

图 59

特点:

ListMP的实现区别于一般的双向循环链表,因此它不仅具有双向循环链表的特性外,还增添了其他的特性,比如以下几点:

  1. 实现了简单的多宿主协议,支持多个读写者(multi-reader、multi-writee)q;
  2. 使用Gate作为内部保护机制,防止多个宿主处理器同时访问该链表;

ListMP的实现并未加入通知机制,如果需要的话,可以在外部封装时引入Notify机制来实现;使用ListMP机制来管理的buffers都需要从共享内存区分配,包括从堆内存分配的buffers以及动态分配的内存。

常用在以下场景中:

  1. 需要被多个宿主访问并且需要频繁传递消息或者数据;
  2. 可用于无规则的消息传递,基于链表实现,因此读者可以遍历所有对象,并选出需要的对象进行处理;如果硬件支持快速队列,则无法完成队列遍历操作;
  3. 可以自定义消息优先级,同样是基于链表实现,读者可以随意的选择在链表头部还是链表的尾部来插入消息或者实现链表对象的位置调整,进而实现消息的优先级选择;如果硬件支持快速队列,则无法完成队列遍历操作;
  4. 无内置通知机制,可以灵活的外部通知机制来实现。譬如根据实际情况,选用Notify来实现,亦或是使用选用MessageQ则可以使用最少的中断资源实现性能优良的通知机制,缺点是需要额外的代码实现通知机制;

提供的API接口:

  1. 参数初始化:ListMP_Params_init()
  2. 创建/销毁:ListMP_create()/ListMP_delete()
  3. 打开/关闭:ListMP_open()/ListMP_close()
  4. 相关链表操作:
  • 判断链表空:ListMP_empty()
  • 获取保护锁:ListMP_getGate()
  • 获取链表头/表尾:ListMP_getHead()/ListMP_getTail()
  • 链表插入操作:ListMP_insert()
  • 获取链表上游元素/下游元素:ListMP_next()/ListMP_prev()
  • 插入元素至链表头/尾:ListMP_putHead()/ListMP_putTail()
  • 删除元素:ListMP_remove()

ex07_gatemp

示例名字:GateMP

功能说明:GateMP是针对于多处理器共享资源的一种保护机制,就如其名字一样,把共享资源比作房子,那么GateMP就是这个房子的门。GateMP组件实现了开关门的机制,用于保护共享资源一次只被一个处理器读写。根据Soc硬件资源配置的不同,GateMP的实现有所不同。对于硬件支持Hardware Spinlock的可以基于H/W spinlock来实现GateHwSpinlock;而对于没有该硬件资源的系统中,则使用软件方法(Peterson算法)来实现GatePeterson。

GateMP组件框架如下:

图 60

参考英文资料:

图 61

运行命令:

Target# cd demo-rootfs/ex07_gatemp/debug/

Target# ls

Target# ./run.sh

成功运行提示如下图:

图 62

提供的API接口:

  1. 初始化:GateMP_Params_init()
  2. 创建/删除:GateMP_create()/GateMP_delete()
  3. 打开/关闭:GateMP_open()/GateMP_close()
  4. 进入/离开保护:GateMP_enter()/GateMP_leave()
  5. 获取当前的保护类型:GateMP_getLocalProtect()/GateMP_getRemoteProtect()

ex08_ringio

示例名字:RingIO

功能说明:该组件提供基于数据流的循环缓冲区。该组件允许在共享存储空间创建循环缓冲区,不同的处理都能够读取或者写入循环缓冲区。RingIO组件允许通过写指针来获取数据缓冲区的空存储空间,当该存储空间被释放之后,相应存储空间可以被再次写入。

RingIO组件允许读指针获取缓冲区中读取空间的有效数据。当被释放之后,相应存储空间的数据被标记为无效。每个RingIO实体拥有一个读指针和一个写指针。RingIO组件也有API函数可以使能数据属性的同步传输。如:EOS(End Of Stream)、事件戳、流偏移地址等,也可能伴随着循环缓冲区的偏移值。

图 63

参考英文资料:

图 64

运行命令:

Target# cd demo-rootfs/ex08_ringio/debug/

Target# ls

Target# ./run.sh

成功运行提示如下图:

图 65

特点:

  1. 仅支持一个读者和一个写者;
  2. 读写相对独立,可以在不同的进程或者处理器中同时进行读写操作;

提供的API接口:

  1. RingIO参数初始化:RingIO_Params_init()
  2. 创建/删除RingIO对象:RingIO_create()/RingIO_delete()
  3. 打开/关闭RingIO对象:RingIO_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. 获取/释放RingIO数据: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_getValidAttrSize()/RingIO_getEmptyAttrSize()
  15. 获取需求buffer的大小/位置:RingIO_getAcquiredSize()/ RingIO_getAcquiredOffset()

ex09_readwrite

示例名字:ProcMgr read/write

功能说明:ProcMgr read/write示例阐明了大缓冲区通过直接读写DSP内部RAM来进行传输的概念。它实现了在GPP端和使用ProcMgr_read()和ProcMgr_write() API的DSP端以及两个DSP端之间的大尺寸数据缓冲器之间的数据与信息的传递和转换。"ProcMgr read/write"示例中数据与信息流向图如下:

图 66

运行命令:

Target# cd demo-rootfs/ex09_readwrite/debug/

Target# ls

Target# ./run.sh

成功运行提示如下图:

图 67

ex33_umsg

示例名字:umsg(Inter-processor Unidirectional Messaging)

功能说明:编译usmg库文件和umsg相关驱动。

参考英文资料:

图 68

运行命令:

Target# cd demo-rootfs/ex33_umsg/

Target# ls

Target# ./load_umsg.sh

成功运行提示如下图:

图 69

备注:由于ex34_radar示例用到了ex33_umsg示例编译出来的驱动程序和库文件,因此在使用ex34_radar示例之前,一定要运行ex33_umsg示例。

ex34_radar

示例名字:radar

功能说明:阐明如何利用umsg库在GPP和DSP之间传递信息。

图 70

参考英文资料:

图 71

Target# cd demo-rootfs/ex34_radar/debug/

Target# ls

Target# ./run.sh

成功运行提示如下图:

图 72

基于OMAPL138+FPGA核心板——MCSDK开发入门(下)的更多相关文章

  1. 基于xilinx Zynq UltraScale MPSoC平台的核心板及开发板介绍-米尔科技

    近日,米尔科技推出国内首款基于xilinx Zynq UltraScale+MPSoC 平台的核心板及开发板.其优势主要有:采用16纳米制程,相比Znyq7000系列每瓦性能提升5倍,且单芯片融合4核 ...

  2. 基于Nodejs生态圈的TypeScript+React开发入门教程

    基于Nodejs生态圈的TypeScript+React开发入门教程   概述 本教程旨在为基于Nodejs npm生态圈的前端程序开发提供入门讲解. Nodejs是什么 Nodejs是一个高性能Ja ...

  3. 【iCore3应用】基于iCore3双核心板的编码器应用实例

    简介 本硬件电路方案是针对集电极开路输出的编码器设计的.隔离前电压为5V,同时5V也是编码器的驱动电压,由外部供电:隔离后电压为3.3V,由核心板提供.隔离芯片采用3通道ADUM1300隔离芯片.因为 ...

  4. u-boot 移植 --->4、Tiny210核心板的DDR初始化下详解

    RAM的原理简单学习 DDR是RAM的一种,RAM常见的类型有SRAM,SDRAM,DDR他们的共同特点是,随机存储意味着读写速度快,掉电后数据丢失,所以常用来存储程序中的变量. SRAM 静态随机存 ...

  5. 基于CC1606 FPGA评估板移植iCamera程序小结

    iCamera作为柴草电子经典的摄像头开发工具,其强大的摄像头调试功能,深受广大网友喜爱,支持市面上各种摄像头. 目前现有的应用板卡支持:CC1601(CP601A). CC1602(CP601B) ...

  6. arm + fpga 核心板

  7. 高性能嵌入式核心板新标杆!米尔推出基于NXP i.MX8M处理器的MYC-JX8MX核心板

    随着嵌入式及物联网技术的飞速发展,高性能计算的嵌入式板卡已经成为智能产品的基础硬件平台.为响应行业应用和满足客户需求,米尔电子推出基于NXP公司i.MX8M系列芯片的开发平台MYD-JX8MX系列开发 ...

  8. m6c2g核心板使用笔记

    周立功官网资料下载链接:http://www.zlg.cn/ipc/down/down/id/84.html 平台:致远M6G2C-L Cortex-A7工控核心板 主要参考文档:EPC_loT_M6 ...

  9. STM32 USB开发(三) 基于F105RBT6核心板开发的自定义HID收发(FS)

    硬件设计 该核心板的USB插口有两个,一个是用于USB Slave的,可以用来做HID设备,把模拟STM32模拟为U盘等:另一个是USB Host设备,可以对插上的U盘的数据进行读写. 图中J2是Mi ...

  10. 202-基于TI DSP TMS320C6678、Xilinx K7 FPGA XC72K325T的高速数据处理核心板

    基于TI DSP TMS320C6678.Xilinx K7 FPGA XC72K325T的高速数据处理核心板 一.板卡概述 该DSP+FPGA高速信号采集处理板由我公司自主研发,包含一片TI DSP ...

随机推荐

  1. CMake 教程(待完善)

    Cmake 教程 写在前面 如果工程只有几个文件,直接编写Makefile更直接明了 如果使用C.C++.之外的语言,请不要使用cmake 如果使用的语言有非常完备的构建体系,不需要使用cmake C ...

  2. 一:大数据架构回顾-Lambda架构

    "我们正在从IT时代走向DT时代(数据时代).IT和DT之间,不仅仅是技术的变革,更是思想意识的变革,IT主要是为自我服务,用来更好地自我控制和管理,DT则是激活生产力,让别人活得比你好&q ...

  3. java代码审计跨站脚本(XSS)--反射型

    一.基础:跨站脚本(Xss) 一.原理: 恶意攻击者往web页面里插入恶意js代码,而在服务端没有对数据进行严格的过滤.当用户浏览页面时,js代码必须在该html页面中(hrml必须要存在这个而已艾玛 ...

  4. CSS样式第四篇

    ​针对现在网站的图片过大问题,可以用相应的工具进行压缩,并且可对图片进行切割处理. 1.如果一个页面的图片过大,可以对其切割,代码<img src="1.jpg">&l ...

  5. 当你用neovim的mason插件管理lsp config,并且配置好bash的bashls后,却没有正常工作的解决方式

    刚开始遇到这个情况我百思不得其解,检查了neovim checkhealth,以为是npm包管理的问题,然后删了下删了下 不但没有解决还把包管理整乱了-- 后来发现是我没仔细看bash-languag ...

  6. cesium教程4-用entity加载glb和gltf格式的小模型

    示例完整代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  7. OpenVoiceV2本地部署教程,苹果MacOs部署流程,声音响度统一,文字转语音,TTS

    最近OpenVoice项目更新了V2版本,新的模型对于中文推理更加友好,音色也得到了一定的提升,本次分享一下如何在苹果的MacOs系统中本地部署OpenVoice的V2版本. 首先下载OpenVoic ...

  8. C语言:顺序存储循环队列#保存文件中单词的最后三个字母

    目录 前言 全局变量和结构体代码 四个任务 ①计算文件中的单词数量 ②保存单词最后三个字母到链表中 ③将链表的内容导出到另一个文件中 ④将新文件的内容打印到屏幕中 @完整代码@ 前言 本博客最终会完成 ...

  9. JDK源码阅读-------自学笔记(十二)(java.lang.StringBuffer和StringBuilder比较)

    StringBuilder结构

  10. 解析 ABP vNext 依赖注入实现【属性注入】的原理

    前言 这几天闲来没事看看ABP vNext的文档和源码,关于关于依赖注入(属性注入)这块儿产生了兴趣. 我们都知道.Volo.ABP 依赖注入容器使用了第三方组件Autofac实现的.有三种注入方式, ...