一、ARM体系结构

程序编译的过程:

预处理(.c-.i):宏替换,头文件展开,去掉注释,特殊符号的处理

编译(.i-.s):C语言转换成汇编语言

汇编(.s-.o):汇编转成成二进制文件

链接(.o-app):关联各种符号信息,归并文件,将不可执行二进制文件转换成可执行二进制文件

1、最小系统:电源、时钟(晶振)、复位、内存、Flash、输入输出

ROM:只读存储,访问速率慢,掉电数据不丢失

RAM:随机存储,访问速率快,掉电数据丢失

flash:结合RAM和ROM的优点的存储

SRAM:静态随机存储

DRAM:动态随机存储 

SSRAM:同步静态随机存储       

SDRAM:同步动态随机存取存储器

DDRn:双倍速率同步动态随机存取存储器

PROM:可编程ROM

EPROM:可擦除PROM

EEPROM:电可擦除PROM

2、CPU:中央处理单元

CU:处理单元//

ALU:运算单元,实现基本的运算单元

R0-R12:通用寄存器,存储数据

PC:程序计数器,指向正在执行的下下条指令,上电默认做自加运算

LR:链接寄存器,保存函数的返回地址

SP:栈指针寄存器,指向栈顶

CPSR:当前程序状态寄存器,运算的结果为0、正、负等,运算中产生的进位、借位等;中断使能,工作状态、工作模式。
SPSR:保存程序状态寄存器,存放CPSR的备份
Cache: CPU和内存之间的缓存,访问速率远高于内存
MMU: 内存管理单元,做虚拟地址到物理地址的转换

3、处理器

有几个CPU就有几核

多核异构:同一个处理集成不同架构的CPU

SOC:片上系统(下图)

AHB:高速总线

APB:外设总线(低速)

RISC:精简指令集(使用20%的指令实现80%的功能)

CISC:复杂指令集(使用100%的指令实现100%的功能)

cortex-A:低功耗、消费类电子

cortex-R:实时性、军工、汽车

cortex-M:高性能、偏控制

DSP:数字信号处理器

FPGA:现场可编程门阵列

4、三大总线(外设)

地址总线:传输地址(单向)

数据总线:传输数据(双向)

控制总线:读写、忙

5、三级存储系统

6、处理器工作模式

特权模式权限比非特权模式高

FIQ>IRQ

7、程序状态寄存器CPRS SPRS

N:结果是否-,Z:结果是零0

8、异常处理

三级流水线:预处理、解码、执行

ARM汇编语言

二、汇编

1、ARM指令集

数据处理指令

Load/Store指令

跳转指令

程序状态寄存器处理指令:完成CPSR的管理

协处理器指令:完成CPU扩展功能的实现

异常产生指令

2、指令格式

3、数据处理指令

6、进位

7、条件if

练习:求和(if+loop)循环

8、函数(难点)

立即数:一个数(或按位取反)循环右移2^n位后中所有的1能放进低8位中,#代表立即数

ldr sp,=0x40001000:将一个地址加载到寄存器中

函数调用的规则:

前四个参数用r0-r3传递,剩余的参数用栈传递(保护现场,恢复现场)

返回值在r0中

   	preserve8area reset, code, readonlycode32entrystartldr sp, =0x40001000mov r0,#1mov r1,#2import c_addbl c_addnopb startexport asm_add
asm_addstmfd sp!, {r4-r12,lr}add r0,r0,r1ldmfd sp!, {r4-r12,pc}end
int asm_add(int x, int y);int c_add(int a, int b)
{int sum = asm_add(a, b);return sum;
}

5、PSR传送指令

swi #5软中断指令

