历史上的今天
返回首页

历史上的今天

今天是:2024年08月26日(星期一)

正在发生

2018年08月26日 | S3C2440 -- 启动文件和Makefile文件分析

2018-08-26 来源:eefocus

Nand Flash 或者 Nor Flash启动
S3C2440有4KB SRAM,Nand Flash启动的话,硬件自动将Nand Flash的前4KB 拷贝到SRAM中,然后CPU由地址0开始执行。Nor Flash启动的话,可以像内存一样读,所以CPU如果从Nor Flash启动的话,CPU仍将从0地址启动,但是此时0地址指向Nor Flash地址;Nor Flash具有的特征:可以像内存一样读数据,但是不能像内存一样写数据,必须先擦除之后才能写数据到Nor Flash。

GCC编译流程:预编译,编译,汇编,连接

编译:.c -> .s; 汇编:.s -> .o ;连接:多个.o问价合并一个可执行文件

Makefile文件内容:

led_on.bin : led_on.S

arm-linux-gcc -g -c -o led_on.o led_on.S//-g 加入调试信息-c编译不连接
arm-linux-ld -Ttext 0x0000000 -g led_on.o -o led_on_elf//-Ttext 代码段开始位置 连接生成文件 led_on_elf
arm-linux-objcopy -O binary -S led_on_elf led_on.bin//生成二进制文件
clean:
rm -f   led_on.bin led_on_elf *.o

@******************************************************************************
@ File:led_on.S
@ 功能:LED点灯程序,点亮LED1
@******************************************************************************       
            
.text
.global _start
_start:     
            LDR     R0,=0x56000050       @ R0设为GPFCON寄存器。此寄存器
                                        @ 用于选择端口B各引脚的功能:
                                        @ 是输出、是输入、还是其他
            MOV     R1,#0x00000100        
            STR     R1,[R0]             @ 设置GPF4为输出口, 位[8:7]=0b01
            LDR     R0,=0x56000054       @ R0设为GPBDAT寄存器。此寄存器
                                        @ 用于读/写端口B各引脚的数据
            MOV     R1,#0x00000000        @ 此值改为0x00000010,
                                        @ 可让LED1熄灭
            STR     R1,[R0]             @ GPF4输出0,LED1点亮
MAIN_LOOP:
            B       MAIN_LOOP

启动文件包括软件初始化进而硬件初始化

硬件初始化:1. 关闭开门狗 2.初始化时钟, 3. 初始化SDRAM

软件初始化:1. 设置返回地址, 2. 调用main函数, 3. 清理工作(sp ->SRAM(不需要初始化可以直接使用)或者SDRAM(需添加初始化程序))

@******************************************************************************
@ File:crt0.S
@ 功能:通过它转入C程序
@****************************************************************************** 

.text
.global _start
_start:
ldr r0, =0x53000000 @ WATCHDOG寄存器地址
mov r1, #0x0 
str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启

ldr sp, =1024*4    @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K
@ nand flash中的代码在复位后会移到内部ram中,此ram只有4K
bl main @ 调用C程序中的main函数
halt_loop:
b halt_loop@程序死循环与此

此程序位基础的点亮LED程序并在SRAM中运行,所以硬件启动项中没有设置时钟和SDRAM。

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)
int main()
{
    GPFCON = 0x00000100;    // 设置GPF4为输出口, 位[8:7]=0b01
    GPFDAT = 0x00000000;    // GPF4输出0,LED1点亮
    return 0;
}

启动文件对应的C语言文件相对比较简单,设置引脚控制寄存器和数据寄存器,点亮LED。

CFLAGS := -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -ffreestanding

leds.bin : crt0.S  leds.c

arm-linux-gcc $(CFLAGS) -c -o crt0.o crt0.S

arm-linux-gcc $(CFLAGS) -c -o leds.o leds.c

arm-linux-ld -Ttext 0x0000000 crt0.o leds.o -o leds_elf

# arm-linux-ld -Tleds.lds  crt0.o leds.o -o leds_elf

arm-linux-objcopy -O binary -S leds_elf leds.bin

arm-linux-objdump -D -m arm  leds_elf > leds.dis

clean:

rm -f   leds.dis leds.bin leds_elf *.o

arm-linux-objdump -D -m arm leds_elf > leds.dis //对连接文件按照段,机型为ARM进行反汇编


推荐阅读

史海拾趣

D3 Semiconductor公司的发展小趣事

为了更好地拓展市场,D3 Semiconductor与全球知名的电子元件分销商贸泽电子(Mouser Electronics)建立了合作伙伴关系。根据协议,贸泽电子储备了D3 Semiconductor的完整650伏额定电压超结MOSFET产品线,并将其推向全球市场。这一合作不仅加强了D3 Semiconductor在全球市场的竞争力,也为公司带来了更多的商业机会。

