第14节 image_processing例程
14.1节 代码与资料
- 代码位置:C:\ti\mcsdk_2_01_02_06\demos\image_processing
- 主要参考例程:image_processing_evmc6678l_master和image_processing_evmc6678l_slave
- 参考资料:
C:\ti\mcsdk_2_01_02_06\demos\image_processing\docs\image_processing_demonstration_release_notes.html
https://processors.wiki.ti.com/index.php/MCSDK_Image_Processing_Demonstration_Guide
XDC使用方法参考文档:CCS help文档 很详细
http://rtsc.eclipseprojects.io/docs-tip/XDCtools_User%27s_Guide
通过XDC包含的软件包版本号,在ti安装目录下查找安装包位置,最终确定调用函数的c文件
Building an OpenMP Application
http://downloads.ti.com/mctools/esd/docs/openmp-dsp/building_openmp_app.html#using-ccs
14.2节 工程介绍
主要是以此例程学习共享内存方式IPC核间通讯机制。例程包括master和slave两个工程, 其中master烧写到core0,slave烧写到core1—7中。
14.3节 工程编译
14.3.1 编译通过组件版本
- master工程编译通过组件版本:
/*
* CCSv7 IDE
* 7.4
* 编译通过组件:
* 依赖组件版本为
* - XDCTools 3.23.4.60 *
* - IMGLIB C66X 3.1.1.0 *
* - IPC 1.24.3.32
* - MCSDK 2.1.2.6 *
* - MCSDK PDK TMS320C6678 1.1.2.6 *
* - NDK 2.21.2.43 *
* - SYS/BIOS 6.33.6.50 *
* - UIA 1.0.3.25
*/
- salve工程编译通过组件版本:
/*
* CCSv7 IDE
* 7.4
* 编译通过组件:
* 依赖组件版本为
* - XDCTools 3.23.4.60 *
* - IMGLIB C66X 3.1.1.0 *
* - IPC 1.24.3.32
* - MCSDK 2.1.2.6 *
* - MCSDK PDK TMS320C6678 1.1.2.6 *
* - SYS/BIOS 6.33.6.50 *
* - UIA 1.0.3.25
*/
14.3.2 cfg文件修改
增加BIOS代码由工程自动生成:
14.3.3 编译中遇到的问题与解决
image工程编译了好久才编译通过,其主要原因是因为各种包的版本问题,master与slave我编译通过的版本如上文所述(个组件其他版本也会编译通过,我并没有去验证),现总结一下以上版本确定的由来:
- 最初编译出现的最多问题如下,后来分析是ti.sdo.utils组件与XDCtool冲突,ti.sdo.utils在ipc组件中,于是从ipc组件入手,先参看了ipc组件的版本,TI提供的3.0以上的IPC版本增加了linux的支持,此处没有使用到,所以选择了IPC 1.25.03.15版本,根据IPC版本,随之XDCtool与BIOS版本相继大致确定。
- 接着出现一下内容,感觉是UIA组件问题,于是更换了UIA组件较低的版本为1.0.3.25,UIA组件依赖关系如下
- 后来发现IPC 1.24.3.32也可以编译通过
- 最后更换组件版本后,请rebuild整个工程
14.4节 代码修改
- 电脑ip地址设置为192.168.2.101,开发板地址为:192.168.2.100
- 代码在创龙开发板上跑,网络需要修改才可以跑通:
① 修改SGMII时钟
C:\ti\pdk_C6678_1_1_2_6\packages\ti\platform\evmc6678l\platform_lib\src\evmc6678_phy.c
② 将DHCP去掉,使用静态IP方式
- 代码在公司板卡上跑,网络修改代码主要是网络桥片5396和Emac0的支持,下文网络例程中有详细介绍。
14.5节 工程分析
例程包括master和slave两个工程, 其中master烧写到core0,slave烧写到core1—7中。
14.5.1 程序循环处理逻辑
程序处理逻辑如下:
- 主核(core0):
1、主核工程通过cfg配置文件,创建master_main和slave_main两个task。(cfg配置文件学习可以参考创龙出版的BIOS视频与BIOS中文手册)
2、master_main中初始化NDK网络,创建web服务,初始化MessageQ相关部件等
3、web服务接收到的网页发送来的图片信息后,主核打开从核创建的8个MessageQ,填充MessageQ结构体信息(将图片数据分成8份,发给8个从核),然后将MessageQ发送到从核(core1---7)。
4、主核等待从核处理完图片数据的MessageQ,当收到从核发来的MessageQ后将8个处理完的图片数据组合,然后在通过NDK发到网页上。
- 从核(core1---7):
1、主核工程通过cfg配置文件,创建slave_main一个task。
2、slave_main处理逻辑简单:启动后一直等待主核发送的MessageQ,收到后,处理部分图片数据,处理完成后,发送MessageQ通知主核。完成。
14.5.2 程序MessageQ相关分析
- 参考:16.4.2 MessageQ原理与代码
14.6节 工程实验结果
- 串口打印信息:
- 网页界面(在浏览器直接输入板卡IP地址即可192.168.2.100)
14.7节 image_processing其他例程
14.7.1 image_processing_openmp_evmc6678l
- 编译通过组件:
/*
* CCSv7 IDE
* 7.4
* 编译通过组件:
* 依赖组件版本为
* - XDCTools 3.23.4.60 *
* - IMGLIB C66X 3.1.1.0 *
* - IPC 1.24.3.32
* - NDK 2.21.2.43 *
* - SYS/BIOS 6.33.6.50 *
* - MCSDK 2.1.2.6 *
* - MCSDK PDK TMS320C6678 1.1.2.6 *
* - OpenMP BIOS runtime lib 1.1.3.02
* - UIA 1.0.3.25
*/
image_processing_openmp_evmc6678l例程分析:
- 该例程使用了openMP模式实现多核处理,对openMP方式并没有做过多深入研究,简单记录一下感想:感觉openMP多核机制是由编译器特定指令实现的,软件并不用关心多核通讯。
- 程序处理逻辑:
1、程序启动后,创建网络task,main函数等待master_mbox_receive信号量。
2、在网络task中开启HTTP服务,(PC机通过网页登录到开发板,然后在网页上选择图片路径,点击preocess按钮,)开发板解析到图片数据后,发送master_mbox_receive信号量,然后等待master_mbox_send。
3、main程序收到master_mbox_receive信号后,对图像数据进行处理,(处理代码通过特定编译指令,实现了8核处理)处理完后发送master_mbox_send。
4、http进程收到master_mbox_send后,将处理后的数据发送到网页上。
- 程序进程间的通讯使用了BIOS系统内部的邮箱机制
- 多核处理代码如下:
14.7.2 image_processing_serial_simc6678
- 该工程最简单:与简单单片机编程思想一致,采用标准文件读写的形式实现bmp文件的输入与输出,处理流程为:读取bmp文件---处理bmp数据---输出bmp文件---完成。
- 通过该工程可以学习bmp图片数据处理算法。
- 代码不再详细分析。
14.8节 创龙tl-image-processing例程
- 创龙image例程也是对TI的image例程进行了整理,但核心思想还是TI的image思想,代码不再详细分析。