0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于IPP跨平台软件库实现嵌入式系统的应用设计

电子设计 来源:科技与创新 作者:叶光丰,杨斌,洪艳 2021-03-16 15:43 次阅读

1 前言

随着信息技术的飞速发展,形式多样的数字化产品已经开始成为继PC机后的信息处理工具,在这种数字化潮流下,嵌入式系统已成为当前研究和应用的热点之一。嵌入式手持设备的视音频多媒体应用也越来越广泛。由于嵌入式系统的应用要求及成本因素决定了嵌入式系统在系统资源, 包括硬件资源和软件资源方面都是非常精简和高效的。因此通过IPP底层API函数实现针对特定处理器的特定关键算法进行程序结构重组和优化,为嵌入式系统低功耗高代码执行效率提供一种很好的解决方案。

2 Intel IPP简介

Intel集成高性能原件(Intel IPP)是一个交叉架构的跨平台软件库,提供了大量库功能,用于多媒体,音频编码,视频编码,计算机视觉密码系统以及此类处理的数学过程。通过一个跨多种架构上的单一API,可以获得平台兼容性,减少开发成本。提升信号,影像,多媒体处理和矢量计算的执行效率。

利用IPP优化的步骤首先是程序结构的重新设计。由于IPP 提供的接口为固定接口,在原程序基础上以IPP函数代替,这意味着需要额外添加变量和步骤,如果程序结构设计不当将在相当程度上抵消使用IPP而带来的增益 。为了避免这种情况,对于原来的程序结构往往不能限于局部的调整,而要围绕利用IPP提供的接口为核心,进行较大规模的调整和安排。

3 基于Linux的系统框架和集成开发环境的搭建

3.1 开发平台的搭建

由于嵌入式系统本身不具有软件开发能力,采用PC+目标机的开发方式,在运行linux2.4.20内核的PC机上为PXA 255板提供开发和交叉编译环境。利用PXA 255板的FF串口作调试口与PC的串口相连,可方便地进行调试工作,利用PXA255板的以太网接口和PC相连,建立点对点的连结,在PC上建立FTP服务器,将应用程序及内核等文件通过以太网接口传到PXA255板上。

3.2 交叉编译环境的建立

要在PC上开发出能运行在PXA255板上的程序,必须在PC上为其建立一个针对ARM芯片的交叉编译环境,为此,将用到交叉编译工具链,包括:交叉编译工具arm-linux-gcc、二进制文件处理工具arm-linux-binutils及链接和运行库arm-linux-blibc。

建立起交叉编译环境后,就可以用此交叉编译器为PXA255板编译其内核和应用程序了。整个开发环境的结构框图如下:

基于IPP跨平台软件库实现嵌入式系统的应用设计

图(1) 开发环境的结构框图

3.3 基于QT/Embedded库的GUI开发环境的建立

为使在通用PC上编译连接的程序能在目标平台PXA255板上运行,必须在开发端PC上安装正确的库文件。QT/E安装包只提供所有QT类和一些辅助工具的源文件,针对目标平台PXA255板,还需要为QT/E库增加触摸屏的库文件,以使基于QT/E的应用程序能正确的接收到触摸屏事件。交叉编译工具使用专门针对Xscale系列arm-linux-gcc来编译。

为了提高程序开发的效率,可以为QT/E安装一个生成Makefile的工具Tmake。用它来生成Makefile文件可以节省很多时间。在Makefile文件中增加QT/E库的路径及用于包含触摸屏库的参数(-lts)之后再make。这样QT/E程序就被正确的编译连接成为在PXA 255板上可执行的文件了。

4 MP3音频播放器图形界面GUI设计与实现

本设计用QTE/QTopia作为应用程序图形界面GUI的类库和桌面开发环境。Qt/Embedded是Trolltech公司开发的面向嵌入式系统的Qt版本。采用framebuffer作为底层图形接口。Qt/Embedded类库完全采用C++封装。丰富的控件资源和较好的可移植性是Qt/Embedded最为优秀的一方面,使用X下的开发工具Qt Designer可以直接开发基于Qt/Embedded的UI(用户操作接口)界面。

鉴于篇幅,本文只给出图形界面的类定义和函数接口说明,其中封装和移植IPP低层API操作的成员函数将在文章第5部分作出相应的解释和描述,播放器类在Qt中定义如下:

class MediaPlayer:public QWidget

