看门狗定时器watch dog timer
作用:电子设备跑飞或死机时使设备自动复位(无人值守)
物理特性:实际是soc内部的定时器,时间到之前必须重新置位看门狗,否则会强制复位
原理图:不用分析,属于内部外设
数据手册:
现在先关闭看门狗(一般默认工作)
实际上s5pv210bl0 已经关了 看不到现象
在led流水灯基础上改代码
//定义寄存器宏
#define GPJ0_CON 0XE0200240
#define GPJ0_DAT 0XE0200244
#define WTCON 0XE2700000
_start:
//关看门狗
ldr r0, =0x0
ldr r1, =WTCON
str r0, [r1]
//首先配置寄存器
ldr r0, =0x111111
ldr r1, =GPJ0_CON
str r0, [r1]
/**********后面的代码没有更改***********/
设置栈调用c语言
作用:提供C语言运行时runtime环境
C语言局部变量是用栈实现的
ARM37个寄存器6种模式下都有各自的sp寄存器(r13)
现在设置栈,目前只需设置自己模式下的栈到合法位置
系统复位后默认进入svc模式下
- 先设置SVC模式(目前可省)
- 直接操作SP
- 栈必须是可用的内存(被初始化,可以访问且���只会被用作栈)
- 目前可用SRAM
栈有四种:满减栈 满增栈 空减栈 空增栈
满: 进栈时先移动指针再存数据 出栈时先出数据再移动指针
减:进栈时指针向下(减小)移动 出栈时指针向上移动
ARM中ATPCS要求使用满减栈
故SVC栈设置为0XD0037D80
//设置SVC栈
ldr sp, =SVC_STACK
此时开始之后可以使用c语言了
写代码:
- 修改makefile
- 添加c源文件
- 在汇编中用bl xxx调用c函数(无参)
- 写c函数
补充:volatile 作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值
Makefile中注意
%.o: %.S
arm-linux-gcc -o $@ $< -c -nostdlib
%.o: %.c
arm-linux-gcc -o $@ $< -c -nostdlib
-nostdlib作用: 不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。这个选项常用于编译内核、bootloader等程序,它们不需要启动文件、标准库文件。
iCache
作用:cache是一种内存 高速缓存
速度比较:CPU>寄存器>cache>DDR>硬盘
上面是指令缓存和数据缓存
下面L2cache是二级缓存
210有
32k dcache 缓存数据:裸机一般不用 操作系统虚拟地址等时候用
32k icache 缓存指令:提前读取正在运行的指令旁边的指令读出
iCache的一切动作都是自动的,我们只需打开或关闭
实际上210 IROM中都已经打开了
故现在关icache看现象
控制方法:cp15
CP15 —系统控制协处理器 (the system control coprocessor),通过协处理器指令 MCR和 MRC 提供具体的寄存器来配置和控制 caches、MMU、保护系统、配置时钟模式(在 bootloader时钟初始化用到)。CP15包含16个32位的寄存器,其编号为0~15。
寄存器编号 | 基本作用 | 特殊用途 |
c0 | ID编码(只读) | ID和cache类型 |
c1 | 控制位 | 各种控制位 |
c2 | 存储器保护和控制 | MMU:地址转换表地址 MPU:cache属性设置 |
c3 | 内存保护和控制 | MMU:域访问控制 MPU:写缓存控制 |
c4 | 内存保护和控制 | 保留 |
c5 | 内存保护和控制 | MMU:错误状态 MPU:访问权限控制 |
c6 | 内存保护和控制 | MMU:错误状态 MPU:保护区域控制 |
c7 | cache和写缓存 | cache和写缓存控制 |
c8 | 内存保护和控制 | MMU:TLB控制 MPU:保留 |
c9 | cache和写缓存 | cache锁定 |
c10 | 内存保护和控制 | MMU:TLB控制 MPU:保留 |
c11 | 保留 | 保留 |
c12 | 保留 | 保留 |
c13 | 进程ID | 进程ID |
c14 | 保留 | 保留 |
c15 | 芯片生产厂商定义 | 芯片生产厂商定义 |
寄存器c1
C1中的控制位 | 含义 |
M(bit[0]) | 0 :禁止 MMU 或者 PU |
A(bit[1]) | 0 :禁止地址对齐检查 |
C(bit[2]) | 当数据cache和指令cache分开时,本控制位禁止/使能数据cache。当数据cache和指令cache统一时,该控制位禁止/使能整个cache。 |
W(bit[3]) | 0 :禁止写缓冲 |
P(bit[4]) | 对于向前兼容26位地址的ARM处理器,本控制位控制PROG32控制信号 |
D(bit[5]) | 对于向前兼容26位地址的ARM处理器,本控制位控制DATA32控制信号 |
L(bit[6]) | 对于ARMv3及以前的版本,本控制位可以控制处理器的中止模型 |
B(bit[7]) | 对于存储系统同时支持big-endian和little-endian的ARM系统,本控制位配置系统的存储模式 |
S(bit[8]) | 在基于 MMU 的存储系统中,本位用作系统保护 |
R(bit[9]) | 在基于 MMU 的存储系统中,本位用作 ROM 保护 |
F(bit[10]) | 由生产商定义 |
Z(bit[11]) | 对于支持跳转预测的ARM系统,本控制位禁止/使能跳转预测功能 |
I(bit[12]) | 当数据cache和指令cache是分开的,本控制位禁止/使能指令cache |
V(bit[13]) | 对于支持高端异常向量表的系统,本控制位控制向量表的位置 |
PR(bit[14]) | 如果系统中的cache的淘汰算法可以选择的话,本控制位选择淘汰算法 |
L4(bit[15]) | 对于ARM版本5及以上的版本,本控制位可以提供兼容以前的ARM版本的功能 |
Bits[31:16]) | 这些位保留将来使用,应为UNP/SBZP |
故操作cp15中寄存器c1的bit12
0 :禁止指令 cache 1 :使能指令 cache
代码:
//开关icache
mrc p15,0,r0,c1,c0,0//读cp15的c1到 r0
bic r0, r0, #(1<<12)//置0关 orr r0, r0, #(1<<12)//置1开
mcr p15,0,r0,c1,c0,0//写回去
MRC指令将协处理器的寄存器中数值传送到ARM处理器的寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。
MCR指令将ARM处理器的寄存器中的数据传送到协处理器的寄存器中。如果协处理器不能成功地执行该操作,将产生未定义的指令异常中断。
BIC指令用于清除操作数1的某些位,并把结果放置到目的寄存器中。
ORR指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。