Tiny6410之控制icache驱动

什么是cache:
    基于程序访问的局限性,在主存和CPU通用寄存器之间设置了一类高速的、容量较小的存储
器,把正在执行的指令地址附件的一部分指令或数据从主存调入这类存储器,供CPU 在一段时间
内使用,这对提高程序的运行速度有很大的作用。这类介于主存和CPU 之间的高速小容量存储器
称作高速cache。主要为了解决主存和CPU之间速度不匹配的问题。
    比较常见的cache 包括icache 和dcache。icache 的使用比较简单,系统刚上电时,icache
中的内容是无效的,并且icache 的功能是关闭的,往CP15 协处理器中的寄存器1 的bit[12]写
1 可以启动icache,写0 可以停止icache。icache 关闭时,CPU 每次取指都要读主存,性能非常
低。因为icache 可随时启动,越早开icache 越好。
与icache 相似,系统刚上电时, dcache 中的内容是无效的,并且dcache 的功能是关闭的,
往CP15 协处理器中的寄存器1 的bit[2]写1 可以启动dcache,写0 可以停止dcache。因为dcache
必须在启动mmu 后才能被启动

第一步:查找cache的控制寄存器

第二步:编写led灯的测试程序(见Tiny之LED裸机驱动)

第三步:实验现象流水灯会变化的快一些

编码实现:

 1 // start.S启动代码
 2 .global _start
 3
 4 _start:
 5
 6     // 把外设的基地址告诉CPU
 7     ldr r0, =0x70000000
 8     orr r0, r0, #0x13
 9     mcr p15,0,r0,c15,c2,4
10
11     // 关看门狗
12     ldr r0, =0x7E004000
13     mov r1, #0
14     str r1, [r0]
15
16     // 设置栈
17     ldr sp, =0x0C002000
18     //cache 控制寄存器
19     ldr r0, 0x72000004
20     // 开启icaches
21 #ifdef  CONFIG_SYS_ICACHE_OFF
22     bic    r0, r0, #0x00001000                    @ clear bit 12 (I) I-cache
23 #else
24     orr    r0, r0, #0x00001000                    @ set bit 12 (I) I-cache
25 #endif
26     mcr    p15, 0, r0, c1, c0, 0
27
28
29     // 调用C函数点灯
30     bl main
31
32 halt:
33     b halt
34
35 ///////////////////////////////////////
36 //Tiny6410Addr.h
37 #ifndef _Tiny6410Addr_H
38 #define _Tiny6410Addr_H
39 //GPK
40 #define GPKIO_BASE (0x7F008800)
41 #define rGPKCON0 (*(volatile unsigned*)(GPKIO_BASE+0x00))
42 #define rGPKDAT  (*(volatile unsigned*)(GPKIO_BASE+0x08))
43
44 #endif
45 //////////////////////////////////////
46 //clock.c
47 #include "Tiny6410Addr.h"
48 #define GPK4_OUT  (1<<4*4)
49 #define GPK5_OUT  (1<<4*5)
50 #define GPK6_OUT  (1<<4*6)
51 #define GPK7_OUT  (1<<4*7)
52 //延时函数
53 void delay()
54 {
55    volatile int i = 0x10000;
56    while (i--);
57 }
58
59 int main()
60 {
61     unsigned int i = 0x10;
62     //将GPK4-7设置为输出
63     rGPKCON0 = GPK4_OUT | GPK5_OUT |GPK6_OUT |GPK7_OUT;
64     //跑马灯式
65     while (1)
66     {
67         rGPKDAT = i;
68         i++;
69         if(i == 0x100)
70             i=0x10;
71         delay();
72     }
73
74     return 0;
75     }
76 //////////////////////////////
77 //Makefile
78 led.bin: start.o main.o
79     arm-linux-ld -Ttext 0x50000000 -o led.elf $^
80     arm-linux-objcopy -O binary led.elf led.bin
81     arm-linux-objdump -D led.elf > led_elf.dis
82 %.o : %.S
83     arm-linux-gcc -o [email protected] $< -c
84 %.o : %.c
85     arm-linux-gcc -o [email protected] $< -c
86 clean:
87     rm *.o *.elf *.bin *.dis -rf

时间: 2024-10-21 14:16:17

Tiny6410之控制icache驱动的相关文章

Tiny6410之按键裸机驱动

操作步骤: 第一步:查看开发板电路原理图 找到LED 和按键的管脚所对应的寄存器 LED:(见Tiny6410之LED裸机驱动) nLED_1 - GPK4 nLED_2 - GPK5 nLED_3 - GPK6 nLED_4 - GPK7 Buttons: K1   GPN0 K2   GPN1 K3   GPN2 K4   GPN3 由原理图可知LED对应的寄存器为GPK寄存器,buttons 对应的寄存器为GPL,由二极管的特性可知当LED_n为低电平时LED灯亮第二步:查看数据手册找到G

