学习内容:

  1. 什么是ARM
  2. 常用的汇编语言
  3. 裸机开发

什么是ARM

ARM处理器    外文名   Advanced RISC Machines

ARM处理器ARM处理器是英国Acorn有限公司设计的低功耗成本的第一款RISC微处理器。全称为Advanced RISC Machine。ARM处理器本身是32位设计,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。

定义

ARM的Jazelle技术使Java加速得到比基于软件的Java虚拟机(JVM)高得多的性能,和同等的非Java加速核相比功耗降低80%。CPU功能上增加DSP指令集提供增强的16位和32位算术运算能力,提高了性能和灵活性。ARM还提供两个前沿特性来辅助带深嵌入处理器的高集成SoC器件的调试,它们是嵌入式ICE-RT逻辑和嵌入式跟踪宏核(ETMS)系列。

​​

 特点介绍

ARM处理器的三大特点是:耗电少功能强、16位/32位双指令集和合作伙伴众多。

1、体积小、低功耗、低成本、高性能;

2、支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;

3、大量使用寄存器,指令执行速度更快;

4、大多数数据操作都在寄存器中完成;

5、寻址方式灵活简单,执行效率高;

6、指令长度固定。

寄存器结构

ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器包括:

1 31个通用寄存器,包括程序计数器(PC指针),均为32位的寄存器。

2 6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,均为32位,只使用了其中的一部分。

指令结构

ARM微处理器的在较新的体系结构中支持两种指令集:ARM指令集和Thumb指令集。其中,ARM指令为32位的长度,Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集,但与等价的ARM代码相比较,可节省30%~40%以上的存储空间,同时具备32位代码的所有优点。


常用的汇编语言

基于Linux的汇编语言
1、编写汇编文件

{.global _start _start:mov r1, #3mov r2, #4nop nop
}

2、编译

arm-linux-gcc start.S -o start.o -c -g
arm-linux-ld start.o -o strat.elf -Ttext=0x0

3、调试

窗口1:qemu-system-arm -machine xilinx-zynq-a9 -m 256M -serial stdio -kernel start.elf -S -s
窗口2:arm-none-linux-gnueabi-gdb start.elftarget remote 127.0.0.1:1234s/p/......

传输数据指令:  MOV

{mov r1, #3     /*r1 = 3*/mov r1, r2     @ r1 = r2
}

算术运算指令:  ADD,SUB,MUL

{add r0, r1, #3   @ r0 = r1 + 3  adds r0, r1, #3  @ r0 = r1 + 3  操作:cpsr C adc r0, r1, #3   @ r0 = r1 + 3 + C 计算它们的和 :  0x1ffffffff  0x200000001 r0: 0x1  r1: 0xffffffffr2: 0x2  r3: 0x1adds r1, r1, r3 adc  r0, r0, r2 }

位操作指令:    AND,ORR,EOR,BIC

{and r0, r1, r2  @  r0 = r1 & r2 orr r0, r1, r2  @  r0 = r1 | r2 eor r0, r1, r2  @  r0 = r1 ^ r2 bic r0, r0, #3  r0 = 0xf         ---> 1111bic r0, r0, #3   ---> 00111100r0 = 0xe         ---> 1110bic r0, r0, #5   ---> 01011010and r0,r0,#0xa
}

跳转指令:      B,BL

{b flag   @  goto  flag
2:mov r1, #3bl 1f      @跳转的同时  保存返回地址到lrbl 2bmov r2, #4
1:mov r3, #4 mov pc, lr
}

比较指令:      CMP

{cmp r1, r3    @ 比较 moveq r1, #3  @ if(r1==r3) then r1 = 3{void fun(){r1=0;}if(r0==0)fun();fun:mov r1, #0cmp r0, #0bleq fun }{if((r0>4)&&(r0<10))r1 = 0;cmp r0, #4ble endcmpgt r0, #10movlt r1, #0 end:nop}{if((r0>4)||(r0<10))r1 = 0;cmp r0, #4movgt r1, #0bgt endcmp r0, #10movlt r1, #0end:nop}{if((r0>4)||(r2>10))r1 = 0;cmp r0, #4cmple r2, #10movgt r1, #0cmp r0, #4movgt r1, #0b endcmp r2, #10movgt r1, #0end:nop }}

加载/存储指令: LDR,STR

{ldr r0, [r1]  内存读操作:r1值作为地址,取这个地址开始的4个字节的数据,放到r0里面 str r0, [r1]  内存写操作:把r0的值,写到 r1值作为地址的空间里面去
}

多寄存器语句传输指令:   LDM/STM
空指令:         NOP 伪指令 = MOV R0 R0


裸机开发

以串口设备的裸机驱动开发为例

{
    1、明确需求: 谁(com2) 做什么(发送'S')
    2、看原理图:
        1)原理:  XuTXD2 ---> 数据发送   
        2)控制芯片: XuTXD2 ---》 GPA1_1------》uart(串口)控制器
                                    |
                                    |------> GPIO控制器(设置成串口发送的专用脚)
    3、芯片手册(寄存器)
        【GPIO】
        GPA1CON 0x11400020  [7:4] 0x2 = UART_2_TXD
        GPA1CON 0x11400020  [3:0] 0x2 = UART_2_RXD
        【uart】
        1)通过目录找到控制器章节
             28章节
        2)看看子章节和需求相关的部分
            概述看,需求功能相关看。
            a)串口有5路,4路是标准的串口(com2)。每个串口发送和接收buf。
            b)串口包含的内容:  波特率发生器,  发送接收单元,    停止位,校验位,数据位

