您的位置 首页 > 数码极客

【0xc000014c修复不重装】协处理器指令_开启ICache代码示例

资料来源:白文网_嵌入式Linux Wiki _ JZ 2440新一期视频Wiki教程(视频文字版)

作者:贝东山

正文字数:2403,阅读时间:2.5分钟

CPU在2440上共有16个第二个处理器,从CP0到CP15。

CP15管理缓存MMU我们要启动缓存,就必须操作CP15二级处理器指令。首先看一下硬件结构。

CP15也有很多寄存器C0 ~ C15起始C7’是备份寄存器

现在,主CPU的值R0被传递到CP15的寄存器。

我们要引入辅助处理器指令

MRC

Mov r1、r0

结果是r0=传递=R1

MRC

c coprocessor=propagate=register

Mcr是将主处理器的值发送给辅助处理器。查看register=propagate=co processor语法格式,并在2440上检索MRC。

得到语法形式

例如,Mcr | MRC {cond} p #,expression1,rd,cn,cm {,expression2}

Mcr P15、0、r1和c1将主处理器的值发送到次处理器。

如果将Expression1的值设定为0,则不可用

R1是默认CPU寄存器的值

C1是cp15寄存器的值

Cm,不需要,写为c0

如果将Expression2值设定为0,则不可用

Cm和expression2用于区分哪个C1,通常写为c0,0。此命令表示主CPU的R1值将写入辅助处理器cp15的cp1寄存器中。

相反,应该从cp15寄存器读取主CPU寄存器。

Mrc p15、0、r1、c1、c0、0此命令指示第二处理器cp15 C1寄存器的值将读取写入主CPU的R1寄存器

2410文档中有cp15寄存器的作用

其中寄存器1控制寄存器下图说明了控制寄存器1的功能

Bit12位控制cache命令的打开或关闭。我将bit 12设置为1

C7有多种寄存器,对应于多种功能。

寄存器7用于操作缓存,并根据语法规则cm{,expression2}区分要选择的C7

通过以下写入程序,cache将知道2440上有data cache和指令cache。其中,必须启用地址映射,才能使用data cache。只能使用指令cache

打开

Reset:

/*关闭看门狗*/

Ldr r0,=0x53000000

Ldr r1,=0

Str r1,[r0]

/* mpll设定,FCLK : HCLK : PCLK=400m : 100m : 50m */

/* locktime(0 x 4 c 000000)=0 x ffffffff */

Ldr r0,=0x4C000000

Ldr r1,=0xFFFFFFFF

Str r1,[r0]

/* clkdivn (0x4c000014)=0x5、TF clk : th clk : TPC lk=1:4:8 */

Ldr r0,=0x4C000014

Ldr r1,=0x5

Str r1,[r0]

/*设置CPU以异步模式工作*/

Mrc p15,0、r0、c1、c0,0

Orrr0、r0、# 0 xc 000000//r 1 _ nf :或:r1 _ ia

Mcr p15,0、r0、c1、c0,0

/* mpllcon设置(0x4c000004)=(9212) | (14) | (10)

* m=MDIV 8=92 8=100

* p=PDIV 2=1 2=3

* s=SDIV=1

* fclk=2 * m * fin/(p * 2s)=2 * 100 * 12/(3 * 2 1)=400m

*/

Ldr r0,=0x4C000004

Ldr r1,=(9212)|(14)|(10)

Str r1,[r0]

/*设置PLL后,锁定时间将被锁定,直到PLL输出稳定为止

*然后,CPU将在新频率FCLK上运行

*/

/*

icache

*/

Bl enable_icache

/*内存: sp堆栈设置*/

/*启用分辨率nor/nand

*请写0 ~ 0地址,然后再读一遍

*得到0后,0地址的内容被修改,与ram相对应。NAND启动

*否则,将启动nor

*/

Mov r1,#0

Ldr r0,[r1] /*读取原始值备份*/

Str r1,[r1] /* 0-[0] */

Ldr r2,[r1] /* r2=[0] */

Cmp r1、R2 /* r1==r2?相同表示法启用NAND */

Ldr sp,=0x 4000000 4096/*首先假设为nor启动*/

Moveq sp、#4096 /* NAND启动*/

Streq r0,[r1] /*恢复原始值*/

Bl sdram_init

//bl使用具有初始值的数组,而不是sdram_init2 /*与位置无关的代码*/

/*大象更改文本、rodata、数据部分全部程序*/

Bl copy2sdram

/*清除BSS段*/

Bl clean_bss

/*重置后,CPU处于SVC模式

*现在切换到usr模式

*/

Mrs r0、cpsr /*读取cpsr */

将Bic r0、r0、#0xf /* M4-M0修改为0b10000以使用usr模式*/

Bic r0、r0、#(17) /*清除I位*/

Msr cpsr、r0

/* sp _ usr设置*/

Ldr sp,=0x33f00000

Ldr pc,=sdram

Sdram:

Bl uart0_init

Bl print1

/*故意添加未定义的命令*/

Und_code:

.word0xdeadc0de /*未定义的命令*/

Bl print2

SWI0x123 /*运行此命令以触发SWI异常,进入0x 8 */

//BL使用main /* bl命令进行相对跳跃,程序仍然在NOR/sram中使用*/

Ldr lr,=halt

Ldr pc、=main /*绝对跳跃、SDRAM */

哈特:

b霍尔特

怎么样才能让icache打开2410芯片手册?

Enable_icache:

/* icache */

Mrc p15、0、r0、c1、c0、0

Orrr0、r0、# (112)/* r0=r0 or (112) */

Mcr p15、0、r0、c1、c0和0//条修改后的r0被写入cp15的cp1寄存器中

Mov pc提高lr刷屏效率。

“新产品选拔”STM32MP157开发版热卖!第一批只有300套

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