样例:从A8读入1080p的yuv420sp的数据给dsplink,在dsp 中建立一个link(做一些图像处理的工作)。然后将yuv420sp的数据发送到videoM3做jpeg编码,然后在传递到A8;

步骤:



1)首先參考dsp以下的link,新建一个dsp算法link;

2)改动/mcfw/src_bios6/links_c6xdsp/SRC_FILES.MK文件,增加新增的dsp算法link的.c文件。主要是编译时调用

3)mcfw/interfaces/link_api/ 添加一个dsp link的头文件。方便其他地方调用,主要在A8建立link的时。须要调用dsp算法link的数据结构;还有dsp link的初始化函数和反初始化函数,在system里面调用(mcfw/src_bios6/links_c6xdsp/system/system_c6xdsp.c)。

3.4)在A8中建立link。注冊jpeg码流的回调函数;link的流程:A8->ipcFrameOutLink(A8)->ipcFrameInDsp(dsp)->dsp算法link->ipcFrameOutDsp(dsp)->ipcFramesInVideoM3(videoM3)->jpeg enc->ipcBitsOutVideoM3(videoM3)->ipcBitsIn(A8);

结论:

从A8正确的收到了编码后的jpeg图片。

大家也能够參考这篇文章写dsplink,下面内容转自这边博客。版权归该博客作者;TI8168 DSP算法开发流程http://blog.csdn.net/jiawenquan/article/details/20529581

一、DM8168及本文简单介绍

2010年。TI推出的最新媒体处理器TMS320DM8168作为一款多通道高清SOC系统芯片,集成了1GHz主频Cortex-A8 ARM核与lGHz主频C674x的DSP核。而且集成了3个新版本号的HDVICP子系统,还有新一代的VPSS。可同一时候提供3路1080P分辨率,每秒60帧的高清视频的H.264编码。新版本号的HDVICP可支持高清分辨率的H.264、MPEG-4、VC1编码以及AVS和SVC编码,为高清视频的发展提供了更强大的软硬件支持【引用】。

前面一篇文章介绍了DM8168的异构多核架构,本文旨在介绍怎样在其DSP中加入自己定义的算法。本文建立在已经熟悉CodecEngine的达芬奇架构以及DSP复合XDM标准算法开发流程的基础上。(至于达芬奇架构和DSP算法标准将在下篇文章中补充)。

也就是说本文仅仅介绍DSP算法的集成,即怎样将DSP算法加入到DM8168的MCFW软件框架中。

二、系统环境

开发板为ETV-HDV8168-HDMI(避免广告,不上图)。PC为虚拟机centos6.3

三、介绍

本文以“helloWorld”算法为例。相应的为“helloWorld”link(在McFW框架中link是常常提到的“线程”的代名词)。如果已经拿到了DSP算法project师的算法,这里为helloWorld,文件例如以下:代码下载:http://download.csdn.net/detail/guo8113/6977345

HELLOWORLD Algorithm文件介绍例如以下:

helloWorldAlg_TI_ialg.c – 提供创建算法实例的顶层调用接口,以及处理输入输出帧时的process 调用接口,执行时的參数设置调用接口。

helloWorldAlg_TI_priv.h –算法的私有 Data structures, macros and function call declaration.

helloWorldAlg.h - 对‘Hello World’ Link可见的算法实例创建和process call(处理调用)的Data structures, macros and function call declaration

SRC_FILES.MK – Makefile to build the ‘Hello World’ algorithm.

‘helloWorld’ Link文件介绍

helloWorldLink_tsk.c –此文件含有‘helloWorld’ link: task创建、‘Hello World’ link的从其它links接收命令、从其它links接收和释放buffers的回调函数的定义。(This
file has function definition for creation of ‘helloWorld’ link task, receiving commands from other links and callbacks that other links call for receiving and freeing buffers of ‘Hello World’ link.)

helloWorldLink_priv.c –This file has all private functions for creation of the link and algorithm instance and processing
upon frames.

helloWorldLink_priv.h – This file has macros, data structure and function call declaration private to the ‘helloWorld’ Link.