c)发送流程:    data-->fifo --> shifter --> txpin
                            |----人-||-------uart控制器-----|
            d)fifo: fifo:all bytes     no fifo:1 byte (选择)
            e)ULCONn: 设置数据位、校验位、停止位
            f)clk:UBRDIVn UFRACVALn

3)看寄存器
            a)筛选寄存器(ctrl和config要,功能相关要,不确定的要)
            ULCON: 设置停止位、数据位、校验位
            UCON:全局控制
            UTXH:发送的fifo
            UBRDIV:波特率分频
            UFRACVAL:分频???

b)细看寄存器,怎么实现需求
            ULCONn = 0x3;
            UCONn [3:2]  01 tx poll mode    [1:0]  01 rx poll mode    
            UTXHn:  把数据写入,就发送, 最多只能8位的数据
            URXHn:  从里面读数据 ok   最多只能读8位数据
            UBRDIVn:  整数
            UFRACVALn: 小数*16

}
实现代码

main.c:

#define GPA1CON   *(unsigned int volatile*)0x11400020
#define ULCON2    *(unsigned int volatile*)0x13820000
#define UCON2     *(unsigned int volatile*)0x13820004
#define UTXH2     *(unsigned int volatile*)0x13820020
#define UBRDIV2   *(unsigned int volatile*)0x13820028
#define UFRACVAL2 *(unsigned int volatile*)0x1382002cvoid delay()
{int t = 0xfffff;while(t--);
}void uart_init()
{GPA1CON = GPA1CON & ~(0xf<<4) | (0x2<<4);ULCON2 = 0x3; UCON2 = UCON2 & ~0x3f | (0x1<<2); UBRDIV2 = 53;UFRACVAL2 = 4;
}void uart_send(char c)
{UTXH2 = c;
}void  main()
{char c = 'S';uart_init();uart_send(c);while(1){char c = uart_recv();uart_send(c);    }
}

start.S:

.globl _start
_start: b   resetldr    pc, _undefined_instructionldr   pc, _software_interruptldr  pc, _prefetch_abortldr  pc, _data_abortldr  pc, _not_usedldr    pc, _irqldr pc, _fiq
_undefined_instruction: .word _undefined_instruction
_software_interrupt:    .word _software_interrupt
_prefetch_abort:    .word _prefetch_abort
_data_abort:        .word _data_abort
_not_used:      .word _not_used
_irq:           .word _irq
_fiq:           .word _fiqreset:/* 设置cpu模式为SVC模式 */mrs  r0, cpsrbic r0, r0, #0x1f  orr  r0, r0, #0xd3 msr   cpsr,r0/* 设置异常向量表起始地址 */ldr r0, =0x41000000mcr p15, 0, r0, c12, c0, 0  @Set VBAR/*用户需要设置的初始化*/ldr sp, stacktop  /*设置svc sp*/sub r6, sp , #64  /*计算user需要指向的栈顶地址*//*切换到用户模式*/mrs   r0, cpsrbic r0, r0, #0x1f  orr  r0, r0, #0x10 msr   cpsr,r0mov sp, r6  /*设置user sp*//*跳转到应用程序*/bl   mainstack: .space 64*8
stacktop: .word stack+64*8

