1.7.关看门狗.设置栈.开icache

看门狗定时器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模式下

  1. 先设置SVC模式(目前可省)
  2. 直接操作SP
  3. 栈必须是可用的内存(被初始化,可以访问且���只会被用作栈)
  4. 目前可用SRAM

 

栈有四种:满减栈 满增栈 空减栈 空增栈

满: 进栈时先移动指针再存数据 出栈时先出数据再移动指针

减:进栈时指针向下(减小)移动 出栈时指针向上移动

ARM中ATPCS要求使用满减栈

故SVC栈设置为0XD0037D80

//设置SVC栈

ldr sp, =SVC_STACK

此时开始之后可以使用c语言了

写代码:

  1. 修改makefile
  2. 添加c源文件
  3. 在汇编中用bl xxx调用c函数(无参)
  4. 写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
1 :使能 MMU 或者 PU 
如果系统中没有MMU及PU,读取时该位返回0,写入时忽略该位。

A(bit[1])

0 :禁止地址对齐检查
1 :使能地址对齐检查

C(bit[2])

当数据cache和指令cache分开时,本控制位禁止/使能数据cache。当数据cache和指令cache统一时,该控制位禁止/使能整个cache。
0 :禁止数据 / 整个 cache 
1 :使能数据 / 整个 cache
如果系统中不含cache,读取时该位返回0.写入时忽略
当系统中不能禁止cache 时,读取时返回1.写入时忽略

W(bit[3])

0 :禁止写缓冲
1 :使能写缓冲
如果系统中不含写缓冲时,读取时该位返回0.写入时忽略
当系统中不能禁止写缓冲时,读取时返回1.写入时忽略

P(bit[4])

对于向前兼容26位地址的ARM处理器,本控制位控制PROG32控制信号
0 :异常中断处理程序进入 32 位地址模式
1 :异常中断处理程序进入26 位地址模式
如果本系统中不支持向前兼容26位地址,读取该位时返回1,写入时忽略

D(bit[5])

对于向前兼容26位地址的ARM处理器,本控制位控制DATA32控制信号
0 :禁止 26 位地址异常检查
1 :使能 26 位地址异常检查
如果本系统中不支持向前兼容26位地址,读取该位时返回1,写入时忽略

L(bit[6])

对于ARMv3及以前的版本,本控制位可以控制处理器的中止模型
0 :选择早期中止模型
1 :选择后期中止模型

B(bit[7])

对于存储系统同时支持big-endian和little-endian的ARM系统,本控制位配置系统的存储模式
0 : little endian 
1 : big endian
对于只支持little-endian的系统,读取时该位返回0,写入时忽略
对于只支持big-endian的系统,读取时该位返回1,写入时忽略

S(bit[8])

在基于 MMU 的存储系统中,本位用作系统保护

R(bit[9])

在基于 MMU 的存储系统中,本位用作 ROM 保护

F(bit[10])

由生产商定义

Z(bit[11])

对于支持跳转预测的ARM系统,本控制位禁止/使能跳转预测功能
0 :禁止跳转预测功能 
1 :使能跳转预测功能
对于不支持跳转预测的ARM系统,读取该位时返回0,写入时忽略

I(bit[12])

当数据cache和指令cache是分开的,本控制位禁止/使能指令cache
0 :禁止指令 cache 
1 :使能指令 cache
如果系统中使用统一的指令cache和数据cache或者系统中不含cache,读取该位时返回0,写入时忽略。当系统中的指令cache不能禁止时,读取时该位返回1,写入时忽略

V(bit[13])

对于支持高端异常向量表的系统,本控制位控制向量表的位置
0 :选择低端异常中断向量 0x0~0x1c 
1 :选择高端异常中断向量0xffff0000~ 0xffff001c
对于不支持高端异常向量表的系统,读取时该位返回0,写入时忽略

PR(bit[14])

如果系统中的cache的淘汰算法可以选择的话,本控制位选择淘汰算法
0 :常规的 cache 淘汰算法,如随机淘汰 
1 :预测性淘汰算法,如round-robin 淘汰算法
如果系统中cache的淘汰算法不可选择,写入该位时忽略。读取该位时,根据其淘汰算法是否可以比较简单地预测最坏情况返回0或者1

L4(bit[15])

对于ARM版本5及以上的版本,本控制位可以提供兼容以前的ARM版本的功能
0 :保持 ARMv5 以上版本的正常功能
1 :将 ARMv5 以上版本与以前版本处理器 兼容,不根据跳转地址的 bit[0] 进行 ARM 指令和 Thumb 状态切换: bit[0] 等于 0 表示 ARM 指令,等于 1 表示 Thumb 指令

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指令用于在两个操作数上进行逻辑或运算,并把结果放置到目的寄存器中。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hehelot

感谢您的打赏!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值