状态寄存器

时钟与复位

痞子三分冷 提交于 2020-01-25 18:01:10
内容: 主要涵盖了设计者在设计模块或者知识产权(Intellectual Preoperty)时所要用到的一些建议。 同步设计(对ASIC时序控制最安全的方法): 由单个主时钟和主置位/复位信号驱动设计中所有的时序器件。 一、避免使用行波计数器 含义:即使用触发器输出作为下一级触发器的时钟输入端 缺点: 由于第一个触发器的输出响应导致第二个触发器的时钟输入相对于时钟信号产生偏移(延迟); 无法 在每个时钟边沿都激活 :由于延迟问题,当时钟发生跳变时,第一个触发器的输出未发生变化,从而导致第二个触发器的时钟输入变化较时钟信号晚;在每个时钟边沿都激活?可能在某几个时钟边沿激活?考虑的是第二个触发器的激活? 优点:能够减少电路的漏电流并降低电路的功耗,在低功耗设计中会取得很好的效果; 二、避免使用门控时钟 前端设计注意:含门控时钟的设计在仿真过程中可能工作正常,但是综合时会出现问题; 含义:在时钟线上使用门控单元,使用门控逻辑使能信号开关时钟; 优点:能够有效减少功耗,当时钟被门控电路关闭后,门控时钟在根部将时钟关闭,该时钟网络和其中的寄存器都会停止翻转,从而减少功耗; 同步设计中的功耗来源: 在每个时钟边沿变化的组合逻辑所产生的功耗(由触发器驱动这些逻辑组合); 由触发器产生的功耗(及时在触发器的输入和内部状态不发生变化,该功耗仍存在); 时钟树产生的功耗(通常占到总功耗的50%);

DSP程序中常出现的EINT、DINT、ERTM、DRTM、EALLOW、EDIS的理解

风格不统一 提交于 2020-01-25 10:06:48
对DSP程序中常出现的EINT、DINT、ERTM、DRTM、EALLOW、EDIS的理解 在看DSP 的初始化程序中经常会看到 void DisableDog ( void ) { EALLOW ; SysCtrlRegs . WDCR = 0x0068 ; EDIS ; } EALLOW与EDIS究竟有什么含义呢? 在.h文件中会发现,这两条其实是汇编指令 # define EALLOW asm(" EALLOW") # define EDIS asm(" EDIS") 同样的还有: # define EINT asm(" clrc INTM") //INTM置0,开中断 # define DINT asm(" setc INTM") //INTM置1,关中断 # define ERTM asm(" clrc DBGM") //使能调试事件 # define DRTM asm(" setc DBGM") //禁止调试事件 解释: TI系列DSP为了提高安全性能,将很多关键寄存器作了保护处理。通过状态寄存器1(ST1)的位6设置与复位,来决定是否允许DSP指令对关键寄存器进行操作。这些关键寄存器包括:器件仿真寄存器、FLASH寄存器、CSM寄存器、PIE矢量表、系统控制寄存器、GPIOMux寄存器等等。 DSP由于在上电复位之后,状态寄存器基本上都是清零

x86对抗栈回溯检测