ARM 学习知识点梳理相关推荐

  1. Python 学习知识点梳理

    一.Python在各大知名公司的应用 谷歌:Google App Engine.code.google.com.Google earth.谷歌爬虫.Google广告等项目都在大量使用Python开发. ...

  2. 【WEB前端进阶之路】 HTML 全路线学习知识点梳理(上)

    前言 HTML 是一切Web开发的基础,本文专门为小白整理,针对前端零基础的朋友们,手把手教你学习HTML,让你轻松迈入WEB开发的行列. 首先,感谢 @橙子_ 在HTML学习以及本文编写过程中对我的 ...

  3. 【数据库通关之路】 MySQL 全路线学习知识点梳理(上)

    前言 这是一篇 MySQL 通关 硬核经验学习路线,包括数据库相关知识,SQL语句的使用,数据库约束,设计等.专为小白整理,针对数据库零基础的朋友们,手把手带你学习MySQL,让你轻松学会! 文末包邮 ...

  4. 嵌入式全栈工程师_我花了半个月,整理出了这篇嵌入式开发学习指南(学习路线+知识点梳理)...

    不好意思久等了 这篇文章让小伙伴们久等了. 一年多以来,关于嵌入式开发学习路线.规划.看什么书等问题,被问得没有一百,也有大几十次了.但是无奈自己对这方面了解有限,所以每次都没法交代,搞得实在不好意思 ...

  5. 肝了半个月,我整理出了这篇嵌入式开发学习学习路线+知识点梳理)

    不好意思久等了 这篇文章让小伙伴们久等了. 一年多以来,关于嵌入式开发学习路线.规划.看什么书等问题,被问得没有一百,也有大几十次了.但是无奈自己对这方面了解有限,所以每次都没法交代,搞得实在不好意思 ...

  6. 嵌入式工程师到底要不要学习ARM汇编指令?arm学习文章汇总

    嵌入式工程师到底要不要学习ARM汇编指令? 网上搜索这个问题,答案很多,大部分的建议是不要学汇编,只要学C语言. 而一口君作为一个十几年经验的驱动工程师,个人认为,汇编语言还是需要掌握的,想要搞精.搞 ...

  7. Python培训教程之Python基础知识点梳理

    Python语言是入门IT行业比较快速且简单的一门编程语言,学习Python语言不仅有着非常大的发展空间,还可以有一个非常好的工作,下面小编就来给大家分享一篇Python培训教程之Python基础知识 ...

  8. SQL重要知识点梳理!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:牧小熊,华中农业大学,Datawhale成员 有读者留言面试有点虚 ...

  9. 四年级下册英语计算机房和教师办公室的图片,PEP英语四年级下册-Unit-1思维导图及知识点梳理.pptx...

    PEP英语四年级下册-Unit-1思维导图及知识点梳理.pptx (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 四年级 下册 U ...

最新文章

  1. 我们都是透明人!看看互联网巨头们偷偷存储了你的哪些信息
  2. 做领导应该注意的几个问题
  3. 通俗易懂两种常用的多线程实现方式——Java并发系列学习笔记
  4. java 高性能缓存_高性能Java缓存----Caffeine
  5. 3综述 yolo_Onestage目标检测算法综述
  6. 开发的必杀技:Git 的分支管理
  7. 记一次使用Openssl生成p12证书搭建https证书
  8. 台式计算机风扇一直响,台式电脑风扇声音大怎么办(笔记本风扇一直嗡嗡响)...
  9. 弱水三千的由来(转)
  10. python中访问列表元素具体格式_Python3基础 list 访问列表中的列表的元素
  11. 利用计算机解决问题的一般过程是怎样的,计算机解决问题的一般过程1
  12. 英国大学计算机科学硕博连读,曼彻斯特大学硕博连读
  13. 使用Python和YOLO检测车牌
  14. iOS开发之ARC(自动引用计数)
  15. 图情论文笔记 | 学术图书馆“十四五”规划的思考(杨新涯)
  16. no-cache,max-age=0,nostore区别及304原理
  17. 自然语言处理 - 二元语法与中文分词
  18. JSP常用内置对象概述
  19. 红帽子linux开发工具,红帽发布 Red Hat Enterprise Linux 5 下载
  20. linux设置查看与设置文件编码格式

热门文章

  1. JavaWeb测试选择题带答案解析(二)
  2. IOS十进制转十六进制
  3. surfaceFlinger摘要
  4. 《消失的她》豆瓣短评数据分析
  5. 深入了解ERC-20标准,以太坊通证的过去与未来
  6. java中finalize()方法
  7. Android中 ComponentName 组件的使用
  8. DIY你的博客工具箱!(zeo制作)
  9. wireshark数据分析-Bravo-1
  10. 异常Throwable