swi后面的数范围是0-0xffffff

   	preserve8area reset, code, readonlycode32entryb startnopb deal_swinopnopnopnopnopdeal_swistmfd sp!, {r4-r12,lr}add r0,r0,r1ldmfd sp!, {r4-r12,pc}	startldr sp, =0x40001000mrs r0,cpsr    ;//程序状态寄存器(CPSR)的值读取到通用寄存器 r0bic r0,r0,#0x1f    ;//清除 r0 的低5位(二进制 0b00011111),即 CPSR的模式位orr r0,r0,#0x10    ;//将 r0 的低5位设置为 0x10(二进制 0b10000),即切换到 用户模式msr cpsr_c,r0    ;//将修改后的 r0 值写回 CPSR的控制域(cpsr_c),完成模式切换ldr sp, =0x40000c00swi #5    ;//触发SWI中断(跳转到deal_swi)mov r0,#1mov r1,#2import c_addbl c_add    ;//跳转到c_add函数处,并保存返回地址到lr寄存器nopb start    ;//无条件跳转到start处export asm_add
asm_addstmfd sp!, {r4-r12,lr}add r0,r0,r1ldmfd sp!, {r4-r12,pc}end
三、端口控制描述

1、端口控制描述

端口配置寄存器(GPACON-GPJCON):配置引脚的功能

端口数据寄存器(GPADAT-GPJDAT):读写数据

2、点亮led灯

#ifndef __LED_H
#define __LED_H#define GPBCON 	(*(volatile unsigned long *)0x56000010UL)
#define GPBDAT 	(*(volatile unsigned long *)0x56000014UL)
void led1_init(void);
void led1_on(void);
void led1_off(void);#endif
#include "led.h"
void led1_init(void)
{// 配置GPB5引脚功能为输出GPBCON &= ~(0x3 << 10);GPBCON |= (0x1 << 10);// 控制GPB5输出高电平	向GPBDAT第5位写1GPBDAT |= (1 << 5);
}
void led1_on(void)
{// 控制GPB5输出低电平   向GPBDAT第5位写0GPBDAT &= ~(1 << 5);
}
void led1_off(void)
{	// 控制GPB5输出高电平	向GPBDAT第5位写1GPBDAT |= (1 << 5);
}

小tips:

volatile:易失性修饰符 读写值时都操作内存地址

配置1bit,一步完成

配置连续多个bit,两步完成,先清0,再置1

四、时钟管理

S3C2440A 包含两个锁相环(PLL:锁相环,倍频(提高频率))

一个提供给 FCLK、HCLK 和 PCLK,另一个专用于USB 模块(48MHz)
根据OM2 OM3选择时钟源(通过本次原理图,两个引脚接地,选择00模式)

代码

#ifndef __CLK_H
#define __CLK_H//#define MPLLCON (*(volatile unsigned long *)0x4C000004UL)
//#define CLKCON (*(volatile unsigned long *)0x4C00000CUL)
//#define CLKDIVN (*(volatile unsigned long *)0x4C000014UL)
//#define CAMDIVN (*(volatile unsigned long *)0x4C000018UL)void clk_init(void);
void clk_enable(unsigned char num);
void clk_disable(unsigned char num);#endif
#include <s3c2440.h>
#include "clk.h"
void clk_init(void)
{// 配置分频//CAMDIVN &= ~(1 << 9);   //该位默认值为0CLKDIVN = (0x2 << 1) | (1 << 0);// 配置PLLMPLLCON = (127 << 12) | (2 << 4) | (1 << 0);
}void clk_enable(unsigned char num)	//枚举
{CLKCON |= (1 << num);
}void clk_disable(unsigned char num)	//枚举
{CLKCON &= ~(1 << num);
}
五、中断

注意:

不支持中断嵌套

1、user模式(非特权)不能直接转换中断模式(特权),SVC模式可以直接切换中断模式

(特权优先级高于非特权)

2、函数的返回值,初始化栈

3、中断返回不一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93424.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93424.shtml
英文地址,请注明出处:http://en.pswp.cn/web/93424.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 以模块化方案 适配 HarmonyOS 的实现方法

Flutter 以模块化方案 适配 HarmonyOS 的实现方法 Flutter的SDK&#xff1a; https://gitcode.com/openharmony-tpc/flutter_flutter 分支Tag&#xff1a;3.27.5-ohos-0.1.0-beta DevecoStudio&#xff1a;DevEco Studio 5.1.1 Release HarmonyOS版本&#xff1a;API18 本文使…