社会主义新天地 提交于 2020-01-24 05:40:27
1.原理 函数调用 CALL 指令可拆分为两步操作: 1)、 将调用者的下一条指令( EIP )的地址压栈 2)、 跳转至将要调用的函数地址中(相对偏移或绝对地址) 那么在执行到子函数首地址位置时,返回地址(即调用函数中调用位置下一条指令的地址)就已经存在于堆栈中了,并且是 ESP 指向地址的值。下面通过栈帧的概念,了解编译器在接下来对堆栈进行的操作。 简言之,栈帧就是利用 EBP (栈帧指针,请注意不是 ESP )寄存器访问栈内部局部变量、参数、函数返回地址等的手段。程序运行中, ESP 寄存器的值随时变化,访问栈中函数的局部变量、参数时,若以 ESP 值为基准编写程序会十分困难,并且也很难使 CPU 引用到正确的地址。 所以,调用某函数时,先要把用作基准点(函数起始地址)的 ESP 值保存到 EBP ,并维持在函数内部。这样,无论 ESP 的值如何变化,以 EBP 的值为基准能够安全访问到相关函数的局部变量、参数、返回地址,这就是 EBP 寄存器作为栈帧指针的作用。 在函数体代码的任何位置,EBP 寄存器指向的地址始终存储属于它的调用函数的 EBP 的值,根据这个原理可逐级向调用函数、调用函数的调用函数进行遍历,向上回溯。 这样有什么用呢? 在将属于调用函数的 EBP 的值压栈之前, ESP 指向的地址存储的是由 CALL 指令压栈的调用函数中调用位置的下一条指令的地址(原

乘法器的优化1

人走茶凉 提交于 2020-01-24 03:18:49
计算机的最大优势在于它的运算速度。因此,当我们设计计算机当中的一个功能部件时,在保证其功能正确性的前提下,就得考虑它是否拥有足够好的性能。那么在这一节,我们就要一起对这个乘法器进行性能上的分析和优化。 首先,我们来快速回顾一下N位乘法器的工作流程。 当我们做好初始化工作之后,首先检查乘数寄存器的最低位。如果最低位为1,那么就将被乘数寄存器和乘积寄存器的内容相加,并将结果放入到乘积寄存器当中。那么这一步实际上是控制逻辑给出了若干个控制信号,包括让加法器完成加法运算,并给了乘积寄存器写入的控制信号。因为加法器的输出是连接到乘积寄存器的输入端的,所以在下一个时钟上升沿来临的时候,乘积寄存器就会对加法器的输出进行采样并保存起来,这就完成了这一步所指的工作。 然后控制逻辑会向被乘数寄存器发出左移的控制信号,在下一个时钟上升沿来临的时候,被乘数寄存器就会完成左移一位的工作。当然,如果在第一步中检查的乘数寄存器的最低位是0,那控制逻辑就不会给出让加法器进行运算,和让乘积寄存器进行写入的控制信号,而会进入到第2步,完成被乘数寄存器左移的工作。再到下一个时钟上升沿,乘数寄存器会发现其右移的控制信号有效,所以它就完成一次右移的工作。 然后判断是否已经到了第N次循环。如果没有,说明运算还没有结束,再回到第1步继续执行;如果发现已经是第N次循环,说明运算已经完成。运算的结果就在当前的乘积寄存器当中。

FreeRTOS 中断优先级配置(重要)

為{幸葍}努か 提交于 2020-01-24 03:01:52
以下转载自安富莱电子: http://forum.armfly.com/forum.php NVIC 的全称是 Nested vectored interrupt controller,即嵌套向量中断控制器。 对于 M3 和 M4 内核的 MCU,每个中断的优先级都是用寄存器中的 8 位来设置的。 8 位的话就可以 设置 2^8 = 256 级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如 ST 的 STM32F1xx 和 F4xx 只使用了这个 8 位中的高四位[7:4],低四位取零,这样 2^4=16,只能表示 16 级中断嵌套。 对于这个 NVIC,有个重要的知识点就是优先级分组,抢占优先级和子优先级,下面就以 STM32 为 例进行介绍,STM32F1xx 和 F4xx 都是只使用了这个 8 位寄存器的高四位[7:4]。 从上面的表格可以看出,STM32 支持 5 种优先级分组,系统上电复位后,默认使用的是优先级分组 0,也就是没有抢占式优先级,只有子优先级,关于这个抢占优先级和这个子优先级有几点一定要说清楚。  具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中 断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。  在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来

操作系统导论读书笔记—虚拟化CPU之调度

那年仲夏 提交于 2020-01-22 16:11:09
虚拟化CPU之调度 1. 底层机制 1.1 用户模式与内核模式 1.1.1 系统调用 1.1.2 用户态与内核态切换过程 1.2 进程间切换 1.2.1 协作方式:等待系统调用 1.2.2 非协作方式:操作系统控制 1.2.3 保存和恢复上下文 1.2.4 时间中断进程切换 2. 调度策略 2.1 进程调度的相关概念 2.1.1 调度的性能指标 2.1.2 IO消耗型和CPU消耗型进程 2.1.3 进程优先级 2.1.4 时间片 2.2 几种基本调度算法 2.2.1 先入先出FIFO 2.2.2 最短任务优先SJF 2.2.3 最短完成时间优先STCF 2.2.4 轮转调度RR 2.2.5 总结对比 2.3 经典调度算法 2.3.1 多级反馈队列MLFQ 2.3.2 比例份额调度 2.4 多处理器调度 2.4.1 多处理器的特性 2.4.2 单队列调度 2.4.3 多队列调度 2.4.4 linux多处理器调度 1. 底层机制 操作采用时分共享CPU的方式实现虚拟化CPU。在实现虚拟化的同时,我们要保证整体性能且不失去CPU的控制权。 1.1 用户模式与内核模式 为了防止某个任务抢夺所有资源或者影响其它任务的运行,我们需要限制进程的操作,保证操作系统的控制权。 在用户模式下,应用程序不能完全访问硬件资源。在内核模式下,操作系统可以访问机器的全部资源。并提供了内核态与用户态的切换方式

ARMV8体系结构简介:AArch64系统级体系结构之编程模型(2)- 寄存器

元气小坏坏 提交于 2020-01-21 14:11:15
1. 前言 2. 指令运行与异常处理寄存器 ARM体系结构的寄存器分为两类: (1)系统控制和状态报告寄存器 (2)指令处理寄存器,如累加、异常处理 本部分将主要介绍如上第(2)部分的寄存器,分为AARCH64 state和AARCH32 state 2.1 AARCH64下指令运行与异常处理寄存器 寄存器类型 Bit 描述 X0-X30 64bit 通用寄存器,如果有需要可以当做32bit使用:W0-W30 V0-V31 128bit 32个浮点寄存器,用于标量的浮点操作和向量或标量的SIMD操作 XZR 64bit Zero寄存器,写入此寄存器的数据被忽略,读出的数据全为0 WZR 32bit Zero寄存器的32bit形式 LR (X30) 64bit 通常称X30为程序链接寄存器,保存跳转返回信息地址 ELR_ELx 64bit 异常链接寄存器,保存异常进入ELx的异常地址(x={1,2,3}) SP_ELx 64bit 每个异常级别都有一个专用的SP寄存器,若PSTATE.M[0] ==1,则每个ELx选择SP_ELx(x={0,1,2,3}),否则选择同一个SP_EL0 PC 64bit 程序计数器,俗称PC指针,总是指向即将要执行的下一条指令 SPSR_ELx 32bit 保存进入ELx的PSTATE状态信息(x={1,2,3}) NZCV [31:28]:

程序执行的过程 - 一文看懂计算机执行程序的过程

旧街凉风 提交于 2020-01-20 13:15:53
程序就是指令的集合,为使计算机按预定要求工作,首先要编制程序。程序是一个特定的指令序列,它告诉计算机要做哪些事,按什么步骤去做。指令是一组二进制信息的代码,用来表示计算机所能完成的基本操作。   1、程序   程序是为求解某个特定问题而设计的指令序列。程序中的每条指令规定机器完成一组基本操作。如果把计算机完成一次任务的过程比作乐队的一次演奏,那么控制器就好比是一位指挥,计算机的其它功能部件就好比是各种乐器与演员,而程序就好像是乐谱。计算机的工作过程就是执行程序的过程,或者说,控制器是根据程序的规定对计算机实施控制的。例如,对于算式      计算机的解题步骤可作如下安排:   步骤1:取a ;   步骤2:取b ;   步骤3:判断 ;   若 b≥0,执行步骤4   若b<0,执行步骤6   步骤4:执行a+b;   步骤5:转步骤7;   步骤6:执行a-b;   步骤7:结束。   计算机的工作过程可归结为:取指令→分析指令→执行指令→再取下一条指令,直到程序结束的反复循环过程。通常把其中的一次循环称为计算机的一个指令周期。总之,我们可把程序对计算机的控制归结为每个指令周期中指令对计算机的控制。   2、指令   程序是由指令组成的。指令是机器所能识别的一组编制成特定格式的代码串,它要求机器在一个规定的时间段(指令周期)内,完成一组特定的操作

[转载] 32位汇编指令笔记

守給你的承諾、 提交于 2020-01-19 23:15:54
32位CPU所含有的寄存器有: PQJI~u9te} 4个数据寄存器(EAX、EBX、ECX和EDX) <,\Op=$l3I 2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP) ']'V?@H]4 6个段寄存器(ES、CS、SS、DS、FS和GS) ZaKT~f%%z 1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) f*HEw 1、数据寄存器 s ~ Xa= +D 数据寄存器主要用来保存操作数和运算结果等信息,从而节省读取操作数所需占用总线和访问存储器的时间。 3Gyw^ {J 32位CPU有4个32位的通用寄存器EAX、EBX、ECX和EDX。 {!]7=K)W9 对低16位数据的存取,不会影响高16位的数据。 COnb@uD 这些低16位寄存器分别命名为:AX、BX、CX和DX,它和先前的CPU中的寄存器相一致。 90rY:!e 4个16位寄存器又可分割成8个独立的8位寄存器(AX:AH-AL、BX:BH-BL、CX:CH-CL、DX:DH-DL),每个寄存器都有自己的名称,可独立存取。 ~bsL W:.’ 程序员可利用数据寄存器的这种“可分可合”的特性,灵活地处理字/字节的信息。 %‘L+y 寄存器EAX通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。可用于乘、 除、输入/输出等操作,使用频率很高; E

