当前位置: 首页 > news >正文

360怎么做网站搜索杭州网站建设seo优化

360怎么做网站搜索,杭州网站建设seo优化,动态页面怎么做,10_10_网站建站参考#xff1a;嵌入式软件工程师笔试面试指南-ARM体系与架构 作者#xff1a;嵌入式与Linux那些事 发布时间#xff1a; 2021-04-28 15:22:06 网址#xff1a;https://blog.csdn.net/qq_16933601/article/details/116234673 目录 ARM体系与架构硬件基础NAND FLASH 和NOR F… 参考嵌入式软件工程师笔试面试指南-ARM体系与架构 作者嵌入式与Linux那些事 发布时间 2021-04-28 15:22:06 网址https://blog.csdn.net/qq_16933601/article/details/116234673 目录 ARM体系与架构硬件基础NAND FLASH 和NOR FLASH异同CPU,MPU,MCU,SOC,SOPC联系与差别什么是交叉编译为什么需要交叉编译描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别 ARM处理器什么是哈佛结构和冯诺依曼结构什么是ARM流水线技术ARM有几种工作模式Arm有多少32位寄存器Arm2440和6410有什么区别ARM指令集分为几类通用寄存器包括R0R15可以分为具体哪三类Arm处理器有几种工作状态ARM系统中在函数调用的时候参数是通过哪种方式传递的为什么2440的内存起始地址是0x30000000ARM协处理器指令包括哪3类请描述它们的功能。什么是PLL锁相环 中断与异常中断与异常有何区别中断与DMA有何区别中断能不能睡眠为什么下半部能不能睡眠中断的响应执行流程是什么当一个异常出现以后ARM微处理器会执行哪几步操作写一个中断服务需要注意哪些如果中断产生之后要做比较多的事情你是怎么做的为什么FIQ比IRQ要快中断和轮询哪个效率高怎样决定是采用中断方式还是采用轮询方式去实现驱动 通信协议什么是异步传输和同步传输RS232和RS485通讯接口有什么区别SPI协议IIC协议 编程嵌人式编程中什么是大端什么是小端如何判断计算机处理器是大端还是小端如何进行大小端的转换如何对绝对地址0x100000赋值 关于作者 ARM体系与架构 硬件基础 NAND FLASH 和NOR FLASH异同 不同点 类别NORNAND读快 像访问SRAM一样可以随机访问任意地址的数据如unsighed short *pwAddr (unsighed short *)0x02;unisignded short wVal;wVal *pwAddr快,有严格的时序要求需要通过一个函数才能读取数据先发送读命令-发送地址-判断nandflash是否就绪-读取一页数据读命令、发送地址、判断状态、读数据都是通过操作寄存器实现的,如数据寄存器NFDATA写慢写之前需要擦除因为写只能是1-0,擦除可以使0-1快写之前需要擦除因为写只能是1-0,擦除可以使0-1擦除非常慢5S快3msXIP代码可以直接在NOR FLASH上运行NO可靠性比较高位反转的比例小于NAND FLASH的10%比较低位反转比较常见必须有校验措施接口与RAM接口相同地址和数据总线分开I/O接口可擦除次数10000~100000100000~1000000容量小1MB~32MB大16MB~512MB主要用途常用于保存代码和关键数据用于保存数据价格高低注意nandflash和norflash的0地址是不冲突的norflash占用BANK地址而nandflash不占用BANK地址它的0地址是内部的。 相同点 1写之前都要先擦除因为写操作只能使1-0而擦除动作是为了把所有位都变12擦除单元都以块为单位CPU,MPU,MCU,SOC,SOPC联系与差别 1.CPUCentral Processing Unit,是一台计算机的运算核心和控制核心。CPU由运算器、控制器和寄存器及实现它们之间联系的数据、控制及状态的总线构成。差不多所有的CPU的运作原理可分为四个阶段提取Fetch、解码Decode、执行Execute和写回Writeback。 CPU从存储器或高速缓冲存储器中取出指令放入指令寄存器并对指令译码并执行指令。所谓的计算机的可编程性主要是指对CPU的编程。 2.MPU (Micro Processor Unit)叫微处理器不是微控制器通常代表一个功能强大的CPU暂且理解为增强版的CPU吧,但不是为任何已有的特定计算目的而设计的芯片。这种芯片往往是个人计算机和高端工作站的核心CPU。最常见的微处理器是Motorola的68K系列和Intel的X86系列。 3.MCU(Micro Control Unit)叫微控制器是指随着大规模集成电路的出现及其发展将计算机的CPU、RAM、ROM、定时计数器和多种I/O接口集成在一片芯片上形成芯片级的芯片比如51avr这些芯片内部除了CPU外还有RAM,ROM,可以直接加简单的外围器件电阻电容就可以运行代码了而MPU如x86arm这些就不能直接放代码了它只不过是增强版的CPU所以得添加RAM,ROM。 MCU MPU 最主要的区别就睡能否直接运行代码。MCU有内部的RAM ROM而MPU是增强版的CPU需要添加外部RAM ROM才可以运行代码。 4.SOCSystem on Chip指的是片上系统MCU只是芯片级的芯片而SOC是系统级的芯片它既MCU51avr那样有内置RAM,ROM同时又像MPUarm那样强大的不单单是放简单的代码可以放系统级的代码也就是说可以运行操作系统将就认为是MCU集成化与MPU强处理力各优点二合一。 5.SOPCSystem On a Programmable Chip可编程片上系统FPGA就是其中一种上面4点的硬件配置是固化的就是说51单片机就是51单片机不能变为avr而avr就是avr不是51单片机他们的硬件是一次性掩膜成型的能改的就是软件配置说白点就是改代码本来是跑流水灯的改下代码变成数码管而SOPC则是硬件配置软件配置都可以修改软件配置跟上面一样没什么好说的至于硬件是可以自己构建的也就是说这个芯片是自己构造出来的这颗芯片我们叫“白片”什么芯片都不是把硬件配置信息下载进去了他就是相应的芯片了可以让他变成51也可以是avr甚至arm同时SOPC是在SOC基础上来的所以他也是系统级的芯片所以记得当把他变成arm时还得加外围ROMRAM之类的不然就是MPU了。 什么是交叉编译 在一种计算机环境中运行的编译程序能编译出在另外一种环境下运行的代码我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。简单地说就是在一个平台上生成另一个平台上的可执行代码。 这里需要注意的是所谓平台实际上包含两个概念体系结构Architecture、操作系统OperatingSystem。同一个体系结构可以运行不同的操作系统同样同一个操作系统也可以在不同的体系结构上运行。举例来说我们常说的x86 Linux平台实际上是Intel x86体系结构和Linux for x86操作系统的统称而x86 WinNT平台实际上是Intel x86体系结构和Windows NT for x86操作系统的简称。 为什么需要交叉编译 有时是因为目的平台上不允许或不能够安装我们所需要的编译器而我们又需要这个编译器的某些特征有时是因为目的平台上的资源贫乏无法运行我们所需要编译器有时又是因为目的平台还没有建立连操作系统都没有根本谈不上运行什么编译器。 描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别 基于RAM 需要把硬盘和其他介质的代码先加载到ram中加载过程中一般有重定位的操作。速度比基于ROM的快可用RAM比基于ROM的少因为所有的代码数据都必须存放在RAM中。 基于ROM 速度较基于RAM的慢因为会有一个把变量部分代码等从存储器硬盘flash搬移到RAM的过程。 可用RAM资源比基于RAM的多 ARM处理器 什么是哈佛结构和冯诺依曼结构 定义 冯诺依曼结构釆用指令和数据统一编址使用同条总线传输CPU读取指令和数据的操作无法重叠。 哈佛结构釆用指令和数据独立编址使用两条独立的总线传输CPU读取指令和数据的操作可以重叠。 利弊 冯诺依曼结构主要用于通用计算机领域需要对存储器中的代码和数据频繁的进行修改统一编址有利于节约资源。 哈佛结构主要用于嵌入式计算机程序固化在硬件中有较高的可靠性、运算速度和较大的吞吐。 什么是ARM流水线技术 流水线技术通 过多个功能部件并行工作来缩短程序执行时间提高处理器核的效率和吞吐率从而成为微处理器设计中最为重要的技术之一。ARM7处理器核使用了典型三级流水线的冯·诺伊曼结构ARM9系列则采用了基于五级流水线的哈佛结构。通过增加流水线级数简化了流水线各级的逻辑进一步提高了处理器的性能。 PC代表程序计数器流水线使用三个阶段因此指令分为三个阶段执行1.取指从存储器装载一条指令2.译码识别将要被执行的指令3.执行处理指令并将结果写回寄存器。而R15PC总是指向“正在取指”的指令而不是指向“正在执行”的指令或正在“译码”的指令。一般来说人们习惯性约定将“正在执行的指令作为参考点”称之为当前第一条指令因此PC总是指向第三条指令。当ARM状态时每条指令为4字节长所以PC始终指向该指令地址加8字节的地址即PC值当前程序执行位置8 ARM指令是三级流水线取指译指执行同时执行的现在PC指向的是正在取指的地址下一条指令那么cpu正在译指的指令地址是PC-4假设在ARM状态下一个指令占4个字节cpu正在执行的指令地址是PC-8也就是说PC所指向的地址和现在所执行的指令地址相差8。 当突然发生中断的时候保存的是PC的地址PC-84 PC-4 下一条指令的地址 这样你就知道了如果返回的时候返回PC那么中间就有一个指令没有执行所以用SUB pc lr-irq #4。 ARM有几种工作模式 用户模式(USR) 用户模式是用户程序的工作模式它运行在操作系统的用户态它没有权限去操作其它硬件资源只能执行处理自己的数据也不能切换到其它模式下要想 访问硬件资源或切换到其它模式只能通过软中断或产生异常。 系统模式(SYS) 系统模式是特权模式不受用户模式的限制。用户模式和系统模式共用一套寄存器操作系统在该模式下可以方便的访问用户模式的寄存器而且操作系统的 一些特权任务可以使用这个模式访问一些受控的资源。 说明用户模式与系统模式两者使用相同的寄存器都没有SPSRSaved Program Statement Register已保存程序状态寄存器但系统模式比用户模式有更高的权限可以访问所有系统资源。 一般中断模式(IRQ) 一般中断模式也叫普通中断模式用于处理一般的中断请求通常在硬件产生中断信号之后自动进入该模式该模式为特权模式可以自由访问系统硬件资源。 快速中断模式(FIQ) 快速中断模式是相对一般中断模式而言的它是用来处理对时间要求比较紧急的中断请求主要用于高速数据传输及通道处理中。快中断有许多R8~R14自己的专用寄存器发生中断时使用自己的寄存器就避免了保存和恢复某些寄存器。如果异常中断处理程序中使用它自己的物理寄存器之外的其他寄存器异常中断处理程序必须保存和恢复这些寄存器 管理模式SVC 管理模式是CPU上电后默认模式因此在该模式下主要用来做系统的初始化软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时通过软件中断进入该模式。 说明系统复位或开机、软中断时进入到SVC模式下。 终止模式(ABT) 中止模式用于支持虚拟内存或存储器保护当用户程序访问非法地址没有权限读取的内存地址时会进入该模式linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。 未定义模式(UND) 未定义模式用于支持硬件协处理器的软件仿真CPU在指令的译码阶段不能识别该指令操作时会进入未定义模式。 除了用户模式外其它6种模式称为特权模式。所谓特权模式即具有如下权利 a. MRS把状态寄存器的内容放到通用寄存器 b. MSR把通用寄存器的内容放到状态寄存器中。 由于状态寄存器中的内容不能够改变因此要先把内容复制到通用寄存器中然后修改通用寄存器中的内容再把通用寄存器中的内容复制给状态寄存器中即可完成“修改状态寄存器”的任务。 剩下的六种模式中除去系统模式外统称为异常模式。 Arm有多少32位寄存器 ARM处理器共有37个寄存器。它包含31个通用寄存器和6个状态寄存器。 Arm2440和6410有什么区别 主频不同。2440是400M的。6410是533/667M的 处理器版本不一样2440是arm920T内核6410是arm1176ZJF内核 6410在视频处理方面比2440要强很多。内部视频解码器包括MPEG4等视频格式 6410支持WMV9、xvid、mpeg4、h264等格式的硬解码和编码 6410多和很多扩展接口比如tv-out、CF卡和S-Video输出等 spi、串口、sd接口也比那两个要丰富 6410采用的是DDR内存控制器2440采用的是SDRam内存控制器 6410为双总线架构一路用于内存总线、一路用于Flash总线 6410的启动方式更加灵活主要包括SD、Nand Flash、Nor Flash和OneFlash等设备启动 6410的Nand Flash支持SLC和MLC两种架构从而大大扩大存储空间 6410为双总线架构一路用于内存总线、一路用于Flash总线 6410具备8路DMA通道包括LCD、UART、Camera等专用DMA通道 6410还支持2D和3D的图形加速 ARM指令集分为几类 2类分别为Thumb指令集ARM指令集。ARM指令长度为32位Thumb指令长度为16位。这种特点使得ARM既能执行16位指令又能执行32位指令从而增强了ARM内核的功能。 通用寄存器包括R0R15可以分为具体哪三类 通用寄存器包括R0-R15可以分为3类 未分组寄存器R0-R7 在所有运行模式下未分组寄存器都指向同一个物理寄存器他们未被系统用作特殊的用途。因此在中断或异常处理进行异常模式转换时由于不同的处理器运行模式均使用相同的物理寄存器所以可能造成寄存器中数据的破坏。 分组寄存器R8-R14 对于分组寄存器他们每次所访问的物理寄存器都与当前的处理器运行模式相关。 R13常用作存放堆栈指针用户也可以使用其他寄存器存放堆栈指针但在Thumb指令集下某些指令强制要求使用R13存放堆栈指针。 R14称为链接寄存器LRLink Register当执行子程序时R14可得到R15PC的备份执行完子程序后又将R14的值复制回PC即使用R14保存返回地址。 程序计数器PCR15 寄存器R15用作程序计数器PC在ARM状态下位[1:0]为0位[31:2]用于保存PC在Thumb状态下,位[0]为0位[31:1]用于保存PC。 Arm处理器有几种工作状态 从编程的角度来看ARM微处理器的工作状态一般ARM和Thumb有两种并可在两种状态之间切换。 ARM状态此时处理器执行32位的字对齐ARM指令绝大部分工作在此状态。 Thumb状态此时处理器执行16位的半字对齐的Thumb指令。 ARM系统中在函数调用的时候参数是通过哪种方式传递的 当参数小于等于4的时候是通过r0-r3寄存器来进行传递的当参数大于4的时候是通过压栈的方式进行传递。 为什么2440的内存起始地址是0x30000000 S3C2440处理器有八个固定的内存块只有两个是可以作为ROM,SRAM和SDRAM等存储器bank。具体如下图所示。 ARM协处理器指令包括哪3类请描述它们的功能。 ARM协处理器指令包括以下3类 用于ARM处理器初始化ARM协处理器的数据处理操作。 用于ARM处理器的寄存器和ARM协处理器的寄存器间的数据传送操作。 用于在ARM协处理器的寄存器和内存单元之间传送数据。 什么是PLL锁相环 简单来说输入时钟的存在是作为“参考源”。锁相环不是为了单纯产生同频同相信号而是一般集成进某种“频率综合电路”产生一个不同频但锁相的信号。 有点绕打个比方某参考晶振10Mhz频率综合器A使用该参考源产生了900Mhz时钟而频率综合器B产生了1Ghz时钟。虽然两路频率不同但由于使用的通一个参考源他们俩仍然是同源信号。相反如果不同源那么即便同频他们也不可能一致因为世界上没有两个钟能做到完全一样总有微弱的频差导致相位飘移。在很多现实应用中有要求同源时钟的场合所以锁相环被广泛应用。锁相环的另外一项衍生应用是相干解调可以自己查查相关资料。 中断与异常 中断与异常有何区别 中断是指外部硬件产生的一个电信号从CPU的中断引脚进入打断CPU的运行。 异常是指软件运行过程中发生了一些必须作出处理的事件CPU自动产生一个陷入来打断CPU的运行。异常在处理的时候必须考虑与处理器的时钟同步实际上异常也称为同步中断在处理器执行到因编译错误而导致的错误指令时或者在执行期间出现特殊错误必须靠内核处理的时候处理器就会产生一个异常。 中断与DMA有何区别 DMA是一种无须CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来从而大大提高系统的吞吐率。 中断是指CPU在执行程序的过程中出现了某些突发事件时CPU必须暂停执行当前的程序转去处理突发事件处理完毕后CPU又返回源程序被中断的位置并继续执行。 所以中断和DMA的区别就是DMA不需CPU参与而中断是需要CPU参与的。 中断能不能睡眠为什么下半部能不能睡眠 中断处理的时候,不应该发生进程切换。因为在中断上下文中唯一能打断当前中断handler的只有更高优先级的中断它不会被进程打断。如果在中断上下文中休眠则没有办法唤醒它因为所有的wake_up_xxx都是针对某个进程而言的而在中断上下文中没有进程的概念没有一个task_struct这点对于softirq和tasklet一样。因此真的休眠了比如调用了会导致阻塞的例程内核几乎肯定会死。 schedule()在切换进程时保存当前的进程上下文CPU寄存器的值、进程的状态以及堆栈中的内容以便以后恢复此进程运行。中断发生后内核会先保存当前被中断的进程上下文在调用中断处理程序后恢复。 但在中断处理程序里CPU寄存器的值肯定已经变化了最重要的程序计数器PC、堆栈SP等。如果此时因为睡眠或阻塞操作调用了schedule()则保存的进程上下文就不是当前的进程上下文了。所以不可以在中断处理程序中调用schedule()。 2.4内核中schedule()函数本身在进来的时候判断是否处于中断上下文: if(unlikely(in_interrupt())) BUG(); 12 因此强行调用schedule()的结果就是内核BUG但看2.6.18的内核schedule()的实现却没有这句改掉了。 中断handler会使用被中断的进程内核堆栈但不会对它有任何影响因为handler使用完后会完全清除它使用的那部分堆栈恢复被中断前的原貌。 处于中断上下文时候内核是不可抢占的。因此如果休眠则内核一定挂起。 中断的响应执行流程是什么 中断的响应流程cpu接受中断-保存中断上下文跳转到中断处理历程-执行中断上半部-执行中断下半部-恢复中断上下文。 当一个异常出现以后ARM微处理器会执行哪几步操作 将下一条指令的地址存入相应连接寄存器LR以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入则LR寄存器中保存的是下一条指令的地址当前PC4或PC8与异常的类型有关若异常是从Thumb状态进入则在LR寄存器中保存当前PC的偏移量这样异常处理程序就不需要确定异常是从何种状态进入的。例如在软件中断异常SWI指令 MOV PCR14_svc总是返回到下一条指令不管SWI是在ARM状态执行还是在Thumb状态执行。将CPSR复制到相应的SPSR中。根据异常类型强制设置CPSR的运行模式位。强制PC从相关的异常向量地址取下一条指令执行从而跳转到相应的异常处理程序处。 写一个中断服务需要注意哪些如果中断产生之后要做比较多的事情你是怎么做的 写一个中断服务程序要注意快进快出在中断服务程序里面尽量快速采集信息包括硬件信息然后退出中断要做其它事情可以使用工作队列或者tasklet方式。也就是中断上半部和下半部。 中断服务程序中不能有阻塞操作。应为中断期间是完全占用CPU的即不存在内核调度中断被阻塞住其他进程将无法操作。 中断服务程序注意返回值要用操作系统定义的宏做为返回值而不是自己定义的。 如果要做的事情较多应将这些任务放在后半段(tasklet等待队列等)处理。 为什么FIQ比IRQ要快 ARM的FIQ模式提供了更多的banked寄存器r8到r14还有SPSR而IRQ模式就没有那么多R8,R9,R10,R11,R12对应的banked的寄存器就没有这就意味着在ARM的IRQ模式下中断处理程序自己要保存R8到R12这几个寄存器然后退出中断处理时程序要恢复这几个寄存器而FIQ模式由于这几个寄存器都有banked寄存器模式切换时CPU自动保存这些值到banked寄存器退出FIQ模式时自动恢复所以这个过程FIQ比IRQ快.不要小看这几个寄存器ARM在编译的时候如果你FIQ中断处理程序足够用这几个独立的寄存器来运作它就不会进行通用寄存器的压栈这样也省了一些时间。 FIQ比IRQ有更高优先级如果FIQ和IRQ同时产生那么FIQ先处理。 在symbian系统里当CPU处于FIQ模式处理FIQ中断的过程中预取指令异常未定义指令异常软件中断全被禁止所有的中断被屏蔽。所以FIQ就会很快执行不会被其他异常或者中断打断所以它又比IRQ快了。而IRQ不一样当ARM处理IRQ模式处理IRQ中断时如果来了一个FIQ中断请求那正在执行的IRQ中断处理程序会被抢断ARM切换到FIQ模式去执行这个FIQ所以FIQ比IRQ快多了。 另外FIQ的入口地址是0x1c,IRQ的入口地址是0x18。写过完整汇编系统的都比较明白这点的差别18只能放一条指令为了不与1C处的FIQ冲突这个地方只能跳转而FIQ不一样1C以后没有任何中断向量表了这样可以直接在1C处放FIQ的中断处理程序由于跳转的范围限制至少少了一条跳转指令。 中断和轮询哪个效率高怎样决定是采用中断方式还是采用轮询方式去实现驱动 中断是CPU处于被动状态下来接受设备的信号而轮询是CPU主动去查询该设备是否有请求。 凡事都是两面性所以看效率不能简单的说那个效率高。如果是请求设备是一个频繁请求cpu的设备或者有大量数据请求的网络设备那么轮询的效率是比中断高。如果是一般设备并且该设备请求cpu的频率比较低则用中断效率要高一些。主要是看请求频率。 通信协议 什么是异步传输和同步传输 异步传输是一种典型的基于字节的输入输出数据按每次一个字节进行传输其传输速度低。 同步传输需要外界的时钟信号进行通信是把数据字节组合起来一起发送这种组合称之为帧其传输速度比异步传输快。 RS232和RS485通讯接口有什么区别 传输方式不同。 RS232采取不平衡传输方式即所谓单端通讯。 而RS485则采用平衡传输即差分传输方式。 传输距离不同。RS232适合本地设备之间的通信传输距离一般不超过20m。而RS485的传输距离为几十米到上千米。 设备数量。RS232 只允许一对一通信而RS485 接口在总线上是允许连接多达128个收发器。 连接方式。RS232规定用电平表示数据因此线路就是单线路的用两根线才能达到全双工的目的而RS485 使用差分电平表示数据因此必须用两根线才能达到传输数据的基本要求要实现全双工必需用4根线。 总结从某种意义上可以说线路上存在的仅仅是电流RS232/RS485规定了这些电流在什么样的线路上流动和流动的样式。 SPI协议 SPI的应用 SPI(Serial Peripheral Interface)协议是由摩托罗拉公司提出的通讯协议即串行外围设备接口是一种高速全双工的通信总线。SPI总线系统是一种同步串行外设接口它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI总线可直接与各个厂家生产的多种标准外围器件相连包括FLASH、RAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。 接口 MOSI (Master Output Slave Input) 主设备输出/从设备输入引脚。主机的数据从这条信号线输出从机由这条信号线读入主机发送的数据即这条线上数据的方向为主机到从机。 MISO(Master Input, Slave Output) 主设备输入/从设备输出引脚。主机从这条信号线读入数据从机的数据由这条信号线输出到主机即在这条线上数据的方向为从机到主机。 SCLK (Serial Clock) 时钟信号线用于通讯数据同步。它由通讯主机产生决定了通讯的速率不同的设备支持的最高时钟频率不一样如 STM32 的 SPI 时钟频率最大为fpclk/2两个设备之间通讯时通讯速率受限于低速设备。 SS( Slave Select) 从设备选择信号线常称为片选信号线也称为 NSS、 CS以下用 NSS 表示。 当有多个 SPI 从设备与 SPI 主机相连时设备的其它信号线 SCK、MOSI 及 MISO 同时并联到相同的 SPI 总线上即无论有多少个从设备都共同只使用这 3 条总线而每个从设备都有独立的这一条 NSS 信号线本信号线独占主机的一个引脚即有多少个从设备就有多少条片选信号线。 I2C 协议中通过设备地址来寻址、选中总线上的某个设备并与其进行通讯而 SPI 协议中没有设备地址它使用 NSS 信号线来寻址当主机要选择从设备时把该从设备的 NSS 信号线设置为低电平该从设备即被选中即片选有效接着主机开始与被选中的从设备进行 SPI 通讯。所以SPI 通讯以 NSS 线置低电平为开始信号以 NSS 线被拉高作为结束信号。 协议层 SPI 通讯设备之间的常用连接方式见下图 SPI 通讯的通讯时序见下图 通讯的起始和停止信号 在图中的标号1处NSS 信号线由高变低是 SPI 通讯的起始信号。 NSS 是每个从机各自独占的信号线当从机检在自己的 NSS 线检测到起始信号后就知道自己被主机选中了开始准备与主机通讯。在图中的标号处 NSS 信号由低变高是 SPI 通讯的停止信号表示本次通讯结束从机的选中状态被取消。 数据有效性 SPI 使用 MOSI 及 MISO 信号线来传输数据使用 SCK 信号线进行数据同步。 MOSI及 MISO 数据线在 SCK 的每个时钟周期传输一位数据且数据输入输出是同时进行的。数据传输时 MSB 先行高位先行或 LSB低位先行先行并没有作硬性规定但要保证两个 SPI 通讯设备之间使用同样的协定一般都会采用上图中的 MSB 先行高位先行模式。 观察图中的2345标号处 MOSI 及 MISO 的数据在 SCK 的上升沿期间变化输出在 SCK 的下降沿时被采样。即在 SCK 的下降沿时刻 MOSI 及 MISO 的数据有效高电平时表示数据“1”为低电平时表示数据“0”。在其它时刻数据无效 MOSI 及 MISO为下一次表示数据做准备。 SPI 每次数据传输可以 8 位或 16 位为单位每次传输的单位数不受限制。 CPOL时钟极性/CPHA时钟相位及通讯模式 上面讲述的图中的时序只是 SPI 中的其中一种通讯模式 SPI 一共有四种通讯模式它们的主要区别是总线空闲时 SCK 的时钟状态以及数据采样时刻。为方便说明在此引入“时钟极性CPOL”和“时钟相位 CPHA”的概念。 时钟极性 CPOL 是指 SPI 通讯设备处于空闲状态时 SCK 信号线的电平信号(即 SPI 通讯开始前、 NSS 线为高电平时 SCK 的状态)。 CPOL0 时 SCK 在空闲状态时为低电平CPOL1 时则相反。 时钟相位 CPHA 是指数据的采样的时刻当 CPHA0 时 MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的“奇数边沿” 被采样。当 CPHA1 时数据线在 SCK 的“偶数边沿” 采样。 IIC协议 简介 IIC协议是由数据线SDA和时钟SCL构成的串行总线可发送和接收数据,是一个多主机的半双工通信方式 每个挂接在总线上的器件都有个唯一的地址。位速在标准模式下可达 100kbit/s,在快速模式下可达400kbit/s在高速模式下可待3.4Mbit/s。 I2C总线系统结构,如下所示: I2C时序介绍 1. 空闲状态 当总线上的SDA和SCL两条信号线同时处于高电平,便是空闲状态,如上面的硬件图所示,当我们不传输数据时, SDA和SCL被上拉电阻拉高,即进入空闲状态 2. 起始信号 当SCL为高期间SDA由高到低的跳变便是总线的启动信号,只能由主机发起,且在空闲状态下才能启动该信号,如下图所示 3. 停止信号 当SCL为高期间SDA由低到高的跳变便是总线的**停止信号,**表示数据已传输完成,如下图所示 4. 传输数据格式 当发了起始信号后,就开始传输数据,传输的数据格式如下图所示 当SCL为高电平时,便会获取SDA数据值,其中SDA数据必须是稳定的(若SDA不稳定就会变成起始/停止信号)。 当SCL为低电平时,便是SDA的电平变化状态。 若主从机在传输数据期间,需要完成其它功能(例如一个中断),可以主动拉低SCL,使I2C进入等待状态,直到处理结束再释放SCL,数据传输会继续 5. 应答信号ACK I2C总线上的数据都是以8位数据(字节)进行的当发送了8个数据后发送方会在第9个时钟脉冲期间释放SDA数据当接收方接收该字节成功便会输出一个ACK应答信号当SDA为高电平,表示为非应答信号NACK当SDA为低电平表示为有效应答信号ACK PS:当主机为接收方时,收到最后一个字节后,主机可以不发送ACK,直接发送停止信号来结束传输。 当从机为接收方时没有发送ACK则表示从机可能在忙其它事、或者不匹配地址信号和不支持多主机发送主机可以发送停止信号再次发送起始信号启动新的传输。 6. 完整的数据传输 如下图所示, 发送起始信号后,便发送一个8位的设备地址,其中第8位是对设备的读写标志,后面紧跟着的就是数据了,直到发送停止信号终止。 PS:当我们第一次是读操作然后想换成写操作时可以再次发送一个起始信号然后发送读的设备地址不需要停止信号便能实现不同的地址转换。 IIC传输数据的格式 1.写操作 刚开始主芯片要发出一个start信号然后发出一个(用来确定是往哪一个芯片写数据)方向(读/写0表示写1表示读)。回应(用来确定这个设备是否存在)然后就可以传输数据传输数据之后要有一个回应信号确定数据是否接受完成)然后再传输下一个数据。每传输一个数据接受方都会有一个回应信号数据发送完之后主芯片就会发送一个停止信号。 白色背景主→从。灰色背景从→主。 2.读操作 刚开始主芯片要发出一个start信号然后发出一个设备地址(用来确定是从哪一个芯片读取数据)方向(读/写0表示写1表示读)。回应(用来确定这个设备是否存在)然后就可以传输数据传输数据之后要有一个回应信号确定数据是否接受完成)然后在传输下一个数据。每传输一个数据接受方都会有一个回应信号数据发送完之后主芯片就会发送一个停止信号。 白色背景主→从。灰色背景从→主 版权声明本文为博主原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接和本声明。 本文链接https://blog.csdn.net/qq_16933601/article/details/116234673 编程 嵌人式编程中什么是大端什么是小端 大端模式低位字节存在高地址上高位字节存在低地址上。 小端模式高位字节存在高地址上低位字节存在低地址上。 STM32属于小端模式简单的说比如u32 temp0X12345678假设temp地址在0X2000 0010。那么在内存里面,存放就变成了 地址 | HEX | 0X2000 0010 | 78 56 43 12 | 12 因为是16进制的一个数为0.5字节所以 12 代表一个字节 34 代表一个字节。 釆用小端模式的CPU对操作数的存放方式是从低字节到高字节而大端模式对操作数的存放方式是从高字节到低字节。例如16位宽的数0x1234在小端模式CPU内存中的存放方式假设从地址0x4000开始存放见表1而在大端模式CPU内存中的存放方式见表2。 表1 0x1234在小端CPU内存中的存放方式 内存地址存放内容0x40000x340x40010x12表2 0x1234在大端CPU内存中的存放方式 内存地址存放内容0x40000x120x40010x3432位宽的数0x12345678在小端模式CPU内存中的存放方式假设从地址0x4000开始存放见表3而在大端模式CPU内存中的存放方式见表4。 表3 0x12345678在小端CPU内存中的存放方式 内存地址存放内容0x40000x780x40010x560x40020x340x40030x12表4 0x12345678在大端CPU内存中的存放方式 内存地址存放内容0x40000x120x40010x340x40020x560x40030x78以下程序为例 #include stdio.h struct mybitfields {unsigned short a:4;unsigned short b:5;unsigned short c:7; }test; int main() {int i;test.a 2;test.b 3;test.c 0;i *((short*)test);printf(%d\n,i);return 0; } 1234567891011121314151617 程序的输出结果为 50。 上例中 sizeof test2上例的声明方式是把一个 short也就是一块16位内存分成3部分各部分的大小分别是4位、5位、7位赋值语句i* short*test就是把上面的16位内存转换成 short类型进行解释。 变量a的二进制表示为0000000000000010取其低四位是0010.变量b的二进制表示为0000000000000011取其低五位是00011。变量c的二进制表示为0000000000000000取其低七位是0000000。 80x86机是小端修改分区表时要注意模式单片机一般为大端模式。小端一般是低位字节在高位字节的前面也就是低位在内存地址低的一端可以这样记小端→低位→在前→与正常逻辑顺序相反所以合成后得到0000000000110010即十进制的50。 下面给出另外一个例子 #include stdlib.h #include stdio.h #include string.h int main() {unsigned int uiVal_1 0x12345678;unsigned int uiVal_2 0;unsigned char aucVal[4] {0x12,0x34,0x56,0x78};unsigned short usVal_1 0;unsigned short usVal_2 0;memcpy(uiVal_2,aucVal,sizeof(uiVal_2));usVal_1 (unsigned short)uiVal_1;//在这里截断都取得的是低位usVal_2 (unsigned short)uiVal_2;//在这里截断printf(usVal_1:%x\n,usVal_1);//在这里又转化回来printf(usVal_2:%x\n,usVal_2);//在这里又转化回来return 0;} 123456789101112131415161718 小端模式是低地址存放低字节高地址存放高字节结构如下所示 78//低地址 56 34 12//高地址 1234 在内存里面测试机是小端地址由小到大。 val1:78563412 riVal2:12345678 12 结果如下 5678 3412 12 如何判断计算机处理器是大端还是小端 #include stdio.h int checkCPU() {{union w{int a;char b;}c;c.a 1;return(c.b 1);} } int main() {if(checkCPU())printf(小端\n);elseprintf(大端\n);return 0; } 123456789101112131415161718192021 编者的处理器为ntel处理器因为 Intel处理器一般都是小端模式所以此时程序的输出结果为小端 上述代码中如果处理器是大端则返回0如果处理器是小端则返回1.联合体 union的存放顺序是所有成员都从低地址开始存放如果能够通过改代码知道CPU对内存是采用小端模式读写还是采用大端模式读写一定会令面试官刮目相看。 还可以通过指针地址来判断由于在32位计算机系统中 short占两个字节char占1个字节所以可以采用如下做法实现该判断。 #include stdio.h int checkCPU() {unsigned short usData 0x1122;unsigned char*pucData (unsigned char*)usData;return (*pucData 0x22); } int main() {if(checkCPU())printf(小端\n);elseprintf(大端\n);return 0; } 123456789101112131415 程序输出的结果为小端 版权声明本文为博主原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接和本声明。 本文链接https://blog.csdn.net/qq_16933601/article/details/116234673 如何进行大小端的转换 int swapInt32(int intValue){int temp 0;temp ((intValue 0x000000FF) 24)|((intValue 0x0000FF00) 8) |((intValue 0x00FF0000) 8) |((intValue 0xFF000000) 24);return temp; } /*short型*/ unsigned short swapShort16(unsigned short shortValue){return ((shortValue 0x00FF ) 8) | ((shortValue 0xFF00)8);} /*float型:*/ float swapFloat32(float floatValue){typedef union SWAP_UNION{float unionFloat;int unionInt;}SWAP_UNION;SWAP_UNION swapUnion;swapUnion.unionFloat floatValue;swapUnion.unionInt swapInt32( swapUnion.unionInt);return swapUnion.unionFloat; } /*double型换一种写法用一下指针不然移位移死了……*/ void swapDouble64(unsigned char *pIn, unsigned char *pOut){for( int i0;i8;i)pOut[7-i] pIn[i];}int main() {int x 0x12345678;int y swapInt32(x);printf(%x\r\n,y);return 0; } 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 如何对绝对地址0x100000赋值 *(unsigned int*)0x100000 1234; 1 那么要是想让程序跳转到绝对地址是0x100000去执行应该怎么做 *((void (*)( ))0x100000 ) ( ); 1 首先要将0x100000强制转换成函数指针,即 (void (*)())0x100000 1 然后再调用它 *((void (*)())0x100000)();· 1 用typedef可以看得更直观些 typedef void(*)() voidFuncPtr; *((voidFuncPtr)0x100000)(); 12 关于作者 作者在准备秋招的过程中凭借这份资料最后顺利拿到了oppo小米兆易创新全志科技海康威视等十余家家公司的offer。现将这部分资料分享出来希望能对大家有帮助
http://www.zqtcl.cn/news/933946/