helloWorldLink.h –This file has macros, data structure and function call declaration of ‘helloWorld’ Link seen by other links. This file has
to be placed under mcfw\interfaces\link_api folder.其它Links的调用接口。

步骤:

1.将interface/link_api/helloWorldLink.h以及src_bios6/alg下的文件和links_c6xdsp/下的文件放到mcfw相应的目录下。

2.在mcfw\src_bios6\Makefile

将helloWorld加入到 INCLUDE_EXERNAL_INTERFACES的列表

INCLUDE_EXERNAL_INTERFACES= bios xdc ipc syslink iss hdvpss ipnc_rdk fc xdais h264enc h264dec swosdhelloWorldedma3lld
mpeg4enc

加入‘Makefile’ 文件和include directory:

INCDIR += $(MODULE_SRC_BASE_PATH)/alg/helloWorldAlg

include $(MODULE_SRC_BASE_PATH)/alg/helloWorldAlg/SRC_FILES.MK

3.在\mcfw\src_bios6\links_c6xdsp\system\system_c6xdsp.c

加入helloWorldLink头文件包括

#include<mcfw/interfaces/link_api/helloWorldLink.h>

在System_initLinks() 函数中加入HelloWorldLink_init(),System_deInitLinks()
加入HelloWorldLink_deInit()

4.在

ipnc_rdk\ipnc_mcfw\mcfw\interfaces\link_api\system_linkId.h

为helloWorld link在DSPcore一端定义link ids

#defineSYSTEM_LINK_ID_HELLOWORLD_0 DSP_LINK(SYSTEM_LINK_COMMON_LINKS_MAX_ID+4)
(因为提示procId < SYSTEM_PROC_MAX : failed !!!)

#defineSYSTEM_LINK_ID_HELLOWORLD_START (SYSTEM_LINK_ID_HELLOWORLD_0)

#defineSYSTEM_LINK_ID_HELLOWORLD_END (SYSTEM_LINK_ID_HELLOWORLD_0)

#defineSYSTEM_LINK_ID_HELLOWORLD_COUNT (SYSTEM_LINK_ID_ALG_END - \

SYSTEM_LINK_ID_ALG_START)+ 1

在ipnc_rdk\ipnc_mcfw\mcfw\src_bios6\links_common\system\system_priv_common.h

定义任务优先级和栈的大小

#defineHELLOWORLD_LINK_TSK_PRI (2)

#defineHELLOWORLD_LINK_TSK_STACK_SIZE (SYSTEM_DEFAULT_TSK_STACK_SIZE)

在ipnc_rdk\ipnc_mcfw\mcfw\src_linux\mcfw_api\ti_vsys_priv.h

包括头文件

All header filesunder interface folder needs to be included in this file. Include thehelloWorldLink header file here

#include<mcfw/interfaces/link_api/helloWorldLink.h>

在ipnc_rdk\ipnc_mcfw\mcfw\src_bios6\links_c6xdsp\SRC_FILES.MK

Add the helloWorlddirectory to the list of SRCDIR

SRCDIR +=links_c6xdsp/system links_c6xdsp/utils/src \

links_c6xdsp/alg_linklinks_c6xdsp/alg_link/swosd links_c6xdsp/alg_link/scd \

links_c6xdsp/valinks_c6xdsp/helloWorld

SRCS_HELLOWORLD =helloWorldLink_tsk.c helloWorldLink_priv.c

SRCS_c6xdsp +=$(SRCS_SYSTEMDSP) $(SRCS_UTILS) $(SRCS_ALGLINK) $(SRCS_OSDLINK) $(SRCS_SCDLINK)$(SRCS_VALINK)$(SRCS_HELLOWORLD)

8.改动内存:

mcfw\src_bios6\cfg\ti81xx\config_2G.bld.(文件名称相应内存大小)

找到以下代码段,将LINUX_SIZE的大小调小一点分出来给DSP_CODE_SIZE、DSP_DATA_SIZE

/* first 512MB */

LINUX_SIZE                 = 128*MB;

SR1_SIZE                   = 336.5*MB;

