生成.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>
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>