第四天:SLAM智能小车DIY乐趣-小车控制ROS驱动包开发

小车控制ROS驱动包开发 ####写在前面#### 对于做纯SLAM算法和应用功能开发的朋友来说,其实不需要搞明白小车的底层硬件原理和软件实现等繁琐的细节,只需要通过上层API调用来实现小车的控制等操作就可以了.因此,本文开始讲解用于提供上层API调用的ROS驱动包,本文主要内容: 1) 通信协议简介(stm32与ROS驱动包通信) 2) ROS接口(topic订阅与发布) 3) ROS驱动包程序解析 4) 基于航迹推演的里程计解算 ####正文#### 1.通信协议简介(stm32与ROS驱动

安卓控制LED驱动编写

安卓控制LED驱动编写 开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 打开Android Studio3.1 新建一个 NO Activity 项目 切换为project视图,到/app/src/main/java/com.xxxxxx目录,右击新建Activity->empty Activity 不要勾选×××选项 (勾选Generate Layout File表示会自

Tiny6410之NAND FLASH驱动

一.NAND FLASH的特点 S3C6410的NAND FLASH控制器有如下特点 1.自导入模式:复位后,引导代码被送入到8KB的STEPPINGSTONE中,引导代码移动完毕,引导代码将在STEPPINGSTONE中执行.导入期间,NAND FLASH控制器不支持ECC矫正. 2.NAND FLSH 控制器I/F:支持512字节和2KB页 3.软件模式:用户可以直接访问nand flash 控制器,该特性可以用于读/檫/编程nand flash 存储器. 1)写命令寄存器=NAND FLA

Tiny6410之LED裸机驱动

操作步骤: 第一步:查看开发板电路原理图 找到LED 的管脚所对应的寄存器 nLED_1 - GPK4 nLED_2 - GPK5 nLED_3 - GPK6 nLED_4 - GPK7 由原理图可知LED对应的寄存器为GPK寄存器,由二极管的特性可知当LED_n为低电平时LED灯亮第二步:查看数据手册找到GPK寄存器的地址及每位表示的意义 Register  Address GPKCON0   0x7F008800 GPKCON1   0x7F008804 GPKDAT    0x7F0088

Tiny6410之uart裸机驱动

UART简介: UART(Universal Asynchronous Receiver and Transmitter)通用异步收发器(异步串行通信口),是一种通用的数据通信协议,它包括了RS232.RS499.RS423.RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称.而RS232.RS499.RS423.RS422和RS485等,是对应各种异步串行通信口的接口标准和总线标准,它规定了通信口的电气特性.传输速率.连接特性和接口的机械特性等内容,这些东东都

Linux-2.6.39在Tiny6410上的移植 - 外设驱动移植

Linux内核版本号:linux 2.6.39 交叉编译工具:arm-linux-gcc 4.5.1 Linux内核下载:www.kernel.org 开发板:友善之臂Tiny6410 LCD:友善之臂S70 一.移植LED驱动 打开arch/arm/mach-s3c64xx/mach-mini6410.c添加下列代码: 1 static struct gpio_led tiny6410_gpio_led[] = { 2 [0] = { 3 .name = "led1", //设备名

基于ARM Cortex-A8和Android 4.x的联动报警系统 (Android 、A8、Linux、驱动、NDK)

· 课程讲师:老夫子 · 课程分类:Android · 适合人群:高级 · 课时数量:38(70节)课时 · 更新程度:完毕 · 服务类型:C类(普通服务类课程) · 用到技术:Android.A8.210.Linux.驱动.NDK.报警 · 涉及项目:联动报警系统 对这个课程有兴趣的可以加我qq2748165793 1.课程研发环境 本课程包括JAVA应用.C语言驱动.NDK(应用调用驱动)等方面内容,课程涉及主要工具如下: 开发工具:Eclipse.Source Insight 交叉编译工具

《物联网框架ServerSuperIO教程》-22.Web端对传感器实时监测与控制。附:v3.6.8版本,支持WebSocket

1.ServerSuperIO v3.6.8更新内容 1.1 增加WebSocket服务端功能,支持自控模式.并发模式.单例模式,不支持轮询模式1.2 接收数据缓存与现有的IO实例分离.1.3 优化代码. 2.监测与控制的结构图 3.Web端对传感器监测与控制,视频教程内容 插件化驱动的开发,然后挂载驱动运行.有人网友理解上有误区. 如何发送数据 服务实例的代理交互的角色 设备驱协传递数据到服务实例 服务实例接受控制命令,并控制设备驱动 操作效果: 视频教程说明:(高清视频下载:http://p