{

public:/*构造函数初始化播放器各参数*/

MediaPlayer(QWidget *parent=0,const char *name=0);

public slots: /*Qt中的消息响应槽函数, 定义播放器的各种操作成员函数*/

void fi leopen();

private:

/*播放状态控制、播放器界面控制和GUI插件*/

int stplayer; /* 0:stop 1:play 2:pause*/

QMenuBar *menu;

5 MP3音频解码流程与关键算法移植

5.1 IPP中提供的高效音频处理API介绍

本设计采用了IPP的MP3播放解码过程中的解码相关的高效算法,这样使得MP3播放的任务转向流程控制,而不必编写具体的解码代码。MP3解码函数和功能如下:

(1)ippsUnpackFrameHeader_MP3/ *解包MP3帧头,输出IppMP3FrameHeader结构体*/

(2)ippsUnpackSideInfo_MP3/*解包MP3枝节信息,输出IppMP3SideInfo结构体*/

(3)ippsUnpackScaleFactors_MP3_1u8s/*解包比列因子,输出比列因子的指针等*/

(4)ippsHuffmanDecode_MP3_1u32s/*哈夫曼解码,输出解码后的数据*/

(5)ippsReQuantize_MP3_32s_I/*量化哈夫曼解码后的码字,输出量化后的采样值的指针*/

(6)ippsMDCTInv_MP3_32s,ippsSynthPQMF_MP3_32s16s/*第一、二阶段合成滤波*/

5.2 MP3音频解码流程

为了MP3文件能够连续的播放,需要为原始二进制在内存中建立一个FIFO缓冲区,以保证每个时刻都有足够的数据,这个缓冲区要有足够的大小,当缓冲区数据小于某个值时,就要及时写入新的数据,在程序的主循环中需要有段判FIFO数据情况和填入数据的程序。主数据也需要一个缓冲区,用来存放解码时用到的数据,播放MP3文件的大致流程如下:

5.2 MP3音频解码流程

为了MP3文件能够连续的播放,需要为原始二进制在内存中建立一个FIFO缓冲区,以保证每个时刻都有足够的数据,这个缓冲区要有足够的大小,当缓冲区数据小于某个值时,就要及时写入新的数据,在程序的主循环中需要有段判FIFO数据情况和填入数据的程序。主数据也需要一个缓冲区,用来存放解码时用到的数据,播放MP3文件的大致流程如下:

图(3) MP3音频解码播放器程序流程图

除解码和播放MP3程序外,还需用户控制部分的程序。MP3播放要求实时性很高,所以不能跟用户控制程序放在一起,需要为它创建一个线程。通过Linux下的Pthread线程,它可以共享内存的数据,这使得线程间通信变得方便。MP3播放的代码就可以放到一个线程里面去,通过共享内存数据由主线程来处理用户操作、启动、暂停和结束播放线程序。引入了多线程操作后,使播放器用户界面的各操作(如按纽按下、鼠标点击等)不必等待MP3解码完成而不能得到及时响应。

5.3 MP3音频解码关键算法对IPP关键算法的API移植封装接口

鉴于篇幅关系,不对每一个API移植和具体操作都进行详细阐述,如上所述,IPP最底层的音频解码函数有ippsUnpackFrameHeader_MP3…ippsSynthPQMF_MP3_32s16s等,我们先对上述函数进行第一层移植,形成一批引用更为方便、操作更为简单的API,把这一层的移植操作全都完成在一个MyAudioApi.cpp文件里面,添加到用Qt做图形界面GUI的项目中一起编译。

这使得最上层的QT图形界面应用程序的各个成员函数可以非常方便地调用利用IPP生成的音频播放各种操作的函数接口。这样仍然可以利用IPP的高效算法进行解码优化而且屏蔽了底层IPP API的复杂性。还为以后的二次开发提供便利。自己定义的音频解码各个函数原型如下:

void mp3open(char filename);/*打开MP3文件并创建解码线程*/

void mp3play(void); /*设置ispause共享变量为假,重新进入播放线程循环体*/

void mp3pause(void);/*设置ispause共享变量为真*/

void mp3stop(void); /*设置done共享变量为真,等待播放线程结束*

需要说明的是上述函数完成播放器用户界面中启动音频播放、控制暂停和结束播放功能,通过多线程之间共享内存数据的方式进行线程间的通信,从而在主线程中控制播放线程的暂停和停止。

void *MP3Start(void *arg) /*针对MP3播放线程主函数进行解释和流程分析*/

{ InitMP3Decoder(&D ecoderState,&bs);/*初始化解码器*/

while(!done)/*停止键或者解码未完成之前循环播放解码*/

{ if(!ispause)/*通过判断线程之间的共享变量ispause判断时候有暂停键按下*/

switch( DecodeMP3Frame(&bs,pcm,&DecoderState) )

{/*根据解码函数返回的状态选择下一步操作*/

case MP3_FRAME_COMPLETE:

/*缓冲区中已有足够数据来解码一帧流数据*/

…}}

/*关闭 I/O 音频设备,此MP3文件播放结束*/

}

6 结束语

IPP能够实现底层的交差平台的软件开发,提供高集成的数据通讯,单信号处理以及多媒体功能等,Intel IPP并且能够帮助优化电力消耗,达到最佳的CPU执行效率。其嵌入式的移植应用更是为实现手持设备上的低功耗,高代码执行效率提供了一种可行的软件优化方案。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    447