SR3_INTRADUCATI_IPC_SIZE   = 124*KB;

VIDEO_M3_CODE_SIZE         = 2.5*MB;

VIDEO_M3_DATA_SIZE         = 12*MB;

DSS_M3_CODE_SIZE           = 1.5*MB;

DSS_M3_DATA_SIZE           = 17*MB;

DSP_CODE_SIZE              = 900*KB;

DSP_DATA_SIZE              = 13.5*MB;

编译中可能遇到的错误:

1.

"/home/dm8168/dvr_rdk/../dvr_rdk/build/dvr_rdk/obj/ti816x-evm/c6xdsp/debug/dvr_rdk_configuro/linker_mod.cmd",line 242: error:

placement fails for object ".switch", size 0x32a (page0). Available

ranges:

DDR3_DSP    size: 0xd80000    unused: 0xc         max hole: 0x4

"/home/dm8168/dvr_rdk/../dvr_rdk/build/dvr_rdk/obj/ti816x-evm/c6xdsp/debug/dvr_rdk_configuro/linker_mod.cmd",line 230: error:

placement fails for object "GROUP_1", size 0x13c (page0). Available

ranges:

DDR3_DSP    size: 0xd80000    unused: 0xc         max hole: 0x4

warning: entry-point symbol other than"_c_int00" specified:

"ti_sysbios_family_c64p_Hwi0"

error: errors encountered during linking;

"/home/dm8168/dvr_rdk/../dvr_rdk/build/dvr_rdk/bin/ti816x-evm/dvr_rdk_c6xdsp

_debug.xe674" not built

make[2]: ***[/home/dm8168/dvr_rdk/../dvr_rdk/build/dvr_rdk/bin/ti816x-evm/dvr_rdk_c6xdsp_debug.xe674]Error 1

make[1]: *** [apps] Error 2

make: *** [dvr_rdk_bios6] Error 2

####

#### [DM816X_ETV] platform build [] ERROR!!!

内存不足,改动内存。

Top level memory requirement for DSP code and data size is done in mcfw\src_bios6\cfg\ti81xx\config_<DDRsize>M.bld. Please refer to appnote on memoryMap for further details on changing
the size of these sections as per your DSP algorithms requirement.

2.

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3VvODExMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" style="border-bottom:medium none; border-left:medium none; max-width:100%; border-top:medium none; border-right:medium none">

须要首先编译内核

3.

參考资料:

DSP Algorithm Integration Guide in IPNC/DVR RDK

声明:本文參考以上资料,文档实在是坑爹。有些细节会有问题,可是还好大体方向是正确的,之前有个同事编过没有整理,我又从头開始。历经一周最终把问题攻克了,以下一篇将介绍chains及怎样在chains中使用alg算法。

ccs:下载链接:

http://www.ti.com.cn/tool/cn/ccstudio

