00. 目录
01. 开发环境
- 开发板:Tiny4412SDK标准版 「Tiny4412 SDK 1506」
- 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
- 平台:Ubuntu 20.04
02. 异常向量表
B1.8.1 Exception vectors and the exception base address
03. 异常向量表实现
vector.s文件内容如下
.section .text
.align 2
.global vector_start
vector_start:
b reset @0x0
b undef @0x4
b swi @0x8
b pabort @0xC
b dabort @0x10
nop @0x14
b irq @0x18
b firq @0x1C
reset:
b reset
undef:
b undef
swi:
b swi
pabort:
b pabort
dabort:
b dabort
irq:
b irq
firq:
b firq
.align 2
.global vector_end
vector_end:
nop
04. 设置Vectors bit
B6.1.86 SCTLR, System Control Register, PMSA
访问系统寄存器的方法
MRC p15, 0, <Rt>, c1, c0, 0 ; Read SCTLR into Rt
MCR p15, 0, <Rt>, c1, c0, 0 ; Write Rt to SCTLR
cp15.S增加如下函数
.section .text
.align 2
.global set_vector_bit
set_vector_bit:
mrc p15, 0, r0, c1, c0, 0
orr r0, r0, #(1 << 13)
mcr p15, 0, r0, c1, c0, 0
mov pc, lr
05. 主函数实现
test.c内容如下
#include <string.h>
#include <stdlib.h>
#include <adc.h>
#include <gpio.h>
void (*udelay)(unsigned int) = (void*)0x43e26480;
int (*print)(const char *format, ...) = (void*)0x43e11a2c;
extern unsigned int __bss_start;
extern unsigned int __bss_end;
extern void vector_start();
extern void vector_end();
//TTB的基地址
U32 *ttb = (void*)0x60000000;
U32 *ttb_c = (void*)0x61000000;
int main(void)
{
int i = 0;
//0x40000000 ~ 0x80000000 1G
memset((void*)&__bss_start, 0, (int)&__bss_end -(int)&__bss_start);
print("main start\n");
memset((void*)ttb, 0, 4096 * 4);
ttb_l1_init(ttb);
ttb_l1_mmap(ttb, 0xffff0000, 0x7fff0000);
set_vector_bit();
//设置TTB基地址
set_ttb(ttb);
//设置域访问的权限
set_domain(0xffffffff);
//使能MMU
enable_mmu();
//将中断向量表拷贝到0xffff0000地址处
memcpy((void*)0xffff0000, (void*)vector_start, vector_end - vector_start);
print("main end\n");
return 0;
}
06. 附录
6.1 Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf
6.2 ARM® Architecture Reference Manual ARMv7-A and ARMv7-R edition