FIDELIX公司的发展小趣事

随着技术的不断进步和市场竞争的加剧,FIDELIX意识到单靠自身的力量难以在全球市场上立足。因此,公司开始寻求国际合作,与全球多家知名半导体企业建立合作关系,共同研发新技术、新产品。这些国际合作不仅提升了FIDELIX的技术水平,也为其产品打开了国际市场的大门。

ELEKTRO-PLAST NASIELSK公司的发展小趣事

进入新世纪后,电子行业发展迅速,对电子元器件的性能要求也越来越高。ELEKTRO-PLAST NASIELSK公司紧跟行业趋势,投入大量资源进行技术创新。公司研发团队成功开发出一种新型塑料材料,不仅具有优异的绝缘性能和耐高温性能,还具有良好的可加工性。这一技术突破使得公司的产品在市场上脱颖而出,赢得了众多客户的青睐。

Hirect公司的发展小趣事
使用万用表等工具检查变压器的输入输出电压和电流是否正常,确认变压器是否损坏。
ABB公司的发展小趣事
根据需要的开关频率和响应速度,选择具有快速开关特性的晶闸管。
Gigarams Semiconductor Device Corp公司的发展小趣事
这可能是由于传感器精度不足、控制器算法不准确或驱动器性能不稳定等原因导致的。解决方案包括提高传感器精度、优化控制器算法和更换性能更稳定的驱动器。

问答坊 | AI 解惑

增量设计流程针对需要变更部分进行优化

将综合工具的功能和集成设计环境 (IDE) 结合在一起,提供高效的增量设计方法,管理工程设计变更通知 (ECO) 需求,使设计人员能对原设计作模块级变更,即只更改那些需要变更的部分。这种设计流程大大减少了变更对那些原已成熟的设计部分的影响,因此能够 ...…

查看全部问答>

感应灯

二. 感应式台灯 制作两级亮度led台灯(即灭----微亮----亮,共两级亮度),并设置一块操作区域。 A:在操作区域上方,任意方向挥一下手,增加一级亮度,当达到最大亮度后再挥手即关闭台灯。(即灭----微亮----亮----灭,如此循环)。 & ...…

查看全部问答>

做模拟有前(钱)途吗?迷茫。

请前辈介绍介绍刺激一下,好有干劲儿啊…

查看全部问答>

6410 WINCE系统跑到一半死了,问题不知道在哪里?急

Windows CE Kernel for ARM (Thumb Enabled) Built on Nov 24 2008 at 14:58:01 [OAL] ++OEMInit() [OAL] S3C6410_APLL_CLK   : 532000000 [OAL] ARMCLK : 532000000 [OAL] HCLK   : 133000000 [OAL] PCLK   : ...…

查看全部问答>

usb rndis怎么调??

把usb function修改为rndis,插上usb线后,pc端提示安装驱动,这个驱动怎么搞??…

查看全部问答>

令人痛苦的eeworld搜索功能

eeworld论坛搜索功能问题如下: 1.高级搜索功能根本不能用... 2.我只能使用主页中的搜索功能,也就是在eeworld主页上,添入关键词,点击最上面搜索,可以使用,但是今天不知道为什么,搜索结果中只能看第一页的内容,点击下一页或者数字都不能打开网页, ...…

查看全部问答>

求助:xilinx ise 6.2i安装后发现问题

我安装xilinx ise时所有选项都全部选择了,过程中就有跟什么usb有关的信息 不知为何意 然后ingore 一路next.完成后发现\"对象名已存在\"提示,接着无论怎样 重启后计算机再也无法识别usb的鼠标和键盘了 只有重新插拔后才能识别 将ise卸载后 同时删除 ...…

查看全部问答>

系统时钟

请问MSP430可以允许工作的最大系统时钟MCLK是多少? 假如我想让它工作在50M 是不是必须在XT1处接上一个高频时钟,再编程倍频?而不能再接32768Hz了?…

查看全部问答>

求助 怎么编辑 Altium Designer 元件库和封装库 文件?

在网上下载了一下 Altium Designer的 元件库和封装库,可是经常会出现问题。 我想重新编辑一下这些库,然后改成自己的?库文件的后缀是 .SchLib和.PcbLib。 不知道该怎么编辑.SchLib和.PcbLib后缀的文件?谢谢!…

查看全部问答>

高手看看这个电路是做什么用的?谢谢

看看,in和OUT1,OUT2是什么关系,完全搞不明白啊?谢谢啦…

查看全部问答>