ARM 汇编基础

你。 提交于 2020-01-19 18:47:10
转载连接: 1 ARM汇编以及汇编语言基础介绍 2 ARM汇编中的数据类型 3 ARM汇编常用指令集 4 ARM汇编内存访问相关指令 5 ARM汇编之连续存取 6 ARM汇编之条件执行与分支 7 ARM汇编之栈与函数 英文原文链接: https://azeria-labs.com/arm-data-types-and-registers-part-2/ 本文只是转载部分内容,具体请参考原文。 1. ARM汇编基础介绍 1.1 ARM VS. INTEL ARM处理器Intel处理器有很多不同,但是最主要的不同怕是指令集了。Intel属于复杂指令集(CISC)处理器,有很多特性丰富的访问内存的复杂指令集。因此它拥有更多指令代码以及取址都是,但是寄存器比ARM的要少。复杂指令集处理器主要被应用在PC机,工作站以及服务器上。 ARM属于简单指令集(RISC)处理器,所以与复杂指令集先比,只有简单的差不多100条指令集,但会有更多的寄存器。与Intel不同,ARM的指令集仅仅操作寄存器或者是用于从内存的加载/储存过程,这也就是说,简单的加载/存储指令即可访问到内存。这意味着在ARM中,要对特定地址中存储的的32位值加一的话,仅仅需要从内存中加载到寄存器,加一,再从寄存器储存到内存即可。 简单的指令集既有好处也有坏处。一个好处就是代码的执行变得更快了。