指令寄存器

Modbus

流过昼夜 提交于 2020-03-11 12:12:35
Modbus协议简介 Modbus(RTU / ASCII / TCP)是一种串行通信协议,是Modicon(莫迪康)公司于1979年,为使用可编程逻辑控制器(PLC)而发表的 Modbus协议的详细规格是公开的,只定义了通讯协议而没有规定物理层如通讯介质 Modbus是工业领域通信协议的业界标准,并且现在是工业电子设备之间相当常用的通讯方式 Modbus比其他通信协议使用的更广泛的主要原因有: 【1】公开发表并且无版税要求 【2】相对容易的工业网络部署 【3】对供应商来说,修改移动原生的位元或字节没有很多限制 Modbus功能码简介 代码 功能 寄存器PLC地址 位操作/字操作 操作数量 01H 读线圈状态 00001-09999 位操作 单个或多个 02H 读离散输入状态 10001-19999 位操作 单个或多个 03H 读保持寄存器 40001-49999 字操作 单个或多个 04H 读输入寄存器 30001-39999 字操作 单个或多个 05H 写单个线圈 00001-09999 位操作 单个 06H 写单个保持寄存器 40001-49999 字操作 单个 0FH 写多个线圈 00001-09999 位操作 多个 10H 写多个保持寄存器 40001-49999 字操作 多个 功能码可以分为位操作和字操作两类。位操作的最小单位为BIT,字操作的最小单位为两个字节

EPC和ErrorEPC

