JZ2440存储管理器代码实现(使用SDRAM)

本文介绍了一种在嵌入式系统中初始化SDRAM的方法,包括禁用看门狗、配置存储器控制器、将代码从Steppingstone复制到SDRAM、设置堆栈以及跳转到SDRAM中的main函数执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
这里写图片描述

启动文件初始化代码:
@*************************************************************************
@ File:head.S
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@ 代码流程:
@1> 关看门狗
@2> 设置存储控制寄存器(配置)
@3> 复制代码到SDRAM中
@4> 设置堆栈
@5> 跳转到main执行
@*************************************************************************       

.equ        MEM_CTL_BASE,       0x48000000          @.equ 命令用于把常量值设置为可以在文本段中使用的符号
.equ        SDRAM_BASE,         0x30000000          @类似于C语言中#define
                                                    @0x48000000-BWSCON,0x30000000-BANK6

.text
.global _start
_start:
    bl  disable_watch_dog               @ 关闭WATCHDOG,否则CPU会不断重启
    bl  memsetup                        @ 设置存储控制器
    bl  copy_steppingstone_to_sdram     @ 复制代码到SDRAM中
    ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行
on_sdram:
    ldr sp, =0x34000000                 @ 设置堆栈
    bl  main
halt_loop:
    b   halt_loop

disable_watch_dog:
    @ 往WATCHDOG寄存器写0即可
    mov r1,     #0x53000000
    mov r2,     #0x0
    str r2,     [r1]
    mov pc,     lr      @ 返回

copy_steppingstone_to_sdram:
    @ 将Steppingstone的4K数据全部复制到SDRAM中去
    @ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000

    mov r1, #0
    ldr r2, =SDRAM_BASE
    mov r3, #4*1024
1:  
    ldr r4, [r1],#4     @ 从Steppingstone读取4字节的数据,并让源地址加4
    str r4, [r2],#4     @ 将此4字节的数据复制到SDRAM中,并让目地地址加4
    cmp r1, r3          @ 判断是否完成:源地址等于Steppingstone的末地址?
    bne 1b              @ 若没有复制完,继续
    @b:backward 向后跳转  f:forward 向前跳转  
    mov pc,     lr      @ 返回

memsetup:
    @ 设置存储控制器以便使用SDRAM等外设

    mov r1,     #MEM_CTL_BASE   @存储控制器的13个寄存器的开始地址,0x48000000
    adrl    r2, mem_cfg_val         @ 这13个值的起始存储地址
    add r3,     r1, #52             @ 13*4 = 54
1:  
    ldr r4,     [r2], #4            @ 读取设置值,并让r2加4
    str r4,     [r1], #4            @ 将此值写入寄存器,并让r1加4
    cmp r1,     r3                  @ 判断是否设置完所有13个寄存器
    bne 1b                          @ 若没有写成,继续
    @b:backward 向后跳转  f:forward 向前跳转  
    mov pc,     lr                  @ 返回


.align 4                                @以4字节对齐
mem_cfg_val:        
    @ 存储控制器13个寄存器的设置值
    .long   0x22011110      @ BWSCON   0x48000000
    .long   0x00000700      @ BANKCON0 0x48000004
    .long   0x00000700      @ BANKCON1 0x48000008
    .long   0x00000700      @ BANKCON2 0x4800000C
    .long   0x00000700      @ BANKCON3 0x48000010
    .long   0x00000700      @ BANKCON4 0x48000014
    .long   0x00000700      @ BANKCON5 0x48000018
    .long   0x00018005      @ BANKCON6 0x4800001C
    .long   0x00018005      @ BANKCON7 0x48000020
    .long   0x008C07A3      @ REFRESH  0x48000024
    .long   0x000000B1      @ BANKSIZE 0x48000028
    .long   0x00000030      @ MRSRB6   0x4800002C
    .long   0x00000030      @ MRSRB7   0x48000030
Makefile
sdram.bin : head.S  leds.c
    arm-linux-gcc  -c -o head.o head.S
    arm-linux-gcc -c -o leds.o leds.c
    #-g:加入调试信息 -c只编译不连接
    arm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elf
    #-Ttext 0x0000000:指定代码段起始地址为0x30000000
    arm-linux-objcopy -O binary -S sdram_elf sdram.bin
    # binary:二进制的 -S:不从源文件复制重定位信息和符号信息到目标文件中去
    arm-linux-objdump -D -m arm  sdram_elf > sdram.dis
    # -D:反汇编所有段 -m arm:指定反汇编文件使用arm架构
clean:
    rm -f   sdram.dis sdram.bin sdram_elf *.o

查看反汇编文件:
这里写图片描述
这里写图片描述
这里写图片描述
bl disable_watch_dog @连接地址0x30000000
bl memsetup @连接地址0x30000004
bl copy_steppingstone_to_sdram @连接地址0x30000008
ldr pc, =on_sdram @连接地址0x3000000c
ldr sp, =0x34000000 @连接地址0x30000010