    文章

    47775

    浏览量

    409076
  • 嵌入式
    +关注

    关注

    4981

    文章

    18278

    浏览量

    288374
  • 接口
    +关注

    关注

    33

    文章

    7637

    浏览量

    148461
收藏 人收藏

    评论

    相关推荐

    RTOS是嵌入式系统软件开发平台

    RTOS是嵌入式系统软件开发平台RTOS最关键的部分是实时多任务内核,它的基本功能包括任务管理、定时器管理、存储器管理、资源管理、事件管理、系统
    发表于 08-12 14:32

    【长沙】---【威胜集团】嵌入式软件工程师招聘

    嵌入式软件工程师职位描述:从事终端产品的嵌入式系统软件设计与开发工作。任职要求:1、 能熟练使用C/C++编程语言,具备嵌入式
    发表于 11-08 16:53

    汽车电子嵌入式软件编程接口设计

    电控系统嵌入式软件平台就是面向汽车电子,遵循OSEK标准,应用于汽车动力总成控制的系统平台
    发表于 12-11 11:03

    采用构件技术实现嵌入式系统复用软件设计

    的思想,将整个嵌入式实时多任务操作系统设计成一个系统级的软件构件。这样不但实现
    发表于 05-07 07:00

    基于嵌入式系统硬件平台软件PLC实现设计

    1嵌入式软PLC的总体结构 嵌入式软PLC与嵌入式系统共享一个CPU,PLC和嵌入式系统之间没有
    发表于 06-19 06:20

    如何选择嵌入式系统的GUI

    ` 本帖最后由 idea4good 于 2019-7-9 19:40 编辑 嵌入式系统由于软硬件资源的差异性,往往在选择GUI时,打伤脑筋;或许有些开发者认为,直接选择Qt就可以了,但实践证明
    发表于 07-04 22:16

    采用嵌入式系统实现手机编程开发平台

    了移动终端、嵌入式系统、数字信号处理以及通信协议设置等多项技术。手机编程开发平台是集合了通信技术、嵌入式技术、电子技术、软件工程、操作
    发表于 07-22 06:13

    嵌入式掌上娱乐系统实现原理是什么?

    嵌入式游戏,增加了系统的娱乐性。使用触摸屏方便作为人机交互的平台。采用平台性能良好的Qt4 设计了应用程序和人机界面,界面友好,汉化显示,
    发表于 08-19 06:27

    嵌入式系统手机编程开发平台实现什么功能?

    通信协议设置等多项技术。手机编程开发平台是集合了通信技术、嵌入式技术、电子技术、软件工程、操作系统等理论的软硬件的教学与研究开发平台。在这个
    发表于 09-17 06:23

    使用Java平台怎么实现可编程嵌入式系统

    传统的嵌入式产品只能实现某种特定的功能,不能满足用户可变的丰富多彩的应用需求。为解决这个问题,本文设计并实现了一种使用Java作为软件平台
    发表于 03-25 06:30

    嵌入式系统软件部分

      嵌入式系统软件组成如下:  (1)高端嵌入式系统软件组成  1)应用程序  2)应用程序接口函数
    发表于 06-20 15:51

    怎么实现基于IPP嵌入式音频解码器的设计?

    基于Linux的系统框架和集成开发环境怎么搭建?怎么实现基于IPP嵌入式音频解码器的设计?
    发表于 06-04 07:03

    如何构建嵌入式系统平台

    我对嵌入式系统平台的定义很简单:能让电子产品的原因程序得以顺利开发的环境,主要包括;系统软件与驱动程序硬件平台开发环境(compiler、调
    发表于 12-17 06:07

    平台嵌入式数据EffiProz介绍

    EffiProz:面向.NET程序员的平台嵌入式数据 EffiProz:面向.NET程序员的平台
    发表于 12-21 06:00

    嵌入式网络编程+嵌入式Linux系统

    D2.25嵌入式网络编程+嵌入式Linux系统一、Linux操作系统安装与使用(命令)二、Linux开发工具(gcc、gdb、make)三、Linux
    发表于 12-22 07:10