用C语言进行MCS51系列单片机程序设计是单片机开发和应用的必然趋势。Keil公司的C51编译器支持经典8051和8051派生产品的版本,通称为Cx51。应该说,Cx51是C语言在MCS51单片机上的扩展,既有C语言的共性,又有它自己...
学习单片机有一学期了,现在也由51转到STM32了。一直想对51的学习做一个总结。也希望对别人有一些启发。也给后学者提供一些建议。当然本文是我对自己学习过程的总结,若有不对的地方,还请高手指出。 我想,再看本...
Flash是大家常使用的存储之一,对于Flash,大家或多或少有所了解。上篇文章中,小编对Flash闪存的类型有所介绍。为继续增进大家对Flash的认识,本文将对Flash盘、Flash盘结构以及Flash读写操作予以介绍。如果你对本...
嵌入式系统的应用十分广泛,因此越来越多的人学习嵌入式系统。由此,在学习嵌入式系统之前,我们应当对嵌入式系统具备一些认识。所以在本文余下部分,小编将对嵌入式系统进行全面解析。如果你对嵌入式系统具有兴趣...
学习单片机有一学期了,现在也由51转到STM32了。一直想对51的学习做一个总结。也希望对别人有一些启发。也给后学者提供一些建议。当然本文是我对自己学习过程的总结,若有不对的地方,还请高手指出。 我想,再看本...
前言: 大家好,今天给大家介绍的内容是rk平台的mpp编解码这块的内容,在rk目前看到有三套框架涉及到编解码内容: 1、rkmedia 2、rockit 3、mpp 这三种不同形式的编解码方式,后面再做详细的框架对比,今天我们主要是怎么移植mpp源码到开发板里面去。 这里主要是记录一下学习过程! 开始移植mpp源码 mpp源码一般在对应的sdk里面的external里面也有,我这里不用sdk里面的mpp源码,而是从rockchip官方仓库里面下载最新的mpp源码: https://github.com/rockchip-linux/mpp/tree/release 现在我们开始来进行一定的修改: mpp源码目录 上面我们修改这个路径下的两个文档内容: 最终内容内容修改如下: arm.linux.cross.cmakemake-Makefiles.bash 接着还需要修改一个地方,不然到时候移植到开发板上,我们运行demo,发现终端没有任何的打印log,就让人很奇怪,所以需要在osal里面做一个log打印输出语句: 添加如下两条打印语句: void os_log(const char* tag, const char* msg, va_list list) { char line[LINE_SZ] = {0}; snprintf(line, sizeof(line), "%s: %s", tag, msg); vsyslog(LOG_INFO, line, list); vfprintf(stdout, line, list); } void os_err(const char* tag, const char* msg, va_list list) { char line[LINE_SZ] = {0}; snprintf(line, sizeof(line), "%s: %s", tag, msg); vsyslog(LOG_ERR, line, list); vfprintf(stderr, line, list); } 最终结果 现在我们可以来开始进行编译了: 最终编译结果 移植到开发板上执行测试解码: 传输到开发板上来: 我们可以直接执行这个测试程序,可以看到一些有用的参数说明: 开始测试: 好了,整个移植过程就结束了,下一期文章,我们开始构造属于自己的mpp工程,怎么解码码流到屏幕上去显示,循环播放演示以及mpp的整个架构和api的使用介绍,我们下期见!
Bootloader是一个用于引导嵌入式系统的软件程序,通常存储在芯片的非易失性存储器中,如闪存。Bootloader的主要功能是在系统上电后,负责初始化系统硬件并加载操作系统或应用程序到内存中执行。
1、嵌入式处理器基础 典型的微处理器由控制单元、程序计数器(PC)、指令寄存器(IR)、数据通道、存储器等组成 。 指令执行过程一般分为: 取指: 从存储器中获得下一条执行的指令读入指令寄存器; PC: 程序计数器, 总是指向下一条将要执行的指令; IR: 指令寄存器,用于保持已取得指令;如图: 译码: 解释指令,决定指令的执行意义;如图: 执行: 从存储器向数据通道寄存器移动数据; 通过算术逻辑单元ALU进行数据操作;如图: 存储: 从寄存器向存储器写数据。如图: 在一些微处理器上,如ARM系列处理器、DSP等,指令实现流水线作业,指令过程按流水线的数目来进行划分。如5级流水线的处理器将指令分5个阶段执行。 (1)按存储结构分:冯·诺依曼体系结构和哈佛体系结构 冯·诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。 处理器,经由同一个总线传输来访问程序和数据存储器,程序指令和数据的宽度相同。如X86系列、ARM7等,如图: 哈佛结构是一种将程序指令存储和数据存储分开的存储器结构,目的是为了减轻程序运行时的访存瓶颈。哈佛结构的微处理器通常具有较高的执行效率。 Microchip公司的PIC系列芯片,摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和ARM公司的ARM9、ARM10和ARM11 等。如图: 按指令类型可分为:复杂指令集(CISC)处理器和精简指令集(RISC)处理器 。 CISC:复杂指令集(Complex Instru ction Set Computer); 具有大量的指令和寻址方式,那么就需要更多的解释器。 8/2原则:80%的程序只使用20%的指令; 大多数程序只使用少量的指令就能够运行。 CISC具有如下显著特点: (1) 指令格式不固定,指令长度不一致,操作数可多可少; (2) 寻址方式复杂多样,以利于程序的编写; (3) 采用微程序结构,执行每条指令均需完成一个微指令序列; (4) 每条指令需要若干个机器周期才能完成,指令越复杂,花费的机器周期越多。 RISC:精简指令集(Reduced Instruction Set Computer):指令数目少,在通道中只包含最有用的指令;执行时间短,确保数据通道快速执行每一条指令;使CPU硬件结构设计变得更为简单;每条指令都采用标准字长。 2、ARM处理器体系架构 ARM即Advanced RISC Machines的缩写。 1985年4月26日,第一个ARM原型在英国剑桥的Acorn计算机有限公司诞生。 20世纪80年代后期,ARM很快开发成Acorn的台式机产品,形成英国的计算机教育基础。 1990年成立了Advanced RISC Machines Limited。 20世纪90年代,ARM32位嵌人式RISC(Reduced Instruction Set Computer)处理器扩展到世界范围,占据了低功耗、低成本和高性能的嵌入式系统应用领域的领先地位。 目前己经占有75%以上的32位嵌入式产品市场。 32位RISC处理器受到青睐,领先的是ARM嵌入式微处理器系列。 ARM公司虽然只成立20多年,但在1999年因移动电话火爆市场,其32位RISC处理器占市场份额超过了50%,2001年初,ARM公司的32位RISC处理器市场占有率超过了75%。ARM公司是知识产权供应商,是设计公司。由合作伙伴公司来生产各具特色的芯片。 ARM处理器特点: (1)ARM指令是32位定长的(除AArch64架构部分增加指令为64位外) (2)寄存器数量丰富(37个寄存器) (3)普通的Load/Store指令 (4)多寄存器的Load/Store指令 (5)指令的条件执行 (6)单时钟周期中的单条指令完成数据移位操作和ALU操作 (7)通过变种和协处理器来扩展ARM处理器的功能 (8)扩展了16位的Thumb指令来提高代码密度 ARM的命名规则, 大致分成两类类: 基于ARM Architecture版本的“处理器系列”命名规则; 基于ARM Architecture版本的“处理器型号”命名规则。 ARMv6 架构,引进了包括单指令多数据(SIMD)运算在内的一系列新功能。 ARMv6-M 架构,为低成本、高性能设备而设计,向以前由8位设备占主导地位的市场提供32位功能强大的解决方案。如Cortex™-M0和Cortex-M1。 ARMv7架构,所有ARMv7架构处理器都实现了Thumb-2 技术(一个经过优化的16/32位混合指令集),此架构分为3类处理器:Cortex-A -应用处理器、Cortex-R - 实时处理器、Cortex-M - 微控制器。 ARMv8架构,ARMv8-A将64位体系结构支持引入ARM体系结构中,其中包括:64位通用寄存器、SP(堆栈指针)和 PC(程序计数器),64位数据处理和扩展的虚拟寻址,兼容32位处理。 ARMv9架构,最重大的升级在于AI和安全,在兼容ARMv8的基础上,提升了安全性,增加了矢量计算、机器学习和数据信号处理等多方面能力,性能表现也将得到极大幅度的提升。 1)ARM数据类型 (1)双字节(Double-Word):64位 (2)字(Word):在ARM体系结构中,字的长度为32位。 (3)半字(Half-Word):在ARM体系结构中,半字的长度为16位。 (4)字节(Byte):在ARM体系结构中,字节的长度为8位。 2)ARM处理器存储格式 作为32位的微处理器,ARM体系结构所支持的最大寻址空间为4GB。 ARM体系结构可以用两种方法存储字数据,分别为大端模式和小端模式。 大端模式(高地高低):字的高字节存储在低地址字节单元中,字的低字节存储在高地址字节单元中。 3)ARM处理器工作状态 从编程的角度来看,ARM微处理器的工作状态一般ARM和Thumb有两种,并可在两种状态之间切换。 (1)ARM状态:此时处理器执行32位的字对齐ARM指令,绝大部分工作在此状态。 (2)Thumb状态:此时处理器执行16位的半字对齐的Thumb指令。 THUMB指令的特点: THUMB代码所需空间为ARM代码的70%; THUMB代码所使用的指令数比ARM代码多40%; 用32位存储器,ARM代码比THUMB代码快40%; 用16位存储器,THUMB代码比ARM代码快45%; 使用THUMB代码,外部存储器功耗比ARM代码少30% 4)ARM处理器工作模式 5)ARM Cortex-A处理器工作模式 6) Cortex-A寄存器组 34个通用寄存器,包括各种模式下的R0-R14和共用的R15程序计数器(PC),这些寄存器都是32位的。8个状态寄存器,Hyp模式独有一个ELR_Hyp寄存器。 7)程序状态寄存器CPSR和SPSR 和其他处理器一样,ARM有程序状态存储器来配置处理器工作模式和显示工作状态。ARM处理器有两个程序状态寄存器CPSR (Current Program Status Register,当前程序状态寄存器)和SPSR (Saved Program Status Register,备份的程序状态寄存器)。 CPSR可在任何运行模式下被访问,它包括条件标志位、中断禁止位、当前处理器模式标志位以及其他一些相关的控制和状态位。 每一种运行模式下都有一个专用的物理状态寄存器,称为SPSR为状态寄存器。 (1)N(Negative):当用两个补码表示的带符号数进行运算时,N=1表示结果为负,N=0表示结果为正数或零 (2)Z(Zero):Z=1表示运算结果为0,Z=0表示运算结果非零 (3)C(Carry):有4种方法可以设置C的值: 1)加法指令(包括比较指令CMP) 2)当运算产生进位时(无符号数溢出),C=1,否则C=0 3)减法运算(包括比较指令CMP) 4)当运算产生了借位(无符号数溢出),C=0,否则C=1 对于包含移位操作的非加/减运算指令,C为移出值的最后一位。对于其他的非加/减运算指令,C的值通常不变。 (4)V(Overflow):有2种方法设置V的值: 1)对于加/减法运算指令,当操作数和运算结果为二进制的补码表示的带符号数时,V=1表示符号位溢出。 2)对于其他的非加减法运算指令,V的值通常不变。 (5)I(Interrupt Request):I=1表示禁止响应irq,I=0表示允许响应 (6)F(Fast Interrupt Request):F=1表示禁止响应fiq,F=0表示允许响应 (7)T(Thumb):T=0表示当前状态位ARM状态,T=1表示为Thumb状态 (8)M4-M0:表示当前处理器的工作模式 8)工作模式的切换条件 (1)执行软中断(SWI)或复位命令(Reset)指令。如果在用户模式下执行SWI指令,CPU就进入管理(Supervisor)模式。 (2)有外部中断发生。如果发生了外部中断,CPU就会进入IRQ或FIQ模式。 (3)CPU执行过程中产生异常。最典型的异常是由于MMU保护所引起的内存访问异常,此时CPU会切换到Abort模式。如果是无效指令,则会进入Undefined模式。 (4)有一种模式是CPU无法自动进入的,这种模式就是System模式,要进入System模式必须由程序员编写指令来实现。要进入System模式只需改变CPSR的模式位为System模式对应的模式位即可。 (5)在任何特权模式下,都可以通过修改CPSR的MODE域来进入其他模式。不过需要注意的是由于修改的CPSR是该模式下的影子CPSR,即SPSR,因此并不是实际的CPSR,所以一般的做法是修改影子CPSR,然后执行一个MOVS指令来恢复执行某个断点并切换到新模式。 3、ARM处理器内存管理 1)什么是内存映射 内存映射指的是在ARM存储系统中,使用内存管理单元(MMU)实现虚拟地址到实际物理地址的映射,如图所示。 2)为什么要内存映射 A32架构的ARM的地址总线为32位,故CPU可寻址范围为0x00000000~0xffffffff寻址空间为4GB,所有的内部和外部存储或者外设单元都需要通过对应的地址来操作,不同芯片外设的种类数量寻址空间都不一样,为了能让内核更方便的管理不同的芯片设计,ARM内核会先给出预定义的存储映射。 芯片设计公司需要根据内核提供的预定义的存储器映射来定义芯片内部外设和外部的保留接口,这样做的好处是极大地减少了同一内核不同芯片间地址转化的麻烦(CPU操作统一的虚拟地址,实际物理地址交由MMU管理)。 3)位带操作 (1)什么是位带操作 举个简单的例子,在使用51单片机操作P1.0为低电平时我们知道这背后实际上就是往某个寄存器某个比特位中写1或0的过程,但在CPU操作的过程中每一个地址所对应的都是一个8位字节,怎么实现对其中某一位的直接操作,这就需要位带操作的帮助。 (2)哪些地址可以进行位带操作 上图中有两个区中实现了位带。其中一个是 SRAM 区的最低 1MB 范围(Bit band region),第二个则是片内外设区的最低 1MB 范围。 4)寄存器的地址计算 在ARM中所有的外设地址基本都是挂载在AHB或者APBx总线上,因此我们往往采用基地址+偏移地址+结构体的方式,来快速明了计算某一外设具体寄存器的地址,如图所示。 5)集成外设寄存器访问方法
一、初识OPC 1996年,微软与Fisher-Rosement、Intellution、Opto 22等工业自动化厂商成立OPC基金会,旨在通过统一接口解决设备互操作性问题,同年推出OPC Classic规范。OPC Classic规范基于Microsoft Windows技术,使用COM / DCOM(分布式组件对象模型)在软件组件之间交换数据。规范为访问过程数据、报警和历史数据提供了单独的定义。 OPC Classic主要有三个子规范: 1.OPC Data Access,即我们常说的OPC DA 。OPC DA规范定义了数据交换,包括值、时间和质量信息。 2.OPC Alarms & Events,即OPC AE。OPC AE规范定义了报警和事件类型消息信息的交换,以及变量状态和状态管理。 3.OPC Historical Data Access,即:OPC HDA。OPC HDA规范定义了可应用于历史数据、时间数据的查询和分析的方法。 二、OPCUA诞生 随着以服务为导向的架构的引入,跨平台的数据传输需求,以及大数据量传输的数据安全问题。2008年,OPC基金会发布了OPC统一架构(Unified Architecture),即OPC UA,这是一个独立于平台的面向服务的架构,它集成了现有OPC Classic规范的所有功能。 OPC UA是新一代的OPC标准,通过提供一个完整的,安全和可靠的跨平台的架构,以获取实时和历史数据和时间。OPCUA是目前已经使用的OPC工业标准的补充,提供重要的一些特性,包括如平台独立性,扩展性,高可靠性和连接互联网的能力。现在OPC UA已经成为独立于微软、UNIX或其他的操作系统企业层和嵌入式自动组建之间的桥梁。 作为工业4.0的重要协议之一,OPC UA具体以下特点: 1.统一架构:采用一套优化的基于TCP的统一架构二进制协议进行数据交换;同时支持网络服务(WEB SERVICES)和HTTP。在防火墙中只需打开一个端口即可。集成化的安全机制可确保在互联网上的安全通信。 2.平台开放:OPC UA软件的开发不再依靠和局限于任何特定的操作平台。过去只局限于Windows平台的OPC技术拓展到了Linux、Unix、Mac等各种其它平台。 3.安全通讯:OPC UA支持会话加密、信息签名等安全技术,每个UA的客户端和服务器都要通过OpenSSL证书标识,具有用户身份验证,审计跟踪等安全功能。 4.可扩展性:OPC UA的多层架构提供了一个“面向未来”的框架。诸如新的传输协议、安全算法、编码标准或应用服务等创新技术和方法可以并入OPC UA,同时保持现有产品的兼容性。 三、读写方式 无论是OPC DA还是OPC UA,在读写方式方面都是类似的。OPC读写方式主要有三种,分别是同步方式、异步方式及订阅方式,订阅方式仅针对读取有效。 1、同步方式: 同步方式是指当客户端发送请求后,必须等到服务器响应全部完成后才能返回,期间将一直处于等待状态,因此当多客户端向服务器操作时,客户端程序产生阻塞,同步通讯适用于客户端较少,数据量较小的场合,同步方式的工作流程如下图所示: 2、异步方式:异步方式是指当客户端发送请求后立即返回,不需要等待服务器的响应,可以进行其他操作,当服务器完成响应后会自动通知客户端,因此相对于同步通讯,异步通讯的效率更高,异步方式的工作流程如下图所示: 3、订阅方式:订阅方式在初始化时,就需要订阅相应的通信组Group,这样当服务器的Group组内有数据发生变化时,就会自动刷新客户端数据,客户端只需要向服务器发送一次请求,因此订阅方式的效率是非常高的,订阅方式的工作流程如下图所示: 四、OPC服务器 OPC通信基于服务器-客户端模型,如果要实现OPC通信,首先需要搭建一个OPC服务器环境,这里我们采用比较主流的KepServer软件,硬件采用西门子S7-1200PLC,通过KepServer对接S7-1200,然后作为服务器,可以通过OPCDA或OPCUA进行访问。 1、打开KepServer软件后,通过菜单新建一个项目,然后添加通道,选择驱动,这里我们可以看到支持的各种设备协议,然后按照下图进行操作: 2、添加设备:添加设备按照向导进行添加,这里的型号选择S7-1200,并设置正确的IP地址,其他默认下一步: 3、添加标记组:如果变量较多,可以按照类型创建不同的标记组进行分类: 4、添加标记:标记指的就是OPC变量,直接右击新建标记,然后按照说明填写即可,这里以浮点型为例,就填写DB1.DBD4这种格式,其他的数据类型根据提示编写。 5、保存项目:添加完成之后,直接保存项目,然后通过菜单 >> 运行时 >> 连接实现与PLC之间的连接。 6、监控变量:连接正常之后,通过点击Quick Client进行监控,点击相应的标记点,即可看到通信数值及通信状态,我们很轻松就读取到了PLC的数据。 五、OPC客户端 KepServer可以同时支持OPCDA和OPCUA,接下来我们用OPC客户端软件进行测试。 我们先测试OPCDA,打开FactorySoft OPC Client,点击OPC=>Connect,我们可以很轻松找到KepServer对应的的ServerName,如果不是同一台电脑,需要做DCOM配置。然后我们点击AddItem就可以找到KepServer中所有的变量,点击AddItem,即可进行监控。然后我们再测试一下OPCUA,OPCUA使用UAExpert软件,打开KepServer的OPCUA配置,我们可以看到相关的URL及安全性设置,如果连接不上,可以把安全策略设置为None。我们通过UAExpert来添加一下OPCUA服务器信息,。连接上服务器之后,可以搜到服务器中的OPCUA变量进行实时监控。通过整个过程,相信大家对OPC已经有了一定的了解: OPC最初制定时并不是作为一种通信协议,而是一种通信标准接口。 KepServer并不代表OPC,而是围绕OPC标准接口构建的一款OPC服务器软件。 OPCUA不再局限于接口标准或通信协议,而是接口标准与通信协议的综合体。 文章中涉及软件可以通过公众号后台回复102进行获取。后续可以通过C#编写对应的OPCDA及OPCUA客户端代码来实现OPC通信。