dm8127/8148下怎样进行dsplink的编写的更多相关文章

  1. Linux下的网卡驱动程序的编写过程(转)

    工作需要写了我们公司一块网卡的linux驱动程序.经历一个从无到有的过程,深感技术交流的重要.Linux作为挑战微软垄断的强有力武器,日益受到大家的喜爱.真希望她能在中国迅速成长.把程序文档贴出来,希 ...

  2. windows下Qt Creator5.1.0编写程序以及调用OpenCV库

    系统说明 最近使用opencv编写程序,程序编的差不多就学习使用QT加个界面,首先声明下本人的系统和使用的软件版本, 系统: windows xp QT IDE:QT Creator5.1.0 Ope ...

  3. 在ubuntu下使用visual studio code编写python

    感觉有了visual studio code之后,不管编写什么语言的代码都可以,简单安装对应的语言插件即可. 这不轮到了最近比较热的python语言,蹭着AI的热度,python语言成为了工程师们又一 ...

  4. 单文件夹下的C程序如何编写Makefile文件

    通过学习已经学会了GCC的一些基础的命令,以及如何将C语言源代码编译成可执行文件. 我们已经知道在linux环境下编译源码时,常会有以下三个步骤: ./configure make make clea ...

  5. (12网络化部署深化下)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署

    网络化部署一直是我非常想做的,现在已经基本看到了门路.今天早上实验,发现在手机上的支持也非常好(对于相机的支持还差一点),证明B/S结构的框架是非常有生命力的.下一步就是要将这个过程深化.总结,并且封 ...

  6. (原) windows下autohotkey的快捷键脚本编写

    autohotkey 脚本很强大,可以接受传参.能各种程序逻辑控制.还可以把脚本转换成独立执行的EXE.(安装完后程序目录下有个小程序:Convert .ahk to .exe,直接UI上转换.)总之 ...

  7. 解决Ubuntu下的Eclipse打开Windows编写的java代码的中文乱码

    其实所有的中文乱码 问题都是编码不同所导致的.这里要想让eclipse能正常显示出汉字,就要修改它的字符编码 步骤如下: 1 ,点击菜单栏中的Window(窗口),选择Preferences(首选项) ...

  8. linux下的shell命令的编写,以及java怎样调用linux的shell命令(java怎样获取linux上的网卡的ip信息)

    程序猿都非常懒,你懂的! 近期在开发中,须要用到server的ip和mac信息.可是server是架设在linux系统上的,对于多网口,在获取ip时就产生了非常大的问题.以下是在windows系统上, ...

  9. Java编程语言下Selenium 利用Robot自己编写截屏方法

    import java.awt.Robot; import java.awt.event.KeyEvent; import java.util.concurrent.TimeUnit; import ...

随机推荐

  1. Playrix Codescapes Cup (Codeforces Round #413, rated, Div. 1 + Div. 2) 一夜回到小学生

    我从来没想过自己可以被支配的这么惨,大神讲这个场不容易掉分的啊 A. Carrot Cakes time limit per test 1 second memory limit per test 2 ...

  2. 在windows下安装flex和bison、GCC

    学习Stellar-core 需要依赖项flex .bison .gcc三个依赖项 下载得网址:链接: https://pan.baidu.com/s/1mitCLcs 密码: 3jaj   通过 w ...

  3. 九度oj 题目1108:堆栈的使用

    题目描述: 堆栈是一种基本的数据结构.堆栈具有两种基本操作方式,push 和 pop.Push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出.现在我们就来验证一下堆栈的使用. 输入: 对于每组测 ...

  4. iOS学习笔记13-网络(二)NSURLSession

    在2013年WWDC上苹果揭开了NSURLSession的面纱,将它作为NSURLConnection的继任者.现在使用最广泛的第三方网络框架:AFNetworking.SDWebImage等等都使用 ...

  5. 【bzoj3489】A simple rmq problem 三维KD-tree

    题目描述 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直接输出0.我会 ...

  6. 【Luogu】P3116会议时间(拓扑排序,DP)

    题目链接 本题使用拓扑排序来规划DP顺序.设s[i][j]表示i步是否能走到j这个点,e[i][j]表示i步是否能走到j这个点——用第二条路径.因为要满足无后效性和正确性,只有第i个点已经全部更新完毕 ...

  7. UOJ 34 多项式乘法 ——NTT

    [题目分析] 快速数论变换的模板题目. 与fft的方法类似,只是把复数域中的具有循环性质的单位复数根换成了模意义下的原根. 然后和fft一样写就好了,没有精度误差,但是跑起来比较慢. 这破题目改了好长 ...

  8. 洛谷P2498 [SDOI2012]拯救小云公主 【二分 + 并查集】

    题目 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1 ...

  9. 洛谷P3759 - [TJOI2017]不勤劳的图书管理员

    Portal Description 给出一个\(1..n(n\leq5\times10^4)\)的排列\(\{a_n\}\)和数列\(\{w_n\}(w_i\leq10^5)\),进行\(m(m\l ...

  10. Snmp的学习总结(二)

    一.SNMP简介 SNMP指的是简单网络管理协议.它属于TCP/IP五层协议中的应用层协议.它提供了一种简单和方便的模式来管理网络中的各个元素.这里的元素就是各个被管理的对象,可以是因特网中的某个硬件 ...