状态寄存器

嵌入式系统开发期末复习

▼魔方 西西 提交于 2020-01-07 06:24:09
一、简答题 1.什么是嵌入式系统?有什么特点?应用在哪些领域? 嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。 特点:专用性,嵌入性,计算机系统。 应用领域:工业制造、过程控制、通信、仪器、仪表、汽车、轮船、航空等领域。 2.嵌入式系统组成?嵌入式处理器如何分类?典型的嵌入式处理器有哪些? 组成:嵌入式处理器、外围设备、嵌入式操作系统、应用软件等。 分类:嵌入式微处理器,嵌入式微控制器,嵌入式DSP处理器,SoC片上系统。 典型嵌入式处理器:arm,x86处理器,PowerPC处理器 3.操作系统概念,什么是EOS?常用的EOS有哪些? 嵌入式操作系统(EOS)是一种支持嵌入式系统应用的操作系统软件,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器。 常见的EOS:Linux,uLinux,WinCE等。 4.嵌入式系统开发主要步骤和流程 5.哈佛结构&&普林斯顿结构 哈佛结构是一种将程序中指令和数据分开存储的存储器结构,是一种并行存储体系结构。 普林斯顿结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构。 6.CISC&&RISC及特点对比 RISC(精简指令计算机)和CISC(复杂指令集计算机)是两种不同的CPU架构。 CISC

FreeRTOS 任务栈大小确定及其溢出检测

ε祈祈猫儿з 提交于 2020-01-06 01:42:22
以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的任务栈设置 不管是裸机编程还是 RTOS 编程,栈的分配大小都非常重要。 局部变量,函数调用时的现场保护和返 回地址,函数的形参,进入中断函数前和中断嵌套等都需要栈空间,栈空间定义小了会造成系统崩溃。 裸机的情况下,用户可以在这里配置栈大小: 为什么是堆中的?因为我们采用的就是动态创建任务的方式。如果静态创建,就和我们自己开辟的空间有关,通常静态创建任务用数组作为容器,但是通常静态创建的方式我们都不使用。 FreeRTOS 的系统栈设置 上面跟大家讲解了什么是任务栈,这里的系统栈又是什么呢?裸机的情况下,凡是用到栈空间的地方 都是在这里配置的栈空间: 在 RTOS 下, 上面两个截图中设置的栈大小有了一个新的名字叫系统栈空间 ,而任务栈是不使用这里的空间的。 任务栈不使用这里的栈空间,哪里使用这里的栈空间呢?答案就在中断函数和中断嵌套。  由于 Cortex-M3 和 M4 内核具有双堆栈指针,MSP 主堆栈指针和 PSP 进程堆栈指针,或者叫 PSP 任务堆栈指针也是可以的。在 FreeRTOS 操作系统中,主堆栈指针 MSP 是给系统栈空间使用的,进 程堆栈指针 PSP 是给任务栈使用的。 也就是说,在 FreeRTOS 任务中,所有栈空间的使用都是通过 PSP

汇编语言---GCC内联汇编

我怕爱的太早我们不能终老 提交于 2020-01-05 09:57:48
GCC支持在C/C++代码中嵌入汇编代码,这些代码被称作是"GCC Inline ASM"(GCC内联汇编); 一、基本内联汇编 GCC中基本的内联汇编非常易懂, 格式如下 : __asm__ [__volatile__] ("instruction list"); 其中, 1.__asm__ : 它是GCC定义的关键字 asm 的宏定义(#define __asm__ asm),它用来声明一个内联汇编表达式,所以,任何一个内联汇编表达式都以它开头,它是必不可少的;如果要编写符合ANSI C标准的代码(即:与ANSI C兼容),那就要使用__asm__; 2.__volatile__ : 它是GCC关键字 volatile 的宏定义;这个选项是可选的;它向GCC声明"不要动我所写的instruction list,我需要原封不动地保留每一条指令";如果不使用__volatile__,则当你使用了优化选项-O进行优化编译时,GCC将会根据自己的判断来决定是否将这个内联汇编表达式中的指令优化掉;如果要编写符合ANSI C标准的代码(即:与ANSI C兼容),那就要使用__volatile__; 3.instruction list : 它是汇编指令列表;它可以是空列表,比如:__asm__ __volatile__("");或__asm__("");都是合法的内联汇编表达式

volatile的作用

孤街醉人 提交于 2020-01-05 06:26:43
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求volatile变量。不懂得volatile内容将会带来灾难。 假设被面试者正确地回答了这是问题(嗯,怀疑这否会是这样),我将稍微深究一下,看一下这家伙是不是直正懂得volatile完全的重要性。 1). 一个参数既可以是const还可以是volatile吗?解释为什么。 2). 一个指针可以是volatile 吗?解释为什么。 3). 下面的函数有什么错误: int square(volatile int *ptr) { return *ptr * *ptr; } 下面是答案: 1). 是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变

C语言中的volatile

痴心易碎 提交于 2020-01-05 04:49:47
1.volatile有什么含义?有什么用法? 官方定义是: 一个变量也许会被后台程序改变。 关键字volatile与const绝对独立。它指示一个变量也许会被某种方式修改,这种方式按照正常程序流程分析是无法预知的(例如,一个变量也许会被一个中断服务程序所修改)。这个关键字使用以下语法定义: volatile data-defiinition; 注:变量如果加了voletile修饰,则会从内存中重新装载内容,而不是直接从寄存器中拷贝内容。 2.编译器的优化 在本次线程内,当读取一个变量时,为了提高读取速度,编译器进行优化时有时会先把变量读取到一个寄存器中;以后,再读取变量值时,就直接从寄存器中读取;当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以保持一致。 当变量因别的线程值发生改变,上面寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。 3.常见的问题 (1)说明关键字volatile有什么含意,并给出例子。 volatile表示被修饰的符号是易变的。告诉编译器不要随便优化我的代码!! *一个硬件寄存器 *中断中用到的变量 *线程之间共享变量 volatile int a = 10; while((a & 0x01) == 0); #define P_UART_STATUS ((const volatile unsigned int *