我们在Makefile中指定了连接地址为0x30000000(0x30000000是sdram中的初始地址),而当我们在跳转到sdram之前,还有几行代码是在steppingstone运行的?为什么可以运行而不出错了?

解释:虽然19~21行连接地址都在SDRAM中,但是由于它们都是位置无关的相对跳转指令,所以可以在Steppingstone里执行。详解点我!

led.s

#define GPFCON  (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)

#define GPF4_out    (1<<(4*2))
#define GPF5_out    (1<<(5*2))
#define GPF6_out    (1<<(6*2))

void  wait(volatile unsigned long dly)
{
    for(; dly > 0; dly--);
}

int main(void)
{
    unsigned long i = 0;

    GPFCON = GPF4_out|GPF5_out|GPF6_out;        // 将LED1,2,4对应的GPF4/5/6三个引脚设为输出

    while(1){
        wait(30000);
        GPFDAT = (~(i<<4));        // 根据i的值,点亮LED1,2,4
        if(++i == 8)
            i = 0;
    }

    return 0;
}
原创代码+报告(用的是数组)   设计一个请求页式存储管理方案。并编写模拟程序实现之。要求包含:   1.过随机数产生一个指令序列,共320条指令。其地址按下述原则生成:   ①50%的指令是顺序执行的;   ②25%的指令是均匀分布在前地址部分;   ③25%的指令是均匀分布在后地址部分;   #具体的实施方法是:      在[0,319]的指令地址之间随机选区一起点M;      顺序执行一条指令,即执行地址为M+1的指令;      在前地址[0,M+1]中随机选取一条指令并执行,该指令的地址为M’;      顺序执行一条指令,其地址为M’+1;      在后地址[M’+2,319]中随机选取一条指令并执行;      重复A—E,直到执行320次指令。   2.指令序列变换成页地址流    设:(1)页面大小为1K;       用户内存容量为4页到32页;        用户虚存容量为32K。   在用户虚存中,按每K存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:    第0条—第9条指令为第0页(对应虚存地址为[0,9]);    第10条—第19条指令为第1页(对应虚存地址为[10,19]);    。。。。。。。。。。。。。。。。。。。。。    第310条—第319条指令为第31页(对应虚存地址为[310,319]);   按以上方式,用户指令可组成32页。   3. 计算并输出下述各种算法在不同内存容量下的命中率。      FIFO先进先出的算法      LRR最近最少使用算法      OPT最佳淘汰算法(先淘汰最不常用的页地址)      LFR最少访问页面算法      NUR最近最不经常使用算法
1 实验目标 存储管理的主要功能之一是合理地分配空间 请求页式管理是一种常用的虚拟存储管理技术 本实验的目的是通过请求页式存储管理中页面置换算法模拟设计 了解虚拟存储技术的特点 掌握请求页式管理的页面置换算法 2 实验要求 1 通过随机数产生一个指令序列 共320条指令 指令的地址按下述原则生成: 50%的指令是顺序执行的; 25%的指令是均匀分布在前地址部分 25%的指令是均匀分布在后地址部分 具体的实施办法是: 在[0 319]的指令地址之间随机选取一点m; 顺序执行一条指令 即执行地址为m+1的指令; 在前地址[0 m+1]中随机选取一条指令并执行 该指令的地址为m’; 顺序执行一条指令 其地址为m’+1; 在后地址[m’+2 319]中随机选取一条指令并执行; 重复上述步骤 直到执行320次指令 2 将指令序列变换成页地址流 设: 页面大小为1K; 用户内存容量为4页到32页; 用户虚存容量为32K; 在用户虚存中 按每K存放10条指令排列虚存地址 即320条指令在虚存中的存放方式为: 第0条 9条指令为第0页(对应虚存地址为[0 9]); 第10条 第19条指令为第一页(对应虚存地址为[10 19]); 第310条 第319条指令为第31页(对应虚存地址为[310 319]); 按以上方式 用户指令可组成32页 3 计算并输出下述各种算法在不同内存容量下的命中率 先进先出的算法(FIFO); 最近最少使用算法(LRR); 最佳淘汰算法(OPT);先淘汰最不常用的页地址; 命中率 1 页面失效次数 页地址流长度 在本实验中 页地址流长度为320 页面失效次数为每次访问相应指令时 该指令所对应的页不在内存的次数 ">1 实验目标 存储管理的主要功能之一是合理地分配空间 请求页式管理是一种常用的虚拟存储管理技术 本实验的目的是通过请求页式存储管理中页面置换算法模拟设计 了解虚拟存储技术的特点 掌握请求页式管理的页 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

种瓜大爷

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值