生成.bin但是烧进开发板,看不见灯闪烁

2019-07-16 07:51发布

生成.bin但是烧进开发板,看不见灯闪烁,是什么原因,是链接脚本写错了吗

start.文件

.equ MEM_CTL_BASE, 0x48000000 //@.equ 命令用于把常量值设置为可以在文本段中使用的符号
.equ SDRAM_BASE, 0x30000000 //@类似于C语言中#define @0x48000000-BWSCON,0x30000000-BANK6
.text   
.global  _start  
_start:
     bl  diable_watch_dog   //关看门狗
     bl  memsteup     //设置存储器
     bl  copy_sdram  //把代码复制到SDRAM中
     ldr pc,=on_sdram  
on_sdram:
     ldr  sp ,=0x34000000//设置堆栈的指针
     ldr  lr ,=halt_loop//lr链接地址寄存器,
     ldr  pc ,=main//调用C函数因为C函数执行完需要返回返回的时候pc指针指向lr中的地址
halt_loop:
     b  halt_loop  

init.c文件
#include"s3c24xx.h"
void  diable_watch_dog();   //关看门狗
void  memsteup();          //设置存储器
void  copy_sdram();       //把代码复制到SDRAM中

//关看门狗
void  diable_watch_dog()
{
     WTCON=0;
}


//设置存储控制器 使用SDRAM
void  memsteup()
{
    volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;

    /* 这个函数之所以这样赋值,而不是像前面的实验(比如mmu实验)那样将配置值
     * 写在数组中,是因为要生成”位置无关的代码”,使得这个函数可以在被复制到
     * SDRAM之前就可以在steppingstone中运行
     */
    /* 存储控制器13个寄存器的值 */
    p[0] = 0x22011110;     //BWSCON
    p[1] = 0x00000700;     //BANKCON0
    p[2] = 0x00000700;     //BANKCON1
    p[3] = 0x00000700;     //BANKCON2
    p[4] = 0x00000700;     //BANKCON3  
    p[5] = 0x00000700;     //BANKCON4
    p[6] = 0x00000700;     //BANKCON5
    p[7] = 0x00018005;     //BANKCON6
    p[8] = 0x00018005;     //BANKCON7
    p[9]  = 0x008C04F4;
    p[10] = 0x000000B1;     //BANKSIZE
    p[11] = 0x00000030;     //MRSRB6
    p[12] = 0x00000030;     //MRSRB7

}


//把代码复制到SDRAM中
void  copy_sdram()   
{
    unsigned int *pdwSrc  = (unsigned int *)0;
    unsigned int *pdwDest = (unsigned int *)0x30000000;

    while (pdwSrc < (unsigned int *)4096)
    {
        *pdwDest = *pdwSrc;
        pdwDest++;
        pdwSrc++;
    }
}

main.c文件

#include"s3c24xx.h"
#include<stdio.h>
#define  GPFCON  (*(volatile  unsigned long  *)0x56000050)
#define  GOFDAT  (*(volatile  unsigned long  *)0x56000054)
#define GPF4_OUT (1<<8)
#define GPF5_OUT (1<<10)
#define GPF6_OUT (1<<12)

void  delay(int x)
{
    int i;
    for(i=x;i>0;i--);
}

int  main()
{
    int  s;
    GPFCON=GPF4_OUT|GPF5_OUT|GPF6_OUT;
    while(1)
    {
        delay(30000);
        GPFDAT=~(s<<4);
        if(++s==8)
        s=0;
     }
     return 0;
}







链接脚本文件
SECTIONS{

     . =0x30000000;
     . = ALIGN(4) ;  
     .text   : {*(.text)}
     . = ALIGN(4) ;
     .data   : {*(.data)}
     . = ALIGN(4) ;
     .bss    : {*(.bss)}
}



makefile

objs:=start.o  init.o  main.o  
sdram.bin:$(objs)
    ARM-linux-ld  -Tsdram.lds  -o  sdram_elf  $^
    arm-linux-objcopy  -O  binary   -S  sdram_elf   $@
    arm-linux-objdump  -D  -m  arm  sdram_elf>sdram.dis
%.o:%.c
    arm-linux-gcc  -Wall -O2 -c   -o   $@  生成.bin但是烧进开发板,看不见灯闪烁,是什么原因,是链接脚本写错了吗

start.文件