相关文章:

  • 做建网站的工作一年赚几百万正安县网站seo优化排名
  • 简约手机网站源码深圳市龙华区民治街道
  • 买了个网站后怎么做三明网站优化
  • 表白网页制作免费网站制作西安网站快速优化
  • 如何破解网站后台管理做网站前端用什么软件好
  • 网站建设业务客户来源建德建设局官方网站
  • 网站设计 网站开发 优化网页设计一般尺寸
  • 好的版式设计网站网站建设商标属于哪个类别
  • 做淘宝素材网站哪个好用中国广告公司100强
  • 海拉尔网站建设平台wordpress的插件下载地址
  • 企业服务类网站常用python编程软件
  • 有哪些漫画做的好的网站西安seo建站
  • 在建设部网站如何查询注册信息网站开发项目的前端后端数据库
  • 自助建站网站seo公司wordpress 相册 免费模板
  • 搜索建站网在线crm管理系统
  • 旅游网站管理系统源码wordpress 禁止爬虫
  • 会员登录系统网站建设wordpress 二级页面
  • 北京网站建设公司代理记账代理公司注册
  • 网站建设需要提供的资料物流企业网站建设与管理规划书
  • .net 手机网站开发wordpress下载链接框
  • 省直部门门户网站建设网站视频点播怎么做
  • 广西网站建设-好发信息网做信息图的网站
  • 网站建设费用怎么算遵义市住房和城乡建设局官方网站
  • 网站部分网页乱码手把手教建设网站
  • 电商网站开发目的举报网站建设运行情况
  • 网站专业设计在线科技成都网站推广公司
  • 怎么建设幸运28网站seo工作是什么意思
  • 人工智能和网站开发如何做网站栏目
  • 设计有什么网站推荐ppt大全免费模板
  • 建站点wordpress百度云