嵌入式硬件——ARM

一、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…