使用CodecEngine的API函数(四)
发表时间:2020-10-19
发布人:葵宇科技
浏览次数:56
本文翻译自TI的手册,该手册是进修GPP+DSP开辟的金典文档,欲望对各位入门有所赞助,有懂得欠妥之处望请赐教。
Codec Engine Application Developer User's Guide.pdf (Literature Number: SPRUE67D)
《Codec Engine 应用开辟应用手册》 http://blog.csdn.net/dyzok88/article/details/42154487
《第一章 Codec Engine 概要》 http://blog.csdn.net/dyzok88/article/details/42214813
《第二章 Codec Engine 安装和设置》 http://blog.csdn.net/dyzok88/article/details/42278109
《第三章 应用 Codec Engine 的示例应用法度榜样》http://blog.csdn.net/dyzok88/article/details/42302793
// 正文
在双 CPU 的体系中,被设备的引擎“长途”运行(在 DSP 中)算法,透明地应用一个“DSP办事器”。DSP 的办事器是一个集成算法及其框架的可履行法度榜样(例如,DSP/BIOS,框架组件,编解码器,和 DSP Link 驱动法度榜样),当引擎被打开时,这些组件将在 DSP 上被加载并开端运行。
办事器 API 函数能被在 GPP 上运行的应用法度榜样调用,可以拜访有关DSP的办事器的信息,并控制DSP办事器。更具体地说,这些 API 函数许可 GPP 应用法度榜样获取有关 DSP 办事器中设备的内存堆数量,一个零丁的内存堆的当前应用状况等信息。以及从新设备 DSP 办事器的算法堆的基址和大年夜小。
涉及到办事器的 API 函数是:
1. Engine_getServer(). 获得办事器的句柄。
2. Server_getNumMemSegs(). 获得在一个办事器中的堆数。
3. Server_getMemStat(). 获取有关办事器的堆统计信息。
4. Server_redefineHeap(). 设置办事器堆的基址和大年夜小。
5. Server_restoreHeap(). 重置办事器堆到默认基址和大年夜小。
要拜访 DSP 办事器的引擎,GPP 应用法度榜样必须经由过程调用 Engine_getServer() API 起首获得一个办事器句柄,例如:
注:引擎句柄,办事器句柄都不是线程保护。每个线程应用办事器句柄必须履行本身的 Engine_getServer() 调用(应用本身的引擎句柄),或包管共享办事器句柄的同步拜访的。
如不雅 Engine_getServer() 返回值是 NULL,那么引擎没有办事器。
GPP 应用法度榜样可以经由过程调用 Server_getNumMemSegs() 函数,获得设备到DSP办事器中内存堆的数量,例如:
这些 API 函数返回以下缺点的代码:
1. Server_EOK - 成功。在这种情况下, numSegs 包含 DSP 办事器中的堆数。
2. Server_ERUNTIME - 产生内部运行时缺点。
一旦堆的数量是已知的,GPP 应用法度榜样应用 Server_getMemStat() 函数,然后可以经由过程此数迭代,获得每个堆统计信息。内存统计数据返回到 Server_MemStat 构造体:
下面的示例代码显示了这些 API 函数的用法(为了可读性,忽视缺点检查)
Server_getMemStat() 的返回值如下:
1. Server_EOK. 成功。
2. Server_ENOTFOUND. 段号超出范围。
3. Server_ERUNTIME. 产生内部运行时缺点。
DSP 办事器可以被设备为专门用于算法堆的内存段。在某些情况下,DSP 办事器被设备小算法堆,GPP 应用法度榜样在运行时,可能须要为算法堆供给较大年夜的,被 DSP 办事器应用的持续内存块。然后,当堆不被 DSP 应用时,该内存可以大年夜 DSP 收受接收,进而被 GPP 应用。下面的办事器 API 函数供给了从新设备 DSP 算法堆的手段:
传递给这些函数的参数" name "是要从新设备堆的名称;它必须不大年夜于 Server_MAXSEGNAMELENGTH 字符长。传递给 Server_redefineHeap() 的" base "地址,必须为DSP的地址,大年夜 base 到 base + size 的内存必须是持续的物理内存。参数" size "在 DSP MADUs(minimum addressable data units,可寻址的最小数据单位)中给出的。基址应为8字节对齐,但对大年夜小没有对齐限制;大年夜小的值为 0 是可接收的。
当堆膳绫腔有内存被当前分派时,在 DSP 算法堆只能被从新设备。 Server_restoreHeap() 函数重置算法堆的基地址和大年夜小,回到它们的原始值(任何调用 Server_redefineHeap() 之前的值)。成功调用 Server_restoreHeap() 后,内存先前的“从新定义”到堆,可被该体系再次应用。
Server_redefineHeap() 的返回值如下:
1. Server_EOK. 成功。
2. Server_EINVAL. 改变到新的基地址和大年夜小导致与另一堆重叠。
3. Server_EINUSE. 内存被当前分派在算法堆。
4. Server_ENOTFOUND. 没有发明给定的名称的堆。
5. Server_ERUNTIME. 产生内部运行时缺点。
Server_restoreHeap() 返回下列任何的值:
1. Server_EOK. 成功。
2. Server_EINVAL. 改变到新的基地址和大年夜小导致与另一堆重叠。
3. Server_EINUSE. 内存被当前分派在算法堆。
4. Server_ENOTFOUND. 没有发明给定的名称的堆。
5. Server_ERUNTIME. 产生内部运行时缺点。
下面的代码解释,这两个 API 若何可以在 DM644x (一个 GPP+DSP 器件)上应用,在这个示例中,GPP 应用法度榜样应用 Memory_contigAlloc() 函数分派一个持续的内存块。然而,经由过程此函数返回的地址是对 GPP 的虚拟地址,是以必须将其传递到 Server_redefineHeap() 前转换到 DSP 地址,Memory_getBufferPhysicalAddress() 函数可以将虚拟地址转换为 GPP 的物理地址,如许在 DM644x 的的情况下,就是雷同的 DSP 的地址。
算法运行后,该算法堆被复位到其本来的大年夜小和地位,为了更好的可读性,缺点检查被省略。
在其他情况下,应用法度榜样可能须要从新设备算法堆到一个地址,在 ARM 上分派缓冲区不克不及获得该地址。例如,假设在 DSP 上有固定的内存空间,该空间给应用法度榜样用于算法堆之间的瓜代,取决运行什么算法。在这种情况下,应用法度榜样可以直接传递 DSP 的地址给 Server_redefineHeap() 函数。
Codec Engine Application Developer User's Guide.pdf (Literature Number: SPRUE67D)
《Codec Engine 应用开辟应用手册》 http://blog.csdn.net/dyzok88/article/details/42154487
《第一章 Codec Engine 概要》 http://blog.csdn.net/dyzok88/article/details/42214813
《第二章 Codec Engine 安装和设置》 http://blog.csdn.net/dyzok88/article/details/42278109
《第三章 应用 Codec Engine 的示例应用法度榜样》http://blog.csdn.net/dyzok88/article/details/42302793
// 正文
4.4 Codec 办事器 API 函数
在双 CPU 的体系中,被设备的引擎“长途”运行(在 DSP 中)算法,透明地应用一个“DSP办事器”。DSP 的办事器是一个集成算法及其框架的可履行法度榜样(例如,DSP/BIOS,框架组件,编解码器,和 DSP Link 驱动法度榜样),当引擎被打开时,这些组件将在 DSP 上被加载并开端运行。
办事器 API 函数能被在 GPP 上运行的应用法度榜样调用,可以拜访有关DSP的办事器的信息,并控制DSP办事器。更具体地说,这些 API 函数许可 GPP 应用法度榜样获取有关 DSP 办事器中设备的内存堆数量,一个零丁的内存堆的当前应用状况等信息。以及从新设备 DSP 办事器的算法堆的基址和大年夜小。
涉及到办事器的 API 函数是:
1. Engine_getServer(). 获得办事器的句柄。
2. Server_getNumMemSegs(). 获得在一个办事器中的堆数。
3. Server_getMemStat(). 获取有关办事器的堆统计信息。
4. Server_redefineHeap(). 设置办事器堆的基址和大年夜小。
5. Server_restoreHeap(). 重置办事器堆到默认基址和大年夜小。
4.4.1 获取办事器句柄
要拜访 DSP 办事器的引擎,GPP 应用法度榜样必须经由过程调用 Engine_getServer() API 起首获得一个办事器句柄,例如:
static String engineName = "auddec"; Engine_Handle engine; Server_Handle server; Engine_Error err; engine = Engine_open(engineName, NULL, &err); server = Engine_getServer(engine);
注:引擎句柄,办事器句柄都不是线程保护。每个线程应用办事器句柄必须履行本身的 Engine_getServer() 调用(应用本身的引擎句柄),或包管共享办事器句柄的同步拜访的。
如不雅 Engine_getServer() 返回值是 NULL,那么引擎没有办事器。
4.4.2 获取内存堆信息
GPP 应用法度榜样可以经由过程调用 Server_getNumMemSegs() 函数,获得设备到DSP办事器中内存堆的数量,例如:
Server_Handle server; Server_Status status; Int numSegs; /* Get the server handle from a previously opened Engine */ server = Engine_getServer(engine); status = Server_getNumMemSegs(server, &numSegs);
这些 API 函数返回以下缺点的代码:
1. Server_EOK - 成功。在这种情况下, numSegs 包含 DSP 办事器中的堆数。
2. Server_ERUNTIME - 产生内部运行时缺点。
一旦堆的数量是已知的,GPP 应用法度榜样应用 Server_getMemStat() 函数,然后可以经由过程此数迭代,获得每个堆统计信息。内存统计数据返回到 Server_MemStat 构造体:
typedef struct Server_MemStat { Char name[Server_MAXSEGNAMELENTH+1]; /* Name of heap segment */ Uint32 base; /* Base address of heap */ Uint32 size; /* Original heap size */ Uint32 used; /* DSP MAUs of heap used */ Uint32 maxBlockLen; /* Length of largest free block */ } Server_MemStat;
下面的示例代码显示了这些 API 函数的用法(为了可读性,忽视缺点检查)
Server_Handle server; Int numSegs, i; Server_MemStat stat; Server_Status status; status = Server_getNumMemSegs(server, &numSegs); for (i = 0; i < numSegs; i++) { status = Server_getMemStat(server, i, &stat); printf("%s: base: 0x%x size: 0x%x used: 0x%x max free block: 0x%x", stat.name, stat.base, stat.size, stat.used, stat.maxBlockLen); }
Server_getMemStat() 的返回值如下:
1. Server_EOK. 成功。
2. Server_ENOTFOUND. 段号超出范围。
3. Server_ERUNTIME. 产生内部运行时缺点。
4.4.3 从新设备DSP办事器的算法堆
DSP 办事器可以被设备为专门用于算法堆的内存段。在某些情况下,DSP 办事器被设备小算法堆,GPP 应用法度榜样在运行时,可能须要为算法堆供给较大年夜的,被 DSP 办事器应用的持续内存块。然后,当堆不被 DSP 应用时,该内存可以大年夜 DSP 收受接收,进而被 GPP 应用。下面的办事器 API 函数供给了从新设备 DSP 算法堆的手段:
Server_Status Server_redefineHeap(Server_Handle server, String name, Uint32 base, Uint32 size); Server_Status Server_restoreHeap(Server_Handle server, String name);
传递给这些函数的参数" name "是要从新设备堆的名称;它必须不大年夜于 Server_MAXSEGNAMELENGTH 字符长。传递给 Server_redefineHeap() 的" base "地址,必须为DSP的地址,大年夜 base 到 base + size 的内存必须是持续的物理内存。参数" size "在 DSP MADUs(minimum addressable data units,可寻址的最小数据单位)中给出的。基址应为8字节对齐,但对大年夜小没有对齐限制;大年夜小的值为 0 是可接收的。
当堆膳绫腔有内存被当前分派时,在 DSP 算法堆只能被从新设备。 Server_restoreHeap() 函数重置算法堆的基地址和大年夜小,回到它们的原始值(任何调用 Server_redefineHeap() 之前的值)。成功调用 Server_restoreHeap() 后,内存先前的“从新定义”到堆,可被该体系再次应用。
Server_redefineHeap() 的返回值如下:
1. Server_EOK. 成功。
2. Server_EINVAL. 改变到新的基地址和大年夜小导致与另一堆重叠。
3. Server_EINUSE. 内存被当前分派在算法堆。
4. Server_ENOTFOUND. 没有发明给定的名称的堆。
5. Server_ERUNTIME. 产生内部运行时缺点。
Server_restoreHeap() 返回下列任何的值:
1. Server_EOK. 成功。
2. Server_EINVAL. 改变到新的基地址和大年夜小导致与另一堆重叠。
3. Server_EINUSE. 内存被当前分派在算法堆。
4. Server_ENOTFOUND. 没有发明给定的名称的堆。
5. Server_ERUNTIME. 产生内部运行时缺点。
下面的代码解释,这两个 API 若何可以在 DM644x (一个 GPP+DSP 器件)上应用,在这个示例中,GPP 应用法度榜样应用 Memory_contigAlloc() 函数分派一个持续的内存块。然而,经由过程此函数返回的地址是对 GPP 的虚拟地址,是以必须将其传递到 Server_redefineHeap() 前转换到 DSP 地址,Memory_getBufferPhysicalAddress() 函数可以将虚拟地址转换为 GPP 的物理地址,如许在 DM644x 的的情况下,就是雷同的 DSP 的地址。
算法运行后,该算法堆被复位到其本来的大年夜小和地位,为了更好的可读性,缺点检查被省略。
Server_Handle server = NULL; Server_Status status; Engine_Handle ce = NULL; XDAS_Int8 *buf; Uint32 base; String decoderName = "auddec_copy"; String encoderName = "audenc_copy"; String engineName = "audio_copy"; /* Open the Engine and get Server handle. Note, the * Engine_open() call will load and start the DSP. */ ce = Engine_open(engineName, NULL, NULL); server = Engine_getServer(ce); /* Allocate block of memory, contiguous in physical memory */ buf = (XDAS_Int8 *)Memory_contigAlloc(BUFSIZE, ALIGNMENT); /* Convert virtual address to physical address, which on * DM644x, happens to be the same as the DSP address. */ base = Memory_getBufferPhysicalAddress(buf, BUFSIZE, NULL); /* Reconfigure the algorithm heap */ status = Server_redefineHeap(server, "DDRALGHEAP", base, BUFSIZE); 'Create and run codecs' 'Delete codecs' /* Reconfigure algorithm heap back to its original state. */ status = Server_restoreHeap(server, "DDRALGHEAP"); /* Free the buffer */ Memory_contigFree(buf, BUFSIZE);
在其他情况下,应用法度榜样可能须要从新设备算法堆到一个地址,在 ARM 上分派缓冲区不克不及获得该地址。例如,假设在 DSP 上有固定的内存空间,该空间给应用法度榜样用于算法堆之间的瓜代,取决运行什么算法。在这种情况下,应用法度榜样可以直接传递 DSP 的地址给 Server_redefineHeap() 函数。