.equ MEM_CTL_BASE, 0x48000000 //@.equ 命令用于把常量值设置为可以在文本段中使用的符号
.equ SDRAM_BASE, 0x30000000 //@类似于C语言中#define @0x48000000-BWSCON,0x30000000-BANK6
.text   
.global  _start  
_start:
     bl  diable_watch_dog   //关看门狗
     bl  memsteup     //设置存储器
     bl  copy_sdram  //把代码复制到SDRAM中
     ldr pc,=on_sdram  
on_sdram:
     ldr  sp ,=0x34000000//设置堆栈的指针
     ldr  lr ,=halt_loop//lr链接地址寄存器,
     ldr  pc ,=main//调用C函数因为C函数执行完需要返回返回的时候pc指针指向lr中的地址
halt_loop:
     b  halt_loop  

init.c文件
#include"s3c24xx.h"
void  diable_watch_dog();   //关看门狗
void  memsteup();          //设置存储器
void  copy_sdram();       //把代码复制到SDRAM中

//关看门狗
void  diable_watch_dog()
{
     WTCON=0;
}


//设置存储控制器 使用SDRAM
void  memsteup()
{
    volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;

    /* 这个函数之所以这样赋值,而不是像前面的实验(比如mmu实验)那样将配置值
     * 写在数组中,是因为要生成”位置无关的代码”,使得这个函数可以在被复制到
     * SDRAM之前就可以在steppingstone中运行
     */
    /* 存储控制器13个寄存器的值 */
    p[0] = 0x22011110;     //BWSCON
    p[1] = 0x00000700;     //BANKCON0
    p[2] = 0x00000700;     //BANKCON1
    p[3] = 0x00000700;     //BANKCON2
    p[4] = 0x00000700;     //BANKCON3  
    p[5] = 0x00000700;     //BANKCON4
    p[6] = 0x00000700;     //BANKCON5
    p[7] = 0x00018005;     //BANKCON6
    p[8] = 0x00018005;     //BANKCON7
    p[9]  = 0x008C04F4;
    p[10] = 0x000000B1;     //BANKSIZE
    p[11] = 0x00000030;     //MRSRB6
    p[12] = 0x00000030;     //MRSRB7

}


//把代码复制到SDRAM中
void  copy_sdram()   
{
    unsigned int *pdwSrc  = (unsigned int *)0;
    unsigned int *pdwDest = (unsigned int *)0x30000000;

    while (pdwSrc < (unsigned int *)4096)
    {
        *pdwDest = *pdwSrc;
        pdwDest++;
        pdwSrc++;
    }
}

main.c文件

#include"s3c24xx.h"
#include<stdio.h>
#define  GPFCON  (*(volatile  unsigned long  *)0x56000050)
#define  GOFDAT  (*(volatile  unsigned long  *)0x56000054)
#define GPF4_OUT (1<<8)
#define GPF5_OUT (1<<10)
#define GPF6_OUT (1<<12)

void  delay(int x)
{
    int i;
    for(i=x;i>0;i--);
}

int  main()
{
    int  s;
    GPFCON=GPF4_OUT|GPF5_OUT|GPF6_OUT;
    while(1)
    {
        delay(30000);
        GPFDAT=~(s<<4);
        if(++s==8)
        s=0;
     }
     return 0;
}







链接脚本文件
SECTIONS{

     . =0x30000000;
     . = ALIGN(4) ;  
     .text   : {*(.text)}
     . = ALIGN(4) ;
     .data   : {*(.data)}
     . = ALIGN(4) ;
     .bss    : {*(.bss)}
}



makefile

objs:=start.o  init.o  main.o  
sdram.bin:$(objs)
    arm-linux-ld  -Tsdram.lds  -o  sdram_elf  $^
    arm-linux-objcopy  -O  binary   -S  sdram_elf   $@
    arm-linux-objdump  -D  -m  arm  sdram_elf>sdram.dis
%.o:%.c
    arm-linux-gcc  -Wall -O2 -c   -o   $@  $<
%.o:%.S
    arm-linux-gcc  -Wall  -O2  -c  -o  $@  $<
.PHONY:clean
clean :
    rm  -f  *.o  sdram_elf   sdram_dis   sdram.bin



<lt;
%.o:%.S
    arm-linux-gcc  -Wall  -O2  -c  -o  $@  生成.bin但是烧进开发板,看不见灯闪烁,是什么原因,是链接脚本写错了吗

start.文件