Redis入门与背景详解:构建高并发、高可用系统的关键基石

本文前言认识Redis单机架构浅谈分布式系统分布式是什么数据库分离和负载均衡引入缓存数据库分库分表引入微服务念补充小结Redis特性介绍持久化支持集群高可用快Redis的应用场景总结前言 在当今这个数据驱动的时代&#xff0c;应用的性能和可扩展性已成为衡量其成功的关键指标。…

Mysql常见的优化方法

数据库优化(底层基础优化) 数据库层面的优化是性能“基础"&#xff0c; 主要包含架构设计、存储引擎、表结构、索引策略、配置参数等方面考虑。目标是减少资源(CPU、IO和内存)消耗。 架构设计 读写分离&#xff1a;将"读操作"和"写操作"分离到不同的数…

利用Claude Code打造多语言网站内容翻译工具:出海应用开发全流程实战教程

一、工具选型与准备Claude Code 简介 Claude Code 是 Anthropic 公司推出的 AI 编程助手&#xff0c;可以辅助开发者生成代码、优化代码结构、进行代码解释等&#xff0c;支持多种主流编程语言。开发环境准备 Claude Code 账号或 API 接入权限Node.js 或 Python 环境&#xff0…

集成运算放大器(反向比例,同相比例)

基础知识&#xff1a;反相比例运算原理&#xff1a;示波器显示&#xff1a;结论&#xff1a;放大倍数为-R2/R1。R3的大小约等于R1与R2的并联电阻。由于放大器的最大输出电压取决于供电电压&#xff0c;所以如果R2为7k时&#xff0c;会导致失真。同向比例原理&#xff1a;示波器…

【HBase】HBaseJMX 接口监控信息实现钉钉告警

目录 一、JMX 简介 二、JMX监控信息钉钉告警实现 一、JMX 简介 官网&#xff1a;Apache HBase ™ Reference Guide JMX &#xff08;Java管理扩展&#xff09;提供了内置的工具&#xff0c;使您能够监视和管理Java VM。要启用远程系统的监视和管理&#xff0c;需要在启动Java…

SQL 语言规范与基础操作指南

SQL 语言规范与基础操作指南 SQL 作为数据库操作的核心语言&#xff0c;遵循规范的语法和书写习惯不仅能提高代码可读性&#xff0c;还能减少错误。本文整理了 SQL 的基础规则、书写规范及常用操作&#xff0c;适合初学者快速上手。 一、SQL 基本规则 1. 书写格式 SQL 语句可写…

产业园IBMS智能化集成系统功能有哪些?

产业园 IBMS&#xff08;建筑集成管理系统&#xff09;智能化集成系统是针对产业园 “多业态、多系统、多租户” 特点设计的全局管理平台&#xff0c;通过整合楼宇自控、安防、消防、能源、停车、租户服务等子系统&#xff0c;实现 “集中监控、协同联动、数据驱动、灵活服务”…

线性代数之两个宇宙文明关于距离的对话

矢量的客观性和主观性宇宙中飘过来一个自由矢量&#xff0c;全世界的人都可以看到&#xff0c;大家都在想&#xff0c;怎么描述它呢&#xff0c;总不能指着它说“那个矢量”吧。数学家很聪明&#xff0c;于是建立了一个坐标系&#xff0c;这个矢量投影到坐标系下&#xff0c;就…

Camx-Tuning参数加载流程分析

调用时序图 一、效果参数在开机时加载 CreateTuningDataManager逻辑分析 1.从xxx_module.xml获取sensor名称和效果参数名称&#xff0c; 比如效果参数名称为&#xff1a;xtc_tsp_sc520cs那么效果库的完整名称就是&#xff1a;com.qti.tuned.xtc_tsp_sc520cs.bin 2.优先从/data/…

《P4180 [BJWC2010] 严格次小生成树》