北战南征 提交于 2020-03-09 06:14:36
EPC :Exception Program Counter (CP0 Register 14, Select 0), 异常返回地址寄存器,用于存储异常返回地址。 ErrorEPC :ErrorEPC Register (CP0 Register 30, Select 0),发生复位异常时的异常地址寄存器。 EPC和ErrorEPC的相同点: 两个寄存器都是可读可写的,存储32bit地址,通常情况下发生异常时由硬件更新。软件也可以去写这两个寄存器。 用于记录发生异常时的指令的虚拟地址。 如果发生异常的指令在分支延迟槽里(cause[BD]=1),EPC和ErrorEPC指向前一条分支或跳转指令。 EPC和ErrorEPC是eret指令的返回地址。 EPC和ErrorEPC的不同点: EPC发生异常或中断时会被更新,记录的是当前这次发生异常的虚拟地址。 ErrorEPC发生reset异常时会被更新,记录的是上一次异常的虚拟地址。 当SR(EXL)=1时,cpu不去写EPC。只有SR(EXL)=0时,EPC会被更新。 下图是mips官方文档对这两个寄存器的描述: ErrorEPC寄存器可以在重启之后对系统上一次reset前的异常进行debug,使用方法如下: __asm__ __volatile__ ( "mfc0 %0, $30, 0 \n\t" "nop \n\t" :"=r"

操作系统精髓与设计原理笔记(1)

£可爱£侵袭症+ 提交于 2020-03-07 00:01:37
计算机系统概述 1.1基本构成 计算机基本构成:处理器、存储器、输入/输出部件 处理器:逻辑处理单元,控制计算机的操作,执行数据处理功能,(CPU)。 内存:存储数据和程序。特点是易失性,关机后,存储器的内容就会丢失,通常被称为实存储器或主存储器。 输入/输出模块:在计算机和外部环境(外部设备(存储器设备:硬盘、通信设备和终端))之间移动数据。 系统总线:为处理器、内存和输入/输出模块间提供通信的设施。 寄存器简介: CPU使用的寄存器 存储器地址寄存器(MAR):确定下一次读写的存储器地址。 存储器缓冲寄存器(MBR)存放要写入存储器的数据或从存储器读取的数据。 输入/输出寄存器: 输入/输出地址寄存器(I/O AR)确定一个特定的输入/输出设备。 输入/输出缓冲寄存器(I/O BR)用于在输入/输出模块和处理器间交换数据。 1.2处理器寄存器 处理器包含一组寄存器,它们提供一定的存储能力,比内存访问速度快,但比内存的容量小。 用户可见寄存器:优先使用这些寄存器,可以减少使用机器语言或汇编语言的程序员对内存的访问次数。对高级语言而言,由优化编译器负责决定哪些变量应该分配给寄存器,哪些变量应该分配给内存。一些高级语言(如C语言)允许程序员建议编译器把哪些变量保存在寄存器中。 控制和状态寄存器:用以控制处理器的操作,且主要被具有特权的操作系统例程使用,以控制程序的执行。 1.2

又能扯皮了!没内存了还能看片?

拥有回忆 提交于 2020-03-06 15:35:58
虚拟内存 尽管基址寄存器和变址寄存器用来创建地址空间的抽象,但是这有一个其他的问题需要解决: 管理软件的膨胀(managing bloatware) 。虽然内存的大小增长迅速,但是软件的大小增长的要比内存还要快。在 1980 年的时候,许多大学用一台 4 MB 的 VAX 计算机运行分时操作系统,供十几个用户同时运行。现在微软公司推荐的 64 位 Windows 8 系统至少需要 2 GB 内存,而许多多媒体的潮流则进一步推动了对内存的需求。 这一发展的结果是,需要运行的程序往往大到内存无法容纳,而且必然需要系统能够支持多个程序同时运行,即使内存可以满足其中单独一个程序的需求,但是从总体上来看内存仍然满足不了日益增长的软件的需求(感觉和xxx和xxx 的矛盾很相似)。而交换技术并不是一个很有效的方案,在一些中小应用程序尚可使用交换,如果应用程序过大,难道还要每次交换几 GB 的内存?这显然是不合适的,一个典型的 SATA 磁盘的峰值传输速度高达几百兆/秒,这意味着需要好几秒才能换出或者换入一个 1 GB 的程序。 SATA(Serial ATA)硬盘,又称串口硬盘,是未来 PC 机硬盘的趋势,已基本取代了传统的 PATA 硬盘。 那么还有没有一种有效的方式来应对呢?有,那就是使用 虚拟内存(virtual memory) ,虚拟内存的基本思想是,每个程序都有自己的地址空间

单片机内部结构(干货)

假装没事ソ 提交于 2020-03-06 03:07:19
程序计数器PC(Program Counter): 存放着下一条将要从程序存储器中取出的指令的地址。 工作方式: ① 程序计数器PC自动加1。 ②程序计数器将被置入新的数值。 ③ 在执行子程序或响应中断时:将PC的当前值(可称为断点值)自动送入堆栈;将子程序的入口地址或中断向量地址送入PC,程序流向发生变化,执行子程序或中断服务程序。 51单片机存储器采用 哈佛(Harvard)结构 , 即将程序存储器和数据存储器截然分开,程序存储器和数据存储器各有自己的寻址方式、寻址空间和控制系统。 51单片机的4个物理存储空间相当于3个逻辑存储空间。 程序存储器ROM: (内外统一编址) 用来存放暂时性的数据、运算的中间结果或用作堆栈。 随时进行数据的写入和读出,关闭电源时,其所存储的信息将丢失。 特殊存储器单元: 0000H:复位后程序自动运行的首地址 0003H:外部中断0入口地址 000BH:定时器0溢出中断入口地址 0013H:外部中断1入口地址 001BH:定时器1溢出中断入口地址 0023H:串行口中断入口地址 程序一般应安排在0030H地址以后 数据存储器RAM: 用来存放MCU的固定系统程序、应用程序、数据或表格。如系统监控程序等。 写入信息后不易改写的存储器。断电后,其中的信息保留不变。 ①工作寄存器区(含寄存器组0 ~ 3): 寄存器组0:地址00H~07H 寄存器组1

【汇编】SI DI 的用法

风格不统一 提交于 2020-03-04 22:50:28
一、汇编语言中,为什么SI和DI不能同时使用汇编 其实你可以想一下,这两个寄存器的意思,SI源变址寄存器,DI目地变址寄存器,既然是变址寄存器,那么他们肯定是在某个地址的基础上进行偏移变化,由此我们就得出了需要基址寄存器。 你要是把这两个寄存器同时使用,那你地址变化的基址都没有,你该怎么变化呢?你在谁的基础上变化(也就是地址偏移)? 对于这些汇编中的规定,其实有时并不需要书上详细的介绍,我们都应该可以从中推导出这些规则,书上的那些介绍个人认为只是用来验证我们的推测的。或是对我们所掌握的知识的进行检测,用来说明我们所掌握的是对的! 1:数据寄存器,一般称之为通用寄存器组 8086 有8个8位数据寄存器, 这些8位寄存器可分别组成16位寄存器: AH&AL=AX:累加寄存器,常用于运算; BH&BL=BX:基址寄存器,常用于地址索引; CH&CL=CX:计数寄存器,常用于计数; DH&DL=DX:数据寄存器,常用于数据传递。 2:地址寄存器/段地址寄存器 为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址: CS(Code Segment):代码段寄存器; DS(Data Segment):数据段寄存器; SS(Stack Segment):堆栈段寄存器; ES(Extra Segment):附加段寄存器。 3:特殊功能的寄存器 IP(Instruction

MMU内存管理单元

女生的网名这么多〃 提交于 2020-03-03 20:52:13
arm-linux学习-(MMU内存管理单元) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器、物理存储器的控制线路,同时也负责 虚拟地址映射为物理地址 ,以及提供硬件机制的内存访问授权、多任务多进程操作系统。(来自百度百科, 对其几个点不熟悉,因此可以只考虑加粗部分 ) 发展历史 注意:学习一个知识点,很重要的一步是了解其 为什么而存在?它的存在是为了解决什么问题? 然后,在学习的过程中带着这些问题去理解、去思考。 在许多年以前,还是使用DOS或一些古老的操作系统时,内存很小,同时,应用程序也很小,将程序存储在内存中基本能够满足需要。随着科技的发展,图形界面及一些其他更复杂的应用出现,内存已经无法存储这些应用程序了,通常的解决办法是将程序分割成很多个 覆盖块 ,覆盖块0最先运行,运行结束之后,就调用另一个覆盖块,虽然这些操作由OS来完成,但是,需要程序员对程序进行分割,这非常不高效;因此,人们想出了一个 虚拟存储器(virtual memory) 的方法。虚拟存储器的基本思想是:程序、数据、堆栈的总大小可以超过内存空间的大小,操作系统将当前运行的部分保存在内存中,未使用的部分保存在磁盘中。比如一个16MB的程序和一个内存只有4MB的机器,操作系统通过选择可以决定哪部分4MB的程序内容保存在内存中,并在需要时,在内存与磁盘中交换程序代码

Linux

对着背影说爱祢 提交于 2020-03-02 07:40:02
在linux内核的源代码中,以汇编语言编写的程序或程序段,有两种不同的形式。 第一种事完全的汇编代码,这样的代码采用.s作为文件的后缀。事实上,尽管是完全的汇编代码,现代的汇编工具也吸收了C语言的长处,也在汇编之前加上了一趟预处理,而预处理之前的文件则以.s为后缀。此类(.s)文件也和C程序一样,可以使用#include、#ifdef等等成分,而数据结构也一样可以在.h的文件中加以定义。 第二种是嵌在C程序中的汇编语言片断。虽然在ANSI的C语言标准中并没有关于汇编片段的规定,事实上各种实际使用的C编译中都作了这方面的扩充,而 GNU的C编译gcc也在这方面作了很强的扩充。 在DOS/windows领域中,386汇编语言都采用Intel定义的语句格式。可是,在Unix领域中,采用的却是由AT&T定义的格式。 AT&T的汇编与Intel的汇编主要有以下的区别: 在Intel格式中大多使用大写字母,而在AT&T格式中都使用小写字母。 在AT&T格式中,寄存器名要加上“%”作为前缀 ,而在Intel格式中不带前缀。 在AT&T的386汇编语言中,指令的源操作数的顺序与在Intel的386汇编语言中正好相反。 在AT&T格式中,访问指令的操作数的宽度有操作码名称的最后一个字母(操作码的后缀决定)。用作操作码后缀的字母有b(8位)。 w(16位)和1(32位)。 而在Intel格式中

汇编语言-寄存器

☆樱花仙子☆ 提交于 2020-03-01 09:36:35
3.1 字和数据段 1. 字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。 2. 用mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。 3. [address]表示一个偏移地址位address的内存单元。 4. 在内存和寄存器之间传送字行数据时,高地址单元和高8位寄存器,低地址单元和低8位寄存器相对。 5. mov, add, sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。 3.2 栈 1. 在SS,SP中存放栈顶的段地址和偏移地址;提供入栈和出栈指令,他们根据SS:SP指示的地址,按照栈的方式访问内存单元。 2. push指令的执行步骤:SP = SP - 2;向SS:SP指向的字单元中送入数据。 3. pop指令的执行步骤:从SS:SP指向的字单元中读取数据;SP = SP + 2。 4. 任意时刻,SS:SP指向栈顶元素。 5. 8086CPU只记录栈顶,栈空间,的大小我们要自己管理。 6. 用栈来暂存以后需要恢复的寄存器的内容,寄存器出栈的顺序要和入栈的顺序相反。 7. push,pop实质上是一种内存传送指令,注意他们的灵活应用。 3.3 栈段 对于8086PC机,在编程时,可以根据需要,将一组内存单元定义位一个段。我们可以将长度为N(N ≤

嵌入式C语言编程小知识总结

試著忘記壹切 提交于 2020-03-01 08:38:58
嵌入式C语言编程小知识总结 1. 流水线被指令填满时才能发挥最大效能,即每时钟周期完成一条指令的执行(仅指单周期指令)。如果程序发生跳转,流水线会被清空,这将需要几个时钟才能使流水线再次填满。因此,尽量少的使用跳转指令可以提高程序执行效率,解决发案就是尽量使用指令的“条件执行”功能。 2. 在LPC2200系列中: 可以通过过下面的程序延迟10毫秒: for(i=0;i<200;i++) { for(j=0;j<200;j++); } 3. 通过下面语句将一个16位的变量放在两个8位的变量中。 //IP数据报总长度高字节 IpHeadUint8[10]=(IpHead.e_ip.Crc&0xff00)>>8; //IP数据报总长度低字节 IpHeadUint8[11]=IpHead.e_ip.Crc&0x00ff; 4. 在对全部数组元素赋初值时,可以不指定数组长度。 eg;inta[]={1,2,3,4,5}; 但如果当输出第a[5]以上的元素时,系统回输出随机数值,所以使用此方法时,不能使用超过初始值元素以上的元素。 5. 由于ADS先天性的对printf不支持;因此不便于我们调试,可以利用串口输出来代替printf来调试。 6. 用或运算,可使某位置为1,其它位不变 eg: PINSEL0 |= 0x00000005; //设置串口引脚 使第0位和第二位置一,其他位不变。 7