使用精简指令集的架构:ARM架构 RISC-V架构 PowerPC架构 MIPS架构
ARM架构 :目前使用最广泛的架构,ARM面向的低端消费类市场
RISC-V架构 :第五代,精简指令集的架构, RISC-v架构开源,
PowerPC架构 :Powerpc芯片凭借其出色的性能和高度整合和技术先进特性在网络通信应用,工业控制应用,家用数字化,网络存储领域,军工领域,电力系统控制等都具有非常广泛的应用。
MIPS架构 : MIPS处理器在数字电视、网络应用、机顶盒、ADAS、物联网等领域有广泛应用。
RISC : 精简指令集特点:
精简指令集使用了一些比较常用,并且相对简单的指令
作为精简指令集,
精简指令集的指令的宽度和指令的周期固定。
指令的宽度:将指令编译生成机器码之后,指令机器码占用内存空间的大小。
ARM指令指令的宽度是32bits(4Byte).
指令的周期:执行一条指令所需要的时间,ARM指令大多数都是单周期的指令。
周期跟处理器的主频有关,T(周期) = 1s / F(主频)
linux@ubuntu:~/ARM$ arm-linux-gnueabihf-gcc -marm hello.c -o hello
// arm-linux-gnueabihf-gcc : arm的交叉编译器,可以将程序编译生成ARM可执行程序
// -marm : 编译生成arm的汇编指令
linux@ubuntu:~/ARM$ file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=43f6cb611fae0c48a9d0f69afa162ca9b4d01628, with debug_info, not stripped
linux@ubuntu:~/ARM$ arm-linux-gnueabihf-objdump -D hello > hello.dis
// arm-linux-gnueabihf-objdump交叉编译器中的反汇编的命令:
// 将可执行程序反汇编生成反汇编文件,反汇编文件的后缀为.dis
000103d0 <main>:
内存地址 汇编指令机器码 反汇编指令
103d0: e92d4800 push {fp, lr}
103d4: e28db004 add fp, sp, #4
103d8: e24dd008 sub sp, sp, #8
103dc: e50b0008 str r0, [fp, #-8]
103e0: e50b100c str r1, [fp, #-12]
103e4: e300044c movw r0, #1100 ; 0x44c
103e8: e3400001 movt r0, #1
103ec: ebffffbb bl 102e0 <puts@plt>
103f0: e3a03000 mov r3, #0
103f4: e1a00003 mov r0, r3
103f8: e24bd004 sub sp, fp, #4
103fc: e8bd8800 pop {fp, pc}
使用复杂指令集的架构:X86和X64架构,电脑的CPU一般使用的都是复杂指令集。
复杂指令集更加注重指令的功能性,指令的周期和指令的宽度不固定。
linux@ubuntu:~/ARM$ gcc hello.c -o hello
linux@ubuntu:~/ARM$ objdump -D hello > hello.dis
// objdump反汇编的命令:将可执行程序反汇编生成反汇编文件,反汇编文件的后缀为.dis
0000000000001149 <main>:
内存地址 汇编指令机器码 反汇编指令
1149: f3 0f 1e fa endbr64
114d: 55 push %rbp
114e: 48 89 e5 mov %rsp,%rbp
1151: 48 83 ec 10 sub $0x10,%rsp
1155: 89 7d fc mov %edi,-0x4(%rbp)
1158: 48 89 75 f0 mov %rsi,-0x10(%rbp)
115c: 48 8d 3d a1 0e 00 00 lea 0xea1(%rip),%rdi # 2004 <_IO_stdin_used+0x4>
1163: e8 e8 fe ff ff callq 1050 <puts@plt>
1168: b8 00 00 00 00 mov $0x0,%eax
116d: c9 leaveq
116e: c3 retq
116f: 90 nop
字节 Byte 8bits(1字节)
半字 Half word 16bits(2字节)
字 Word 32bits(4字节)
双字 Double word 64bits(8字节)
字节 Byte 8bits(1字节)
半字 Half word 16bits(2字节)
字 Word 32bits(4字节)
双字 Double word 64bits(8字节)
四字 Quad word 128bits(16字节)
Cortex-A核有9中工作模式,当ARM核处于不同的工作模式下执行的是不同的代码,
执行代码之后可以完成特定的功能。

安全监控模式:monitor mode ----> 运行安全相关的代码
HYP mode : 对虚拟化技术的支持
| 异常模式 | 异常源 | 备注 |
|---|---|---|
| FIQ异常模式 | FIQ类型的异常源 | 当发生FIQ类型的异常源,会导出处理器进入到FIQ异常模式下。FIQ类型的异常源指很多异常事件。 |
| IRQ异常模式 | IRQ类型的异常源 | 当发生IRQ类型的异常源,会导出处理器进入到IRQ异常模式下。IRQ类型的异常源指很多异常事件。比如按键中断,定时器中断… |
| SVC模式 | 复位信号 | 看门狗复位,上电复位,复位按键复位 |
| 软中断指令(SWI) | 执行软中断指令时也会让处理器进入到SVC模式下 | |
| Undef未定义异常模式 | Undef未定义异常源 | 译码器翻译指令时失败,或者译码器不认识的指令 |
| Abort异常模式 | data Abort | 取数据发生异常 |
| Prefetch Abort | 取指令发生异常 |
导致处理器进入到对应的异常模式下的事件统称为异常源。
5种异常模式对应着7种异常源,异常源具有优先级,复位的优先级最高,FIQ的优先级高于IRQ。

Cortex-M4核有两种工作模式:
线程模式:主要执行的是用户的代码及主函数内的代码
异常模式:主要执行的异常代码,比如中断处理的代码,复位异常,硬件异常,按键中断......
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request