【ARM】Tiny4412裸板编程之协处理器
00. 目錄
文章目錄
- 00. 目錄
- 01. 開發(fā)環(huán)境
- 02. 協(xié)處理器簡(jiǎn)介
- 03. 獲取Main ID
- 04. 獲取CCSIDR
- 05. 獲取SCTLR
- 06. ID_MMFR3
- 07. 附錄
01. 開發(fā)環(huán)境
- 開發(fā)板:Tiny4412SDK標(biāo)準(zhǔn)版 「Tiny4412 SDK 1506」
- 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
- 平臺(tái):Ubuntu 20.04
02. 協(xié)處理器簡(jiǎn)介
協(xié)處理器(coprocessor),一種芯片,用于減輕系統(tǒng)微處理器的特定處理任務(wù)。
協(xié)處理器,這是一種協(xié)助中央處理器完成其無(wú)法執(zhí)行或執(zhí)行效率、效果低下的處理工作而開發(fā)和應(yīng)用的處理器。這種中央處理器無(wú)法執(zhí)行的工作有很多,比如設(shè)備間的信號(hào)傳輸、接入設(shè)備的管理等;而執(zhí)行效率、效果低下的有圖形處理、聲頻處理等。為了進(jìn)行這些處理,各種輔助處理器就誕生了。需要說(shuō)明的是,由于現(xiàn)在的計(jì)算機(jī)中,整數(shù)運(yùn)算器與浮點(diǎn)運(yùn)算器已經(jīng)集成在一起,因此浮點(diǎn)處理器已經(jīng)不算是輔助處理器。而內(nèi)建于CPU中的協(xié)處理器,同樣不算是輔助處理器,除非它是獨(dú)立存在。
ARM 微處理器可支持多達(dá) 16 個(gè)協(xié)處理器,用于各種協(xié)處理操作,在程序執(zhí)行的過(guò)程中,每個(gè)協(xié)處理器只執(zhí)行針對(duì)自身的協(xié)處理指令,忽略 ARM 處理器和其他協(xié)處理器的指令。ARM 的協(xié)處理器指令主要用于 ARM 處理器初始化 ARM 協(xié)處理器的數(shù)據(jù)處理操作,以及在ARM 處理器的寄存器和協(xié)處理器的寄存器之間傳送數(shù)據(jù),和在 ARM 協(xié)處理器的寄存器和存儲(chǔ)器之間傳送數(shù)據(jù)。 ARM 協(xié)處理器指令包括以下 5 條: — CDP 協(xié)處理器數(shù)操作指令— LDC 協(xié)處理器數(shù)據(jù)加載指令— STC 協(xié)處理器數(shù)據(jù)存儲(chǔ)指令— MCR ARM 處理器寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令— MRC 協(xié)處理器寄存器到ARM 處理器寄存器的數(shù)據(jù)傳送指令。
ARM:協(xié)處理器包括以下5條:
-
CDP:協(xié)處理器數(shù)據(jù)操作指令。
-
LDC:協(xié)處理器數(shù)據(jù)加載指令。
-
STC:協(xié)處理器數(shù)據(jù)存儲(chǔ)指令。
-
MCR:ARM處理器寄存器到協(xié)處理器寄存器的數(shù)據(jù)傳送指令。
-
MRC:協(xié)處理器寄存器到ARM處理器寄存器的數(shù)據(jù)傳送指令 。
03. 獲取Main ID
B3.17.2 Full list of VMSA CP15 registers, by coprocessor register number
MIDR相關(guān)描述31:24位
16:19位描述
訪問(wèn)方法:
MRC p15, 0, <Rt>, c0, c0, 0 ; Read MIDR into Rtcp15.S文件內(nèi)容如下
.section .text.align 2.global get_midr get_midr:MRC p15, 0, r0, c0, c0, 0 mov pc, lrtest.c文件內(nèi)容如下
#include <string.h> #include <adc.h>void (*udelay)(unsigned int) = (void*)0x43e26480; int (*print)(const char *format, ...) = (void*)0x43e11a2c;int main(void) {print("main start\n");print("MIDR: %p\n", get_midr());print("main end\n");return 0; }執(zhí)行結(jié)果
## Starting application at 0x50000000 ... main start MIDR: 413fc090 main end ## Application terminated, rc = 0x0 DengJin #04. 獲取CCSIDR
CCSIDR寄存器介紹
訪問(wèn)方法
MRC p15, 1, <Rt>, c0, c0, 0 ; Read current CCSIDR into Rtcp15.S文件
.section .text.align 2.global get_ccsidr get_ccsidr:MRC p15, 1, r0, c0, c0, 0mov pc, lrtest.c文件
#include <string.h> #include <adc.h>void (*udelay)(unsigned int) = (void*)0x43e26480; int (*print)(const char *format, ...) = (void*)0x43e11a2c;int main(void) {print("main start\n");print("MIDR: %p\n", get_midr());print("CCSIDR: %p\n", get_ccsidr());print("main end\n");return 0; }執(zhí)行結(jié)果
## Starting application at 0x50000000 ... main start MIDR: 413fc090 CCSIDR: 701fe019 main end ## Application terminated, rc = 0x005. 獲取SCTLR
B4.1.130 SCTLR, System Control Register, VMSA
M, bit[0] MMU enable. This is a global enable bit for the PL1&0 stage 1 MMU. The possible values of this
bit are:
0 PL1&0 stage 1 MMU disabled.
1 PL1&0 stage 1 MMU enabled.
In an implementation that includes the Security Extensions, this bit is Banked between the Secure
and Non-secure copies of the register.
訪問(wèn)方法
MRC p15, 0, <Rt>, c1, c0, 0 ; Read SCTLR into Rt MCR p15, 0, <Rt>, c1, c0, 0 ; Write Rt to SCTLRcp15.S文件
.section .text.align 2.global get_sctlr get_sctlr:MRC p15, 0, r0, c1, c0, 0mov pc, lrtest.c文件
#include <string.h> #include <adc.h>void (*udelay)(unsigned int) = (void*)0x43e26480; int (*print)(const char *format, ...) = (void*)0x43e11a2c;int main(void) {print("main start\n");print("MIDR: %p\n", get_midr());print("CCSIDR: %p\n", get_ccsidr());print("SCTLR: %p\n", get_sctlr());print("main end\n");return 0; }執(zhí)行結(jié)果
## Starting application at 0x50000000 ... main start MIDR: 413fc090 CCSIDR: 701fe019 SCTLR: 00c5187a main end ## Application terminated, rc = 0x006. ID_MMFR3
B4.1.92 ID_MMFR3, Memory Model Feature Register 3, VMSA
訪問(wèn)方法
MRC p15, 0, <Rt>, c0, c1, 7 ; Read ID_MMFR3 into Rtcp15.S文件
.section .text.align 2.global get_id_mmfr3 get_id_mmfr3:MRC p15, 0, r0, c0, c1, 7mov pc, lrtest.c文件
#include <string.h> #include <adc.h>void (*udelay)(unsigned int) = (void*)0x43e26480; int (*print)(const char *format, ...) = (void*)0x43e11a2c;int main(void) {print("main start\n");print("MIDR: %p\n", get_midr());print("CCSIDR: %p\n", get_ccsidr());print("SCTLR: %p\n", get_sctlr());print("ID_MMFR3: %p\n", get_id_mmfr3());print("main end\n");return 0; }執(zhí)行結(jié)果
## Starting application at 0x50000000 ... main start MIDR: 413fc090 CCSIDR: 701fe019 SCTLR: 00c5187a ID_MMFR3: 00102111 main end ## Application terminated, rc = 0x007. 附錄
Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf
總結(jié)
以上是生活随笔為你收集整理的【ARM】Tiny4412裸板编程之协处理器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【ARM】Tiny4412裸板编程之MM
- 下一篇: 【ARM】Tiny4412裸板编程之MM