- 博客(41)
- 收藏
- 关注
原创 c语言入门——指针函数与函数指针
函数指针用于指向函数的指针,允许在运行时选择要调用的函数;指针函数是一个返回函数指针的函数,允许在函数内部选择要返回的函数指针。这两个概念在C语言中提供了灵活性,可以实现动态函数调用和函数指针数组等功能。
2024-10-12 01:24:46 515
原创 Xilinx Vivado SDK XSCT界面文件写入内存和从内存读取命令
文件下载到目标设备的指定内存地址。你需要知道文件应该被加载到的内存地址。从内存读取数据并保存为二进制文件。
2024-10-03 10:37:18 409
原创 DSP——从入门到放弃系列——多核导航器(持续更新)
C6678中的数据移动非常复杂,多核导航器是C6678中协助完成在器件内高速数据包移动的外围设备。
2024-09-27 01:59:29 1023
原创 DSP——从入门到放弃系列——信号量Semaphore2(持续更新)
C6678包含一个增强的信号量,用于管理C66x多核DSP的共享资源。用于对芯片级共享资源的原子化访问,这样读->修改->写的顺序不会被打破。信号量对每个核有特殊的中断,用于确定何时内核访问了这个资源。信号量有8个主设备,在一个系统中有32个信号量可以被使用。
2024-09-26 01:54:41 476
原创 DSP——从入门到放弃系列2——定时器(持续更新)
定时器可以被用于定时事件、计数事件、产生脉冲、中断CPU和发送同步事件到EDMA3通道控制器。是C6678重要外围设备。C6678共16个64位定时器,每个都可以被设置成1个64位或2个32位定时器。Timer0到Timer7,除了可以用作通用定时器,也可以用于8个核中每个核的看门狗定时器。其他的8个只能被配置成通用的。
2024-09-26 00:58:50 271
原创 文件操作详解:fgetc,fputc,fgets,fputs,fscanf,,fprintf,fread,fwrite的使用和例子 C语言
在日常应用中,我们为了持续的使用一些数据,为了让数据可以在程序退出后可以保存并正常使用,引入了文件的概念和操作。本文分享了一些常用的文件操作函数的使用方法和各自的区别。
2024-09-06 00:47:01 644 1
原创 VS编译环境中printf() scanf()等文件操作函数不安全编译报错的解决方法
如题,在使用诸如printf() scanf() fopen()等函数时会出现如下图这样不安全的错误。在程序的前面添加此预编译指令。添加后即可编译通过。
2024-09-04 21:44:26 298
原创 DSP——从入门到放弃系列2——PLL锁相环(持续更新)
锁相环(Phase Locked Loop,PLL)是处理器的时钟源,控制着C6678处理器中C66x内核、各外围设备的时钟的时钟比、对准和选通功能。
2024-06-18 19:20:14 1657
原创 RPC——远程过程调用
rpcgen是一个用于生成远程过程调用(RPC)相关代码的工具,它是 RPC 协议的一部分。RPC 是一种允许程序调用另一个地址空间(通常是远程计算机上的程序)中的程序的技术。rpcgen通常与 UNIX 和类 UNIX 系统上的 RPC 服务一起使用,它可以根据定义 RPC 接口的.x文件(接口定义文件)生成客户端和服务器端的代码。rpcgen自动生成客户端存根(stub)代码,这些代码用于客户端发起 RPC 调用。自动生成服务器端存根代码,这些代码用于服务器端处理 RPC 请求。
2024-03-07 01:55:33 1597
原创 一种求最大最小值的方法(C语言)
作者在做项目时需要分析大量数据,其中需要用到最大值最小值的求解。这里分享一种简单好用的方法,并避免在代码中出现过多的for循环。刚刚定义的compare函数作为回调函数使用,为qsort函数提供比较结果。在排序过后将最大值存入缓冲区。此方法可以求最大的n个数,且代码量少,实现简单方便求最小值也是相同原理不在叙述。首先我们需要定义一个比较函数用来比较2个值的大小并通过返回值来表示比较的结果。这个方法用到了qsort函数。然后就要用到qsort排序函数。
2024-02-29 00:34:54 624
原创 ZYNQ——AXI总线
这时可以利用向导生成对应的 IP。用户自定义 IP 核可以拥有 AXI 4 LiteAXI4 AXI Stream PLB 和 FSL 这些接口。后两种由于 ARM 这一端不支持,所以不用。AXI协议严格的讲是一个点对点的主从接口协议,当多个外设需要互相交互数据时,我们需要加入一个 AXI Interconnect 模块,也就是 AXI 互联矩阵,作用是提供将一个或多个 AXI 主设备连接到一个或多个 AXI 从设备的一种交换机制(有点类似于交换机里面的交换矩阵)。
2024-01-23 01:49:56 1301
原创 ZYNQ入门
ZYNQ全称Zynq-7000 All ProgrammableSoC,是赛灵思公司(Xilinx)推出的新一代全可编程片上系统((APSoC)(全可编程指的是硬件和软件都可以编程),ZYNQ 的本质特征,是它组合了一个双核 ARM Cortex-A9 处理器和一个传统的现场可编程门阵列(FPGA)逻辑部件。它将处理器的软件可编程性与FPGA的硬件可编程性进行完美整合,以提供无与伦比的系统性能、灵活性与可扩展性。
2024-01-22 01:27:35 1471
原创 TI DSP多核应用部署——MAD
将应用程序静态链接到其运行地址为Map工具创建一个部署配置文件,标识要加载到每个core上的应用程序使用部署配置文件作为输入运行MAP工具MAP工具创建一个加载映像(以ROMFS格式),其中包含每个应用程序的激活记录识别应用程序之间的通用代码将公共代码链接为与位置无关的共享对象(DSO)链接应用程序以上步骤创建将在设备上运行的一组应用程序/DSO确定哪些应用程序可以在每个核心上运行通过设想使用情况来识别设备的内存分区DDR:MSMC RAM:L2:Max Cache。
2023-11-13 01:40:32 353
原创 DSP——从入门到放弃系列1(持续更新)
以下为本人在学习和使用TI C6678或国产FT2000的总结和感想,属于基础内容,欢迎各位同学同行交流。最近在学习国产化DSP处理器FT系列,因此下面的一些例子会以FT举例。
2023-10-24 01:38:10 3246
原创 通过代码编译时间实现软件版本管理
版本管理或版本校验时,可以使用编译时间(见上一篇文章)转换为整型然后进行简单的计算,组合为我们想要的代码版本信息。利用宏定义__DATE__和__TIME__为字符串的特点实现对数字或字母的提取而不需要校验ASCII码,非常简单。若为嵌入式系统代码版本可将日期和时间存在内存中,需要校验时取出。
2023-10-20 02:05:29 111
原创 获取代码编译时间的一种方法
编译时间可以作为代码或固件的版本,以此来规范代码的版本,通过时间来约束,可以通过将编译的时间打印出来或写入某个内存区域中被读取来展现版本信息。
2023-10-18 01:27:02 1589
原创 lseek函数及其他文件操作函数
类似迅雷等下载器的原理,通过索引(指针)拉取预留一片空间,用来文件操作。(1)文件指针:当我们对一个文件读写时,一定需要打开这个文件,所以我们操作的都是动态文件,动态文件在内存中的形态就是流的形式。(2)文件流很长,里面有很多字节。那我们操作的是哪一个位置,GUI模式下就是用光标来标识,在动态文件中,我们通过文件指针来表示正在操作的位置。文件指针其实就是vnode里的一个元素。这个指针表示我们操作的位置,在linux中用lseek来访问这个指针。
2023-09-05 18:45:06 143
原创 TCP/IP——Socket网络编程应用及实例
socket()——创建套接字应用程序在使用套接字前,首先必须拥有一个套接字,系统调用socket()向应用程序提供创建套接字的手段。domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。
2023-08-30 11:19:24 481
原创 TCP/IP——Socket网络编程概述
Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议,主要利用三元组【ip地址,协议,端口】。Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket()函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。
2023-08-27 23:01:20 145
原创 DSP系统时钟配置
表中的PLLM为倍频,PLLD为分频,OUTPUT_DIVIDE是SECCTL[22:19]位的值,将PLL设置为设备的最大时钟设置,默认情况下 OUTPUT_DIVIDE = 1。以配置1GHz,晶振为156.25MHz为例,对照上表可知需要的PLLM=63,PLLD=4根据公式可得1GHz的主频。DSP的时钟模块,为Core和其他模块提供时钟,通过PLL锁相环倍频和分频。每个模块都有多种时钟源可供选择。PLL默认设置由BOOTMODE决定[12:10]位,下表显示了各种输入时钟频率的设置。
2023-08-17 09:17:30 1034 1
原创 TCP/IP——网络通信=》我的入门协议
从字面意义上讲,有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议。实际生活当中有时也确实就是指这两种协议。然而在很多情况下,它只是利用 IP 进行通信时所必须用到的协议群的统称。具体来说,IP 或 ICMP、TCP 或 UDP、TELNET 或 FTP、以及 HTTP 等都属于 TCP/IP 协议。他们与 TCP 或 IP 的关系紧密,是互联网必不可少的组成部分。TCP/IP 一词泛指这些协议,因此,有时也称 TCP/IP 为网际协议群。
2023-08-11 23:24:46 133 1
原创 DSP多核开发——OpenMP
无需关心底层的数据交互,只关心算法提升的速度。这个例子是rgb888的图片数组转换为灰度图,使用的经验公式,如果使用单核用一个for循环就够了,若把它运行在多线程多核的情况下只需要添加#pragma omp parallel for就可以了,这就是预编译指令指导openmp的行为。首先需要有一个主线程,在平时串行的执行命令,在需要做算法计算的时候做并行计算,可以通过预编译指令指定需要并行执行的代码段,然后就会fork分配这些需要并行执行的代码到不同核心的多个线程中执行,执行完成后再join回到主线程。
2023-07-17 15:26:01 399 2
原创 DSP多核通信——IPC组件
slaver核心也注册了notify,设置了一个信号量,一直等待信号量释放,当master发送event之后,slaver的回调函数cbFxn就会被调用,进入这个回调函数,就可以获取这个共享区域指针同时释放信号量,收到信号量后slaver的主函数会继续往下执行,slaver就通过SharedRegion_getPtr函数将共享区域指针转换成内存地址,slaver就可以读取这个内存地址里面的值。最大的特点就是实时。添加入口有两种方式:一种是静态的(在cfg文件里添加),一种是的动态的(在代码里添加)。
2023-07-15 17:31:17 1172 1
原创 DSP简单多核开发2
从内存重新读数据,然后核心0将flag标志修改,由于核心0使能了缓存所以需要将缓存里面的值回写到内存中,然后向核心1发送ipc中断。若核心0核心1正常初始化了以后核心1就会进到中断服务函数中,然后根据核心ID判断,若是1首先响应中断,首先清一下源ID,将flag修改,同时向核心0发送IPC中断,同样进入IPC中断服务函数,看到了修改后的flag值,实现了通讯。在接下来的通信中,若核心1启动完成,将一个标志位置位,向核心1发送一个中断,同时携带一个ID用来表示核心0到核心1的中断。
2023-07-14 15:38:38 317 1
原创 DSP简单多核开发1
多个核心在协作时不能只有数据,需要通过某种机制,通知其他核心数据已经准备就绪,可以开始操作,因为在实际应用中并不是所有处理都是并行的,有的处理是需要串行的,IPC中断就是一种通知机制。主要通过几个寄存器来实现,在CPU SOC内部主要用到IPCGRx和IPCARx这两个寄存器,x代表核心数目,对寄存器相应的位置位就可以触发相应核心的IPC中断,IPC中断对于每个核心来说都有唯一一个事件,将这个事件映射到CPU中断就可以相应这个中断了,每个核心都要配置。硬件信号量——保证互斥访问。Semaphore2模块。
2023-07-13 16:42:24 468 1
原创 C66x DSP内存、内存保护与地址扩展(MPAX)、缓存与预取
上图两个核心的代码和数据从逻辑地址上看占用的地址空间是一样的,若两个核心的程序都是共用相同的数据空间,那么一定会有冲突,此时,就可以通过配置MPAX将两个核心的数据空间分别映射到不同的地址上,这样就可以避免数据冲突。首先看低32位的PERM,这个域与内存保护相关,定义了什么类型的访问才是允许的,定义了6种情况,分为2种模式,普通用户模式和超级用户模式,在这两种情况下又分为可执行、可写、可读。MAR寄存器只需要配置第0位和第3位,第0位写0不可缓存,写1可以缓存,第3位配置的是可缓存空间是否允许预取。
2023-07-12 21:49:32 1272 4
原创 DSP的核心中断与芯片中断
核心中断控制器是属于核心的一个功能模块,CIC芯片中断控制器是属于SOC芯片上的一个模块,所以这里也可以把CIC理解为一个外设,它的输入是事件,输出也是事件,输出的就是核心中断控制器的事件,就是核心中断控制器128个事件中的某个事件,因此,通过CIC扩展的事件经过芯片中断控制器的映射之后输出到核心中断控制器的事件上,而核心中断控制器又将这个事件映射到CPU中断上,CPU就可以相应芯片中断控制器上的中断了。芯片中断控制器事件的响应需要经过两级的映射,首先需要先映射到核心中断再映射到CPU。
2023-07-11 19:47:06 648 2
原创 DSP外设——GPIO概述
GPIO(General-purpose input/output)外设是所有的处理器芯片包括51、STM32等单片机和dsp都有的外设,是处理器上最简单的外设。数据的输入/输出,需要配置数据的方向,是选择输入还是输出,然后通过配置不同的寄存器来决定使用什么操作。外设时钟是CPU时钟的6分频,并不是每个引脚的时钟。中断触发只支持边沿触发,要么上升沿要么下降沿要么都可以,需要注意的是,所有的GPIO口都可以独立的产生中断和EDMA事件。一部分是数据的输入/输出,另一部分是EDMA事件和中断产生。
2023-07-10 10:23:42 811 1
原创 KeyStone I DSP 概述2——DSP入门
上一篇文章讲到,CPU子系统中的XMC扩展内存控制器,通过256位宽连接到L2内存控制器,还有一部分连出CPU直接连接到MSMC(多核共享内存控制器)有4M RAM通过它直接连接到DDR3上,这样带来的好处是CPU在访问DDR时不需要经过总线,解决了多核在访问外部内存时的冲突问题。在多核开发中,可以将相同的逻辑地址映射到不同的物理空间这样可以R让每个核心都访问相同的逻辑地址实际访问不同的物理地址,这样需要共享的代码就映射到同一个地址空间不需要共享的代码就映射到不同的地址空间如堆栈。方便多核的数据交换。
2023-07-06 18:00:08 355 1
原创 KeyStone I DSP 概述1——DSP开发入门
DSP C6678处理器具有8个TMS320C66x内核,每个内核内部都有L1P、L1D和L2 SRAM存储器,多核共享的存储器为MSM和SRAM。
2023-07-06 15:01:24 368 1
原创 I2C——简单高效的BUS
I2C(集成电路总线)是一种简单、双线双向的同步串行总线,利用一根时钟线和一根数据线在连接了两个器件之间进性数据的传递,是一种十分简单且高效的数据交换方法。每个连接到总线上的器件都有唯一的地址,任何器件既可以作为主机也可以作为从机,但同一时刻只允许有一个主机。I2C 标准是一个具有冲突检测机制和仲裁机制的真正意义上的多主机总线,它能在多个主机同时请求控制总线时利用仲裁机制避免数据冲突并保护数据。
2023-06-06 21:00:35 536 2
原创 操作系统系列——TI实时操作系统SYS/BIOS概述
SYS/BIOS是一个可扩展的实时的操作系统。具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片)。能够实现系统的模块化并可裁剪。最大的特点就是:实时(RTOS)。手动编辑.cfg文件:Program.sectMap["L3_DATA"]= "DDR";
2023-04-22 16:59:16 2003
原创 SRIO——DIO通信模式
框架流程direct I/O的LSU模块(加载/存储)是所有传出的direct I/O 包(direct I/O 包)的来源。通过direct I/O包,Rapid I/O包包含了目标设备上数据的存储地址和读取地址。direct I/O 需要RapidIO源设备包含目标设备的本地存储器地址列表。一旦地址列表建立,RapidIO源控制器就利用这些数据来计算目标地址,并将其插入到包header里。RapidIO目标外设从接收到的包header中提取目标地址,并通过DMA把包的payload(包的
2023-03-13 11:02:41 2876
原创 数据结构循环队列(C语言)——咬着尾巴的贪吃蛇
循环队列与普通队列相比,最主要的就是头与尾连接在一起,即front = rear = 0队列中有效数据个数:(rear+MAXQSIZE-front)%MAXQSIZE由于队列为环形,当需要计算队列长度时若队头在队尾前则为lenth =rear -front但若出现队尾在队头前按照原有计算方法会出现负值,显然是不符合要求的此时大家会想到要是可以使用类似数学中的取绝对值操作,没错!此时可以使用与取绝对值相同的操作但换了一个名字:取模(rear+MAXQSIZE-front)%MAXQSIZE
2023-03-08 00:28:16 210
原创 SRIO——板件通信的桥梁
RapidIO是一种高性能、 低引脚数、 基于数据包交换的互连体系结构,是为满足和未来高性能嵌入式系统需求而设计的一种开放式互连技术标准。主要应用于嵌入式系统的互联,支持板间通信、芯片到芯片的通信,可以用作嵌入式设备的背板连接方式。RapidIO使用了三层分级结构分别是:逻辑层、传输层和物理层。逻辑层:位于最高层,定义全部协议和包的格式,它们为端点器件发起和完成事务提供必要的信息;传输层:规范位于中间层,定义了RapidIO地址空间和在端点器件间传输包所需要的路由信息;物理层:规范在整个分级结构的底部,包括
2023-02-27 00:01:14 2540 1
原创 Select函数——约定了时间过时不候
struct timeval *timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态。1、若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态,一定等到监视文件描述符集合中某个文件描述符发生变化为止;2、若将时间值设为0秒0毫秒,就变成一个纯粹的非阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值;
2023-02-21 01:21:40 1009
fgetc fputc fgets fputs fscanf fprintf fread fwrite文件操作函数使用例程代码
2024-09-06
远程过程调用RPC生成工具
2024-03-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人