c 语言 volatile 关键字

∥☆過路亽.° 提交于 2020-01-05 04:15:16
一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器;调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令。对常规内存进行优化的时候,这些优化是透明的,而且效率很好。由编译器优化或者硬件重新排序引起的问题的解决办法是在从硬件(或者其他处理器)的角度看必须以特定顺序执行的操作之间设置内存屏障(memory barrier), Linux 提供了一个宏解决编译器的执行顺序问题。 void Barrier(void) 这个函数通知编译器插入一个内存屏障,但对硬件无效,编译后的代码会把当前CPU寄存器中的所有修改过的数值存入内存,需要这些数据的时候再重新从内存中读出。 2.volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以消除一些代码。但有时这些优化不是程序所需要的

C语言中volatile关键字的作用

放肆的年华 提交于 2020-01-05 04:12:32
一.前言   编译器优化介绍:    由于内存访问速度远不及CPU处理速度,为提高机器整体性能, 1)在硬件上: 引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。 2)软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。 编译器优化常用的方法有:将内存变量缓存到寄存器。 由于访问寄存器要比访问内存单元快的多,编译器在存取变量时,为提高存取速度,编译器优化有时会先把变量读取到一个寄存器中;以后再取变量值时就直接从寄存器中取值。但在很多情况下会读取到脏数据,严重影响程序的运行效果。 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- 二.volatile详解 1.原理作用:   Volatile 意思是“易变的”,应该解释为“直接存取原始内存地址”比较合适。   “易变”是因为外在因素引起的,像多线程,中断等;   C 语言书籍这样定义 volatile 关键字:

基于FPGA的SPI协议及设计实现

江枫思渺然 提交于 2020-01-01 05:19:06
基于FPGA的SPI协议及设计实现 博主微信:flm13724054952,不懂的有疑惑的也可以加微信咨询,欢迎大家前来投稿,谢谢! 引言介绍 在电子通信领域里采用的通信协议有IIC,SPI,UART,FSMC等协议。本文将基于FPGA来介绍并设计标准的SPI总线协议,实现FPGA与MCU的数据通信。SPI是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI是一种高速的、全双工、同步通信总线,标准的SPI也仅仅使用4个引脚,常用于FPGA和 EEPROM、FLASH、数字信号处理器等器件的数据通信。 SPI的原理介绍 SPI的通信方式是主从方式通信。这种模式通常只有一个主机和一个从机或者一个主机和多个从机;一般来说,标准的SPI协议是由4根线组成,分别是SSEL(从机片选使能信号,也写作 SCS,CSB)、SCLK(串行时钟,也写作SCK)、MOSI(主机输出从机输入Master Output/Slave Input)和MISO(主机输入从机输出Master Input/Slave Output)。有的SPI接口芯片带有中断信号INT,也有的SPI接口芯片只作为从机使用故只有MISO口,不过这里本文将基于FPGA来介绍并设计标准的SPI总线协议。 SPI的标准接口 CSB:从设备片选使能信号。注意的是

嵌入式Linux内核I2C子系统详解

萝らか妹 提交于 2019-12-31 19:44:41
1.1 I2C总线知识 1.1.1 I2C总线物理拓扑结构 I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。 1.1.2 I2C总线特征 I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(可以从I2C器件的数据手册得知),主从设备之间就通过这个地址来确定与哪个器件进行通信,在通常的应用中,我们把CPU带I2C总线接口的模块作为主设备,把挂接在总线上的其他设备都作为从设备。 I2C总线上可挂接的设备数量受总线的最大电容400pF 限制,如果所挂接的是相同型号的器件,则还受器件地址位的限制。 I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。 I2C总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。 1.1.3 I2C总线协议 I2C协议规定,总线上数据的传输必须以一个起始信号作为开始条件,以一个结束信号作为传输的停止条件。起始和结束信号总是由主设备产生

【汇编语言与计算机系统结构笔记04】80x86计算机组织、保护模式、存储器、寄存器、计算机系统结构金字塔

痴心易碎 提交于 2019-12-30 20:13:04
本次笔记内容: 05.80x86计算机组织 文章目录 计算机系统 存储器 / 主存(main memory) 80x86处理器与保护模式 历史 8086 / 8088 微处理器 80186和80286微处理器 80286 CPU基本工作方式 32位80x86微处理器 80386微处理器 80x86的三种工作模式 32位微处理器的寄存器 保护模式下的80x86(段模式) 寄存器与处理器的比较 计算机体系结构金字塔 计算机系统 如上图,CPU与主存间,通过一个bridge(总线)相连。上图还是比较抽象的,当前,CPU的一个趋势是,集成程度越来越高。 CPU中,PC即当前指令的地址,ALU是arithmetic and logic unit即计算路径。目前Memory Control、集成显卡等已经集成到CPU中了。 现在即便集成度(晶体管)提升,但性能并没有提升。因为程序往往是串行的,并行性有限。 上图中,在代码被从Disk中load到主存中,被CPU处理,再把信息投入显示器。 存储器 / 主存(main memory) 存储单元的地址和内容: 存储器以字节(8 bit)为单位存储信息; 每个字节单元有一个地址,从0编号,顺序加1; 地址用二进制数表示(无符号整数,写成十六进制); 一个32位字要占用相继的四个字节,低位字节存入低地址,高位字节存入高地址; 机器以字对齐地址访问(读/写