题目描述小 C 最近学了很多最小生成树的算法&#xff0c;Prim 算法、Kruskal 算法、消圈算法等等。正当小 C 洋洋得意之时&#xff0c;小 P 又来泼小 C 冷水了。小 P 说&#xff0c;让小 C 求出一个无向图的次小生成树&#xff0c;而且这个次小生成树还得是严格次小的&#xff…

Transformer浅说

rag系列文章目录 文章目录rag系列文章目录前言一、简介二、注意力机制三、架构优势四、模型加速总结前言 近两年大模型爆火&#xff0c;大模型的背后是transformer架构&#xff0c;transformer成为家喻户晓的词&#xff0c;人人都知道它&#xff0c;但是想要详细讲清楚&#x…

后台管理系统-3-vue3之左侧菜单栏和头部导航栏的静态搭建

文章目录1 CommonAside组件(静态搭建)1.1 Menu菜单1.2 准备菜单数据1.3 循环渲染菜单1.3.1 el-menu结构1.3.2 动态渲染图标1.4 样式设计1.5 整体代码(CommonAside.vue)2 CommonHeader组件(静态搭建)2.1 准备图片URL数据2.2 页面布局2.3 样式设计2.4 整体代码(CommonHeader.vue)…

VS Code配置MinGW64编译非线性优化库NLopt

VS Code用MinGW64编译C代码安装MSYS2软件并配置非线性优化库NLopt和测试引用库代码的完整具体步骤。 1. 安装MSYS2 下载安装程序&#xff1a; 访问 MSYS2官网下载 msys2-x86_64-xxxx.exe 并运行 完成安装&#xff1a; 默认安装路径&#xff1a;C:\msys64安装完成后&#xff0c…

C#通过TCP_IP与PLC通信

C#通过TCP/IP与PLC通信 本文将全面介绍如何使用C#通过TCP/IP协议与各种PLC进行通信&#xff0c;包括西门子、罗克韦尔、三菱等主流品牌PLC的连接方法。 一、PLC通信基础 PLC通信协议概览协议类型适用品牌特点Modbus TCP通用协议简单易用&#xff0c;广泛支持Siemens S7西门子PL…

Java 学习笔记(基础篇3)

1. 数组&#xff1a;① 静态初始化&#xff1a;(1) 格式&#xff1a;int[] arr {1, 2, 3};② 遍历/* 格式&#xff1a; 数组名.length */ for(int i 0; i < arr.length; i){//在循环的过程中&#xff0c;i依次表示数组中的每一个索引sout(arr[i]);//就可以把数组里面的每一…

知识点汇总linuxC高级-3 shell脚本编程

shell脚本编程shell ---> 解析器&#xff1a;sh csh ksh bashshell命令 ---> shell解析的命令shell脚本 --> shell命令的有序集合shell脚本编程&#xff1a;将shell命令结合按照一定逻辑集合到一起&#xff0c;写到一个 .sh 文件&#xff0c;去实现一个或多个功能&…

【C++学习篇】:基础

文章目录前言1. main() 函数2. 变量赋值3. cin和cout的一些细节4. 基本类型运算5. 内存占用6. 引用7. 常量前言 C 语法的学习整理&#xff0c;作为个人总结使用。 1. main() 函数 #include <iostream> //使用输入输出流库&#xff08;cin&#xff0c;cout&#xff09;…

使用nginx反向代理kkfile

这篇说一下我解决的思路和方式哈&#xff0c;不一定适用于大家&#xff0c;可以做个参考比如我们的系统服务是http://10.63.25.35:80&#xff0c;而我们的文件服务是在10.63.25.37:8012上&#xff0c;正常不使用代理的话&#xff0c;我们前端调用后端接口&#xff0c;后端调用k…

【低成本扩容】动态扩容实战指南

面对扩容操作时&#xff0c;下面这种操作是否也会迷惑你&#xff1f;下面来为大家解惑~size_t newcapacity 2*_capacity > (_size len)?2*_capacity:(_sizelen); //len为即将插入的字符串有效字符个数//_size为当前字符串有效字符个数//_capacity为当前容量大小//newcapa…