1.TIOVX 源码学习: openvx理解
2.TDA4与Openvx技术开发示例
3.基于ZIGBEE无线温度采集系统的采集采集设计
4.长文分享丨TI AM5718的PRU开发详解
5.flash论文和原文件
6.Code Composer Studio安装与使用
TIOVX 源码学习: openvx理解
学习TIOVX源码的关键在于理解其原理和实际应用。首先,源码源码需要参考专业资源了解OpenVX和TIOVX的采集采集基本概念。OpenVX是源码源码一种基于硬件抽象层的图像处理框架,其目的采集采集在于在不同硬件平台上提供统一的API接口,而TIOVX则是源码源码外卖跑腿 源码对OpenVX标准的实现,特别强调在DSP上的采集采集自定义开发。
在TIOVX中,源码源码用户可以利用User Kernel扩展OpenVX的采集采集功能,但仅限于CPU环境。源码源码为了弥补这一限制,采集采集TIOVX引入了Target Kernel概念,源码源码允许用户在DSP上进行自定义开发,采集采集从而提升特定任务的源码源码性能。
理解TIOVX源码时,采集采集可以从官网教程出发,通过官方提供的示例来掌握Target Kernel和User Kernel的编写、调度及生命周期管理。这包括在AddUserKernel中指定运行前、运行时和运行结束后执行的函数。
在实际应用中,TIOVX与OpenCV类似,都专注于图像处理,涉及上下文(Context)、图(Graph)和节点(Node)等概念。了解AppObj结构体,有助于更深入地理解TIOVX的内部运作。AppObj包含运行各阶段所需的变量,如TIDLObj用于管理网络参数、ImgMosaicObj用于图像参数、DisplayObj用于显示参数、ScalerObj用于图像列表相关变量。
为了更高效地学习和应用TIOVX,建议从TI官方提供的例子出发,详细阅读文档,理解结构体嵌套关系,以便在具体项目中调用API时更加得心应手。通过这些步骤,可以逐步掌握TIOVX源码的核心内容及其在实际项目中的应用。
TDA4与Openvx技术开发示例
在TDA4平台上进行FFmpeg和Openvx技术的开发,本文将展示一个基于TI TDA4 JE的ARM移植过程,主要针对RTMP推流工作。
首先,从下载源码开始。博主选择的X源码和ffmpeg源码版本分别是download.videolan.org的最新版本。准备工作包括将文件拷贝到开发板上,使用内建gcc编译,以简化步骤。在~/ffmpeg目录下,通过scp命令上传源码。pstools工具源码
接着,进行x的配置、编译和安装,设置编译器参数后进行make操作。然后转向ffmpeg,需确保系统时间同步,配置时指明与x库的路径关系。编译ffmpeg的过程较长,耐心等待。
实战环节,展示了RTSP流推流到RTMP服务器的命令,以及RTSP流的保存和USB摄像头流的采集和推流示例。使用ffmpeg进行RTMP推流时,需要注意设备名和参数调整。
移植过程中,一个重要节点是img_mosaic_module,它负责将多个图像整合到一个大图中进行显示。通过在TDA4的app_usb_disp_templete基础模板上进行修改,实现图像镶嵌功能。这个过程涉及到创建和运行图(Graph),并调整源文件和头文件的引用。
移植完成后,工程资源可通过链接下载,同时推荐使用在线云笔记Notion作为工具,以便于记录和分享开发过程。
基于ZIGBEE无线温度采集系统的设计
我本科的毕业设计也是做ZigBee的,实现一个果园环境监控系统。我讲讲我做这个毕业设计的基本思路和学习方向,希望对题主有帮助。
1、硬件
对ZigBee协议有基本了解的都知道,它只是一种协议,类似于TCP/IP协议,很多嵌入式平台(如ARM、Linux等)都可以实现。比较主流的用于构建ZigBee拓扑网络的嵌入式平台是CC/系列单片机,它们是TI公司专门设计用于搭建ZigBee网络的芯片,内置强大的ZigBee协议栈支持。CC/基于C开发的,所以片上资源和接口和C/C系列单片机类似,学懂了单片机,学这个也很简单了。
所以要搭建ZigBee网络,首先要搞懂CC/的硬件资源(只做APP层基本可以不用深入理解指令集)。从最小系统入手,电源电路、晶振电路、复位电路等,以及一些嵌入式基本通信协议,补码FCH源码如iic、spi、RS/等,还有AD/DA模块,这个用于温度传感器(模拟的)数据采集。
2、软件
ZigBee协议栈的底层都是TI公司已经设计好了的,自组网、网络拓扑、路由、发送/接收数据包等,这些网络操作都封装好并提供给用户编程接口,直接在APP层调用就行,若只做简单开发无需深入了解物理层和链路层,只要通过开发文档把这些需要用到的编程接口弄明白(类似于C语言的封装库,只管调用,不管实现)。
还有就是传感器编程(如题中所述的温度传感器),这种传感器市面上太常见了,基本都是通过iic或者其他通信协议直接读数字信号,连数模转换都不需要,源代码网上都一搜一大堆,直接拿过来用就行,稍微调一下接口和时序什么的。
3、网络拓扑
由于底层自组网的特性,我们只要简单地了解组网、路由、鉴权、发/收包等基本内容(应付答辩啊),因为底层的封装实现……你想看都看不到,只能通过官方文档大概知道它是怎么处理的。除了APP层,其他的交给协议栈来做吧。
长文分享丨TI AM的PRU开发详解
揭示TI AM PRU开发的深度解析 在TI AM这款强大的SoC中,PRU-ICSS单元发挥着关键作用,通过实时定制实现产品差异化。PRUSS是一个独特的位RISC处理器,配备专属内存,直接连接到L3_MAIN总线,ARM和DSP等其他模块也可通过它进行高效通信。每一块PRU拥有位互连,KB指令RAM,8KB数据RAM和B共享内存,数据RAM通过映射地址供其他模块访问。 PRU-ICSS的基石组件 PRU-ICSS包括两个部分,icss1和icss2,它们分别具备电源域实例化、主控和配置端口,放心溯源码中断控制器,以及本地时钟管理等实用功能。其中,内存映射如下:1.1 独立指令空间(0x-0xFFF)
1.2 8KB数据RAM(0x-0xFF,其他模块可访问)
1.3 全局地址空间:PRU_ICSS1位于0x4B2A,PRU_ICSS2位于0x4BE
外部模块通过L3_MAIN总线的全局地址访问PRU资源,实现无缝交互。 关键寄存器详解 PRU寄存器世界中,控制和状态至关重要。例如:PRU_CONTROL:掌控PRU的运行模式和状态。
PRU_STATUS:程序指针寄存器,实时反映PRU运行进度。
WAKEUP_EN:通过设置R位和相应的唤醒信号,唤醒沉睡的PRU。
CYCLECNT:以PRU时钟周期计数,COUNTENABLE和CONTROL指令起决定作用。
STALLCNT:记录PRU执行指令时的暂停计数。
PRUSS_DBG_GPREG:调试通用寄存器,对应R0-R,用于深入了解PRU工作。
R事件/状态寄存器:读写操作各异,用于触发中断输出,执行特定功能。
R通用输出寄存器:连接到PRU的外部接口,输出数据。
PRU中断控制器:支持个系统事件和个中断通道,高效管理中断流程。
中断映射:通过PRUSS_INTC_CMR和PRUSS_INTC_HMR进行通道和事件的配置。
深入探索,飞凌嵌入式OK开发板提供了丰富的实例源码,如7.4和7.5节的官方文档和飞凌示例程序,助您快速上手。 软件调试实战 想要驾驭PRU,你需要强大的调试工具。使用XDSV2 USBJTAG仿真器,通过飞凌调试适配板连接JTAG接口,为你的PRU代码保驾护航。在CCS仿真器中,你可以进行如下操作:全速运行或暂停程序
单步执行,选择进入或跳过函数
汇编级别单步跟踪
监控变量和寄存器值,通过Watch Expression进行实时查看
当进入调试模式,你可以观察到GPIO值变化,以及R寄存器的实时更新。这样,每一次调试步骤都将揭示PRU运行的奥秘。 深入了解更多详情,请参考[1],探索PRU在AM中的无限可能。AMx Technical Reference Manual
flash论文和原文件
摘要:在深入分析TI为开发DSP提供的运行jmeter源码RTS.LIB(RTS.SRC为源泉代码)的基础上,介绍对自定义的文件和设备的操作方法;设计一个简易的Flash文件系统,极大地方便了应用编程。
关键词:DSP CC/CCS Flash 文件系统
1 概述
在开发DSP的应用程序过程中,经常需要处理一些数据文件。这些数据文件可以是实际采集到的数据集合,也可以是用模拟仿真软件产生的数据集合,一般是以文件的形式存放在主机磁盘上的。一般的开发环境(如TI的CCS和CC)都提供了ANSI C标准操作文件格式,如打开一个文件fopen("盘符:\路径\文件名",“打开模式”)。嵌入式系统一般都外挂Flash。我们希望能够和读写主机磁盘文件一样操作Flash读写时序等问题,使应用编程人员可以把精力用在解决实际应用问题上,从而提供一个良好的编程接口。同时,在需要键盘、串口等设备的系统中,也希望提供一个简易的API接口,如从键盘得到一个键,只需作如下操作,在执行fopen("keyboard","读")后,就可以用fread函数读入一个字符。
结合TI公司提供的DSP开发环境CC/CCS(CC针对3X系列,CCS针对5X和6X系列)和实际开发经验,提供上述问题的解决方案,并成功应用到我们的产品中。
2 CC/CCS文件操作机制
TI公司为其TMSC3X系列DSP提供了一个开发环境Code Composer,配套的C语言编译器提供了文件的标准操作。在调试(debug)环境下,对主机(host)硬盘文件的操作是通过标准的ANSI文件操作格式与主机的通信来完成的。ANSI C I/O操作分为三个等级—high level、low level和Device level。在High level中,标准接口是Fopen和Fwrite等函数;而Low level中是Open和Write等函数。这三个等级功能用三个表来实现—文件表、流表(实质就是内存缓冲区索引)和设备表。文件的打开和关闭等基本属性在文件表中反应。当打开一个文件时,文件表中便相应增加一个描述该文件的信息单元;同样,关闭一个文件时,该文件的信息单元从文件表中被删除。流表提供了对文件的缓冲操作处理,缓冲区位置和大小等均在流表中记录。一个文件对应一个流,即缓冲区。对文件的读写就是对缓冲区的读写。当缓冲区填满时,再一次性写入Flash等设备中,避免了对Flash的频繁操作,延长了Flash的使用寿命。设备包括Flash、硬盘、键盘等在设备表中体现。多个流可以对应一个设备,例如在Flash中可以打开多个文件,但是一个设备不能对应多个流。流操作和设备操作是紧密联系在一起的。当打开一个文件时,同时给出了该文件在什么设备上操作,再分配一个流。以后对该文件的操作通过流对应的具体设备的驱动函数来完成。主机的target任何外设都可被加入进去成为设备表的成员之一。
Code Composer对HOST磁盘文件的操作最终是通过与HOST集成开发环境通信的方式来进行。TI提供的RTS.LIB提供两个函数与主机通信,writemsg()函数发送数据和参数到主机。Readmsg()函数从主机读取数据到目标机。Code Composer再与主机进行交互,利用主机文件系统的支持,屏蔽了具体的物理地址读写问题。在调试阶段,当要在主机上建立文件、读取文件和存储数据时,只需用标准的ANSI C函数操作就可以,从而极大方便了编程调试。
3 Flash文件系统的实现
嵌入式文件系统一般有集中管理文件系统,存储空间的使用信息集中存在存储器的某个地方,如DOS的FAT,Unix的inode表。线性文件系统,又称为连续文件系统,每个文件相关的所有信息都连续存放在存储器中。与集中式文件系统相比,实现更简单,读写更快,特别是将文件的关键系统分布存放。日志文件系统顺序写入文件系统的修改,如同日志记录一样,可加速文件写入和崩溃修复。采用Log唯一结构,Log包含索引信息、名称和数据。嵌入式系统不可能带硬盘,一般都是基于Flash存储器的。
3.1 Flash特点及其相应处理
Flash的读操作与普通RAM时序一样,但是写和擦除操作则具有自身的特点。同一地址不能同时写入两次,必须进行费时的擦除操作。执行擦除的方式有三种:一是片擦除,即一次性全部擦除所有内容(这个相当于格式化功能,在第一次使用时可以执行这种操作);二是块擦除;三是扇区擦除。以SSTVFA为例,块Block的大小是KB,扇区的大小是2KB,块擦除一次擦除一个块内容;扇区类似。如果一个文件内容被改动,且改动的内容不足一个扇区的话,则更新文件时必须重写这个扇区的所有内容;在重写前必须擦除该扇区的所有内容。因此基于Flash的文件系统不能完全套用已有的文件系统,但可以在其基础上进行改动。Flash能够擦除的范围越小,对文件的改动就越小,所执行的I/O操作就越小,从而减少I/O时间,提供文件系统的实时性能。我们使用的SSTVFA的扇区大小是2KB,也就是B(1K=)。用常数定义,#define FileUnit 。
3.2 Flash文件系统的层次性
与ANSI C标准相对应,我们将Flash文件系统分为3个层次。第一层次,API层。API层是文件系统与用户应用程序之间的接口,包含一个与文件函数相关的函数库,如FS_FOpen、FS_Fwrite等,也相当于High Level层。第二层次,文件系统层,即Low Level层。该层处理文件是否存在,打开,关闭和为文件分配相应的缓存等。该层调用底层驱动。第三层是Device Level层,就是设备驱动层。Flash的实际读写操作就是在该层进行的,特定的Flash存储器对应特定的读写程序。
3.3 Flash文件信息表的设计
该表保存Flash中已有文件的属性,Flash大小和文件的属性等都在该表中反映出来。该表与Flash中的内容保持同步更新,即一个文件最小块更新完毕时,写入Flash中。
Flash的空间分配:
①Flash空间,以簇为单位,读和写都是一簇,即一个扇区单位;
②0簇给文件分配表,不被应用文件占用;
③每次文件系统初始化时,把Flash内0簇的内容读取到内存中,保存在数组FAT[]中。
常量定义
#define CLUSTER_BLOCK_SIZE //每一簇的字节数
#define NUMBER_OF_CLUSTER_IN_FAT
//在文件分配表中,一共有多少个簇
#define NUMBER_OF_FILE_BUF
//一共有几个文件缓冲区
#define MODE_OPEN_FILE_READ 0x //读取(文件打开模式)
#define MODE_OPEN_FILE_WRITE 0x //写入(文件打开模式)
#define MAX_SIZE_OF_FIEL //文件的最大尺寸
文件结构体:
typedef struct{
unsigned int IsLock:1;//文件是否被上锁,=0没打开;=1已被打开。此标志只在文件的第一簇使用
unsigned int status:7;//簇的状态,=0,此簇为色,没使用;=1,此簇是第一簇;=2,此簇不是第一簇
char FileName[8];//文件名,在第一簇有效
char FileExName[3]; //文件扩展名,在第一簇有效
unsigned int SizeOfFile;//文件的字节数,在第一簇有效
unsigned int NextCluster;//下一簇的簇号。当为0xffffffff时,说明这是当前文件的最后一簇
}FlashFAT;
文件句柄结构体:
typedef struct{
unsigned int Buffer[CLUSTER_BLOCK_SIZE];//文件缓冲区
unsigned int fileblock;//文件当前簇的位置
unsigned int filemode;//打开支持的模式
unsigned int filebufnum;//文件缓冲区中已被/写的字节数
unsigned int fileCurpos;//文件读写的当前位置
unsigned int filesize;//文件的大小
}FlashFILE;
3.4 Device Level驱动函数
SSTVFA标准设备级驱动函数如下:
void Program_One_Word(WORD SrcWord,WORD far Dst){ /*写入一个字*/
WORD far *Temp;WORD far*SourceBuf;WORD far*DestBuf;
Int Index;DestBuf=Dst;
Temp=(WORD far *)0xC;/*设置地址为C:h*/
*Temp=0xAAAA; /*写数据0xAAAA到此地址*/
Temp=(WORD far *)0xCAAA;/*设置地址为C:2AAAh*/
*Temp=0x;/*写数据0x到此地址*/
Temp=(WORD far*)0xC;/*设置地址为C:h*/
*Temp=0xA0A0;/*写数据0xA0A0到此地址*/
*DestBuf=SrcWord;/*传送字节到目的地址*/
Check_Toggle_Ready(DestBuf);/*等待TOGGLF位准备好*/
}
源代码见网站www.dpj.com.cn。
3.5 Flash文件系统的工作流程
在使用Flash文件系统前,先将FlashROM设备加入设备表中(最开始假设Flash中没有任何文件),读入Flash文件表。下面简述系统工作流程。
(1)加入FlashROM设备
add_device("FlashROM",_MSA,flash_open,flash_close,flash_read,flash_write,flash_lseek,
flash_unlink,flash_rename);
其中flash_open、flash_close、flash_read、flsh_write、flash_lseek、flash_unlink、flash_rename是最底层的
flash驱动函数名称。针对不同的Flash,需要不同的驱动函数。
int flash_open(char *path,unsigned flags,int fno);
int flash_close(int fno);
int flash_read(int fno,char *buffer,unsigned count);
int flash_write(int fno,char *buffer,unsigned count);
(2)初始化文件系统
在使用Flash前,必须初始化。初始化临时文件缓冲区,将Flash的各种信息读入到系统中,如Flash的大小,存在的文件的名称、大小、建立日期等,这样系统才能正确使用Flash.
Init_eFS();/*初始化文件系统函数*/
(3)执行各种文件操作
如果要在Flash上打开一个文件,执行fopen("FlashROM:\路径\文件名",“打开模式”)就可以了。当打开文件时,先检查文件表中是否存在该文件。如果没有,则在Flash文件表中查找是否存在该文件。如果存在,则打开;如果没有,则新建这样一个文件,同时打开该文件。随后就可以进行文件的读写、追加、属性修改等操作。
该Flash文件系统的几个技术关键点:
①利用RTS.LIB(TI附带有源代码RTS.SRC)的高级层文件操作功能。该库已经按照ANSI C标准处理了高层文件应用问题。我们可以如同在上位机上编程一样使用各种文件操作函数,不同的是将盘符改为FlashROM盘符。例如,将fopen("C:\read.txt","r")改为fopen("FlashROM:\read.txt","r")。用这种模式操作Flash,的繁琐时序处理和扇区擦除等重复性问题,可以将精力集中到应用编程上来。
②用自设计的Low Level级代码接管了RTS.LIB的低层处理。前述的Flash文件信息表是核心,只有通过该表才能知道Flash中究竟有什么,在哪里操作。当在API层操作文件时,高层函数将调用相应的底层处理属数,在Low Level判断文件是否打开,是否可读写等属性。同时为该文件分配一个内缓冲区,所有对该文件的操作先操作缓冲区,即流操作。当缓冲区满时,调用的操作先操作缓冲区,即流操作。当缓冲区满时,调用Device Level级函数,将数据写入Flash中。同样,读取的时候,是先读取一个扇区内容,处理完毕后再读取下一扇区内容。
操作键盘等其它外设相对Flash要简单得多,不用设计文件信息表。执行两个步骤就可以使用。一是加入设备,调用add_device(……)函数,填入设备名;二是编写设备驱动函数,将对应的函数名作为参数传入add_device()中。在这里要说明的是,不同设备、同样的操作名其实际含义是不同的。如对键盘打开一个字符,则意味着读入一个字符,因此在实际中应用灵活处理。
结语
该Flash文件系统实现了基本的文件读写功能,但是还有些不足地方:文件共享问题没有解决,在掉电的情况下可能导致文件丢失。由于我们研制这个Flash系统的目的在于方便编程、调试;同时在我们的应用领域(电力系统继电保护)中,掉电的几率非常低,存储的文件主要是整定值、控制字(修改不多)和故障滤波记录。这些数据即使丢失也不会造成灾难性的后果,故该系统在整体上满足我们的应用需求。
Code Composer Studio安装与使用
集成开发环境(IDE)Code Composer Studio(CCS)是由TI专为DSP、微处理器和应用处理器打造的工具套件。该软件具备全面的开发与调试工具,包含各种编译器、源码编辑器、项目构建工具、调试器、描述器、仿真器等。
最新版的Code Composer Studio .0在年月日发布,与TDA4 RTOS SDK兼容使用要求CCS版本为9.3及以上。本文以CCS .4版本为例进行介绍。
使用Linux版本的Code Composer Studio需事先安装必要的功能包,并根据不同Ubuntu版本与CCS版本进行配置。下载完成后需进行解压,并在Linux环境中安装。根据官方说明,作为普通用户进行安装,并选择正确的安装路径和组件,尤其是针对使用TDA4芯片的应用。完成安装后,需等待软件加载完毕。
使用Code Composer Studio加载二进制文件,首先启动DMSC_Cortex_M3_0核心对应的初始化脚本。之后调整launch.js文件中loadSciserverFlag参数,并确保已正确映射CPU名称到PSDK和CCS之间。
卸载Code Composer Studio时,可直接进入安装目录并运行uninstall_css.bin文件完成操作。为了辅助学习,提供Code Composer Studio用户手册和eclipse开发环境相关资料链接,帮助使用者更好地掌握其操作。
更新XDS固件库可通过访问存放实用工具的目录并执行相关命令。确保正确配置连接状态及确认固件版本,随后将XDS置于DFU模式,使用更新程序安装新固件,并完成后续复位探头操作。