热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

驱动开发基础ARM基础

SOC:片内系统(一颗芯片内包括CPU存储)CPU:运算器控制器嵌入式特点:专用多核处理器:SMP&#x
SOC:片内系统(一颗芯片内包括CPU+存储...)



CPU:运算器+控制器



嵌入式特点:专用



多核处理器:SMP(对称多核处理器)、FPGA+ARM(非对称多核)、AMP(非对称)



交叉编译工具链:(表示基于对应设备运行环境的)编译器、链接器、汇编器...



地址总线、数据总线:CPU通过地址总线寻址,通过数据总线和外部设备进行数据交互。其中,地址总线的位数决定了CPU的寻址范围,数据总线的位数决定了单次通信能交换的信息数量。最后,总线的速度决定了CPU和外设互换信息的速度(高速总线、低速总线)



机器指令:机器码(1010...的排列组合,在设计CPU时定义)



汇编语言:汇编语言就是CPU内部机器指令集的助记符(MOV : 01000101),不同CPU的机器指令集设计不同,所以汇编程序不能再CPU之间移植。汇编语言可以充分发挥CPU设计特点,效率是最高的



CISC:复杂指令集,指令集种类非常多,用尽量少的指令完成一件事(intel一直用的CISC)



RISC:精简指令集,只提供基本功能指令集;CPU的设计变简单了,但是编译器的设计变难了。



内存:RAM,内部存储器,程序运行的场所,(DRAM、SRAM、DDR...);SRAM(容量小、价格高、优点不需要初始化);DRAM(容量大、价格低、缺点是需要上电初始化)



外存:ROM,外部存储器,用来存储东西的(flash、u盘...)



内存和外存区别:CPU接内存和外存的连接方式不同,内存需要直接地址访问,就是通过地址总线+数据总线方式访问(访问速度快,随机访问);外存是通过CPU的外存接口来连接(好处是不占用CPU的地址总线,坏处是访问速度慢)



I/O:输入输出设备,访问外部设备接口



冯诺依曼结构、哈佛结构:一个是数据和程序放在一起(intel)、一个是程序和数据分开放(单片机和嵌入式),个人认为,哈佛结构更好,安全。



地址映射:CPU的地址总线在CPU设计的时候就已经设计好了的(ARM做的,它预留了很多,给厂商自己分配),还有一部分是预留的,可以自由发挥,一般用作通用内存等



Norflash:总线方式访问,可以直接接到地址总线上,小,贵,可靠,不易丢



NandFlash:容易产生坏块,需要软件处理,不能直接通过总线式访问,需要上电后进行一些初始化操作,然后通过时序接口读写。



一般PC机:很小容量BIOS(NorFlash)+很大容量的硬盘(类似NandFlash)+大容量DRAM;

一般单片机:很小容量NorFlash+很小容量SRAM

嵌入式:SOC内置的SRAM+外接大容量Nand+外接大容量DRAM



eMMC:(embeded MMC)本身自带坏块处理等,目前手机等大容量用的都是eMMC。



oneNAND:三星出的一种NAND



SATA硬盘:机械式访问、磁存储原理、成本低、SATA是接口



为什么嵌入式设备启动方式这么复杂?

这个是由于各种各样的原因,最后妥协的结果。

首先,需要先介绍一下NandFlash(容量大、存储快、便宜、需要初始化才能使用)、NorFlash(容量小、存储慢、贵、CPU可以直接通过总线式访问不需要初始化)、DRAM(动态内存、容量大、便宜、需要初始化)、SRAM(容量小、贵、可以直接使用)

嵌入式设备的配置大部分是大容量的外存NandFlash+大容量的DDR,这种配置是不可能将板子启动的,因为它们都需要上电进行初始化后才能工作,而CPU又必须要读取到程序才能执行初始化操作,等于死锁。因此,大牛们设计出了一种方式,他们在片内增加了一小段NorFlash,并将程序放到这一块,板卡上电后会自动的从这一块读取bootloader,bootloader的内容则是初始化DRAM、NandFlash等,然后再将NandFlash中的内核镜像读取到DDR中运行。

可能有人会疑惑,那为什么不能直接把内核镜像放到NorFlash中去呢?上电就能直接启动系统了,原因是因为贵啊,NorFlash成本太大了,要控制成本,所以才有了这种方案,绕了一圈,就是为了省钱!



ARM编程模式、工作模式:Thumb指令集,ARM指令集,Thumb2指令集;7种工作模式



CPU异常处理流程:拷贝CPSR到对应模式下的SPSR并重新设置CPSR,保存返回地址到lr,设置pc为相应的异常向量表入口;返回时,从SPSR恢复CPSR,从lr恢复pc。恍然大悟!



ARM总共有37个寄存器,但每种模式下最多能看到18个寄存器。其他寄存器只能在特定模式下才能看到,叫做影子寄存器(P13,P14,SPSR)



指令、伪指令:指令就是cpu执行的机器码的助记符;伪指令是编译器提供的,在编译的过程中间起作用,编译完成后就没有作用了,并不会生成机器码。



ARM采用RISC架构,CPU不能直接读取内存,必须先将内存中内容加载到CPU中通用寄存器中才能被CPU处理。



eor(逻辑异或);bic(位清除指令);tst(测试特定位是否为0);mrs(读CPSR到寄存器);msr(将寄存器中的值写到CPSR);bx(跳转同时切换至ARM模式);mrc(读取cp15到寄存器);mcr(将寄存器中的数据写到cp15);



.global(添加外部链接属性);.section(指定段为代码段 );.align(字节对齐)


栈:C语言中的局部变量都是放栈里面的,ARM通常使用满减栈(因为ATPCS规定)满减栈、满增栈、空减栈、空增栈:满栈(进栈,先移动指针再存;出栈,先出数据再移动指针)

cache:cache叫高速缓存;cache的存在是因为寄存器和DDR的速度差价太大了,不能满足CPU需要,所以没有cache会拉低整个系统的整体速度;Icache(用来缓存指令,那CPU运行指令的边上几句指令缓存到cache,),Dcache(用来缓存数据)

位置无关编码(汇编源文件被编码成二进制可执行程序试编码方式和位置(内存地址)无关);位置有关编码(汇编源文件被编码成二进制可执行程序试编码方式和位置(内存地址)有关)

代码重定位(只需重定位代码段和数据段):做这件事情的原因是因为,我们想让镜像在某一个地址运行,但实际镜像并不在那块地址,那就需要用到代码重定位将镜像搬运到我们想要的那块内存地址上(此时整个内存地址中就有两个镜像),然后再用跳转指令跳到那块地址上运行。
其实!更多的时候,代码重定位的作用是这样的:在soc内部通常都有一个iRAM,这个片内内存非常小,只有几十k(因为很贵),而我们常用的bootloader镜像远比这个大,没法把整个镜像放到iRAM中运行,因此大牛们设计了一种方式,他们先将bootloader的一部分拿到iRAM中运行,这一部分功能就是初始化Flash,初始化DDR,再将Flash中的bootloader镜像全部搬运到DDR中,再跳转到DDR中运行完整的bootloader。

adr指令用于加载运行时的地址;ldr指令用于加载链接地址

bss段在汇编代码处被清零。

SDRAM:同步动态随机存储器
DDR:是SDRAM的升级版,双倍速SDRAM。DDR还有好多代,DDR1,DDR2...


推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • CMake跨平台开发实践
    本文介绍如何使用CMake支持不同平台的代码编译。通过一个简单的示例,我们将展示如何编写CMakeLists.txt以适应Linux和Windows平台,并实现跨平台的函数调用。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
author-avatar
非徒雨思_184
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有