Я пытаюсь запустить программу с открытым металлом на малине pi 2. Я хочу настроить кеш и mmu, и я ссылаюсь на arm documentation.Кэш настройки ARM и mmu от арматуры до ассемблера gnu arm
Во-первых, я использую ассемблер FASMARM для компиляции моего кода. Он может успешно работать на малине pi 2.
@;enable cache
@;Enables coherent requests to the processor
MRC p15, 0, r1, c1, c0, 1
ORR r1, r1, 0x40
MCR p15, 0, r1, c1, c0, 1
DSB
ISB
;@ Disable MMU
MRC p15, 0, r1, c1, c0, 0
BIC r1, r1, #0x1
MCR p15, 0, r1, c1, c0, 0
DSB
ISB
;@ Disable L1 Caches
MRC p15, 0, r1, c1, c0, 0
BIC r1, r1, 0x1000
BIC r1, r1, 0x4
MCR p15, 0, r1, c1, c0, 0
DSB
ISB
;@ Invalidate Instruction cache
MOV r1, #0
MCR p15, 0, r1, c7, c5, 0
DSB
ISB
;@ Invalidate Data cache
MRC p15, 1, r0, c0, c0, 0
MOV r3, 0x1ff
AND r0, r3, r0, LSR #13
MOV r1, #0
way_loop:
MOV r3, #0
set_loop:
MOV r2, r1, LSL #30
ORR r2, r2, r3, LSL #5
MCR p15, 0, r2, c7, c6, 2
ADD r3, r3, #1
CMP r0, r3
BGE set_loop
ADD r1, r1, #1
CMP r1, #4
BNE way_loop
DSB
ISB
;@ Invalidate TLB
MCR p15, 0, r1, c8, c7, 0
DSB
ISB
;@ Branch Prediction Enable
MOV r1, #0
MRC p15, 0, r1, c1, c0, 0
ORR r1, r1, 0x800
MCR p15, 0, r1, c1, c0, 0
DSB
;@ Enable L1 Data prefetch control
MRC p15, 0, r1, c1, c0, 1
ORR r1, r1, 0x6000
MCR p15, 0, r1, c1, c0, 1
DSB
ISB
;@ Initialize PageTable
MOV r0, 0xde2
MOV r1, 0x00004000
MOV r3, 0
ORR r2, r0, r3, LSL #20
STR r2, [r1]
BIC r0, r0, 0xc
ORR r0, r0, 0x4
BIC r0, r0, 0x7000
ORR r0, r0, 0x5000
ORR r0, r0, 0x10000
STR r0, [r1]
DSB
ISB
;@ Initialize MMU
MOV r1, 0x0
MCR p15, 0, r1, c2, c0, 2
MOV r1, 0x00004000
MCR p15, 0, r1, c2, c0, 0
DSB
ISB
;@ Set all Domains to Client
mov r1, 0x5555
movt r1, 0x5555
MCR p15, 0, r1, c3, c0, 0
DSB
ISB
;@ Enable MMU
MRC p15, 0, r1, c1, c0, 0
ORR r1, r1, 0x1
MCR p15, 0, r1, c1, c0, 0
DSB
ISB
;@ Enable cache
MRC p15, 0, r1, c1, c0, 0
ORR r1, r1, 0x4
MCR p15, 0, r1, c1, c0, 0
DSB
ISB
;@ Enable I cache
MRC p15, 0, r1, c1, c0, 0
ORR r1, r1, 0x1000
MCR p15, 0, r1, c1, c0, 0
DSB
ISB
@; end enable cache
Мне нужно преобразовать код в форму, которая может быть скомпилирована сборщиком GNU. Тем не менее, приведенный ниже код не может работать на Raspberry Pi 2.
@; enable cache
@; Enables coherent requests to the processor
MRC p15, 0, r1, c1, c0, 1
orr r1, r1, #0x40
MCR p15, 0, r1, c1, c0, 1
DSB
ISB
;@ Disable MMU
MRC p15, 0, r1, c1, c0, 0
BIC r1, r1, #0x1
MCR p15, 0, r1, c1, c0, 0
DSB
ISB
;@ Disable L1 Caches
MRC p15, 0, r1, c1, c0, 0
BIC r1, r1, #0x1000
BIC r1, r1, #0x4
MCR p15, 0, r1, c1, c0, 0
DSB
ISB
;@ Invalidate Instruction cache
MOV r1, #0
MCR p15, 0, r1, c7, c5, 0
DSB
ISB
;@ Invalidate Data cache
MRC p15, 1, r0, c0, c0, 0
LDR r3, =#0x1ff
AND r0, r3, r0, LSR #13
MOV r1, #0
way_loop:
MOV r3, #0
set_loop:
MOV r2, r1, LSL #30
ORR r2, r2, r3, LSL #5
MCR p15, 0, r2, c7, c6, 2
ADD r3, r3, #1
CMP r0, r3
BGE set_loop
ADD r1, r1, #1
CMP r1, #4
BNE way_loop
DSB
ISB
;@ Invalidate TLB
MCR p15, 0, r1, c8, c7, 0
DSB
ISB
;@ Branch Prediction Enable
MOV r1, #0
MRC p15, 0, r1, c1, c0, 0
ORR r1, r1, #0x800
MCR p15, 0, r1, c1, c0, 0
DSB
ISB
;@ Enable L1 Data prefetch control
MRC p15, 0, r1, c1, c0, 1
ORR r1, r1, #0x6000
MCR p15, 0, r1, c1, c0, 1
DSB
ISB
;@ Initialize PageTable
LDR r0, =#0xde2
MOV r1, #0x00004000
MOV r3, #0
ORR r2, r0, r3, LSL #20
STR r2, [r1]
BIC r0, r0, #0xc
ORR r0, r0, #0x4
BIC r0, r0, #0x7000
ORR r0, r0, #0x5000
ORR r0, r0, #0x10000
STR r0, [r1]
DSB
ISB
;@ Initialize MMU
MOV r1, #0x0
MCR p15, 0, r1, c2, c0, 2
MOV r1, #0x00004000
MCR p15, 0, r1, c2, c0, 0
DSB
ISB
;@ Set all Domains to Client
LDR r1, =#0x5555
movt r1, #0x5555
MCR p15, 0, r1, c3, c0, 0
DSB
ISB
;@ Enable MMU
MRC p15, 0, r1, c1, c0, 0
ORR r1, r1, #0x1
MCR p15, 0, r1, c1, c0, 0
DSB
ISB
;@ Enable cache
MRC p15, 0, r1, c1, c0, 0
ORR r1, r1, #0x4
MCR p15, 0, r1, c1, c0, 0
DSB
ISB
;@ Enable I cache
MRC p15, 0, r1, c1, c0, 0
ORR r1, r1, #0x1000
MCR p15, 0, r1, c1, c0, 0
DSB
ISB
Я не уверен, возникает ли проблема в обеспечении чных, потому что код может работать, если я закомментируйте раздел включить MMU.
Может ли кто-нибудь помочь мне, пожалуйста?
Я не думаю, что GNU Assembler по умолчанию использует унифицированный синтаксис. –
@Ross действительно (хотя синтаксис синтаксиса ARM настолько слаб, что он по-прежнему принимает большую часть UAL), но даже «.syntax unified; mov r0, # 0x5555' с '-march = armv7-a' по-прежнему ошибки с« недопустимой константой (5555) после исправления »- я проверял! – Notlikethat