.equ MEM_CTL_BASE, 0x48000000 //@.equ 命令用于把常量值设置为可以在文本段中使用的符号
.equ SDRAM_BASE, 0x30000000 //@类似于C语言中#define @0x48000000-BWSCON,0x30000000-BANK6
.text   
.global  _start  
_start:
     bl  diable_watch_dog   //关看门狗
     bl  memsteup     //设置存储器
     bl  copy_sdram  //把代码复制到SDRAM中
     ldr pc,=on_sdram  
on_sdram:
     ldr  sp ,=0x34000000//设置堆栈的指针
     ldr  lr ,=halt_loop//lr链接地址寄存器,
     ldr  pc ,=main//调用C函数因为C函数执行完需要返回返回的时候pc指针指向lr中的地址
halt_loop:
     b  halt_loop  

init.c文件
#include"s3c24xx.h"
void  diable_watch_dog();   //关看门狗
void  memsteup();          //设置存储器
void  copy_sdram();       //把代码复制到SDRAM中

//关看门狗
void  diable_watch_dog()
{
     WTCON=0;
}


//设置存储控制器 使用SDRAM
void  memsteup()
{
    volatile unsigned long *p = (volatile unsigned long *)MEM_CTL_BASE;

    /* 这个函数之所以这样赋值,而不是像前面的实验(比如mmu实验)那样将配置值
     * 写在数组中,是因为要生成”位置无关的代码”,使得这个函数可以在被复制到
     * SDRAM之前就可以在steppingstone中运行
     */
    /* 存储控制器13个寄存器的值 */
    p[0] = 0x22011110;     //BWSCON
    p[1] = 0x00000700;     //BANKCON0
    p[2] = 0x00000700;     //BANKCON1
    p[3] = 0x00000700;     //BANKCON2
    p[4] = 0x00000700;     //BANKCON3  
    p[5] = 0x00000700;     //BANKCON4
    p[6] = 0x00000700;     //BANKCON5
    p[7] = 0x00018005;     //BANKCON6
    p[8] = 0x00018005;     //BANKCON7
    p[9]  = 0x008C04F4;
    p[10] = 0x000000B1;     //BANKSIZE
    p[11] = 0x00000030;     //MRSRB6
    p[12] = 0x00000030;     //MRSRB7

}


//把代码复制到SDRAM中
void  copy_sdram()   
{
    unsigned int *pdwSrc  = (unsigned int *)0;
    unsigned int *pdwDest = (unsigned int *)0x30000000;

    while (pdwSrc < (unsigned int *)4096)
    {
        *pdwDest = *pdwSrc;
        pdwDest++;
        pdwSrc++;
    }
}

main.c文件

#include"s3c24xx.h"
#include<stdio.h>
#define  GPFCON  (*(volatile  unsigned long  *)0x56000050)
#define  GOFDAT  (*(volatile  unsigned long  *)0x56000054)
#define GPF4_OUT (1<<8)
#define GPF5_OUT (1<<10)
#define GPF6_OUT (1<<12)

void  delay(int x)
{
    int i;
    for(i=x;i>0;i--);
}

int  main()
{
    int  s;
    GPFCON=GPF4_OUT|GPF5_OUT|GPF6_OUT;
    while(1)
    {
        delay(30000);
        GPFDAT=~(s<<4);
        if(++s==8)
        s=0;
     }
     return 0;
}







链接脚本文件
SECTIONS{

     . =0x30000000;
     . = ALIGN(4) ;  
     .text   : {*(.text)}
     . = ALIGN(4) ;
     .data   : {*(.data)}
     . = ALIGN(4) ;
     .bss    : {*(.bss)}
}



makefile

objs:=start.o  init.o  main.o  
sdram.bin:$(objs)
    arm-linux-ld  -Tsdram.lds  -o  sdram_elf  $^
    arm-linux-objcopy  -O  binary   -S  sdram_elf   $@
    arm-linux-objdump  -D  -m  arm  sdram_elf>sdram.dis
%.o:%.c
    arm-linux-gcc  -Wall -O2 -c   -o   $@  $<
%.o:%.S
    arm-linux-gcc  -Wall  -O2  -c  -o  $@  $<
.PHONY:clean
clean :
    rm  -f  *.o  sdram_elf   sdram_dis   sdram.bin



<lt;
.PHONY:clean
clean :
    rm  -f  *.o  sdram_elf   sdram_dis   sdram.bin



</lt;
</lt;
<p>
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
testd27
1楼-- · 2019-07-16 10:25
烧录别的板子好使吗
一龙大师
2楼-- · 2019-07-16 11:41
 精彩回答 2  元偷偷看……

一周热门 更多>