《2440裸机》基础知识

发布者:温馨幸福最新更新时间:2022-04-26 来源: eefocus关键字:2440裸机  基础知识  启动过程 手机看文章 扫描二维码
随时随地手机看文章

1.启动过程

在这里插入图片描述

从两种方式来简单介绍启动方式,分别是Nor启动和Nand启动


Nor启动

使用Nor启动时,NorFlash的基地址为0,片内RAM地址为0x4000,0000

CPU读出Nor上第一个指令(前4个字节)执行。

Nand启动

使用Nand启动时,片内RAM的基地址为0,NorFlash是不可访问的状态。

2440的硬件把Nand前4K内容搬移到片内RAM中,然后CPU从0地址取出第一条指令执行。

CPU取第一条指令都是从0地址去取,只不过不同的启动方式,对应的0地址是不同的。有了第一条指令并执行,剩下的也就像多米诺骨牌一样。


2.汇编知识

LDR 读内存

LDR R0 ,[R1] 类似C语言中,R0 = *R1,读取R1指向内存区域中的内容,存入R0

STR 写内存

STR R0 ,[R1] 类似C语言中, *R1 = R0,将R0写入R1指向的内存区域

B 无条件跳转指令

MOV

MOV R0,R1 把 R1的值赋给R0

MOV R0,#0x100 把 100赋给R0

LDR伪指令

LDR R0,=0x12345678这句话的意思是,把0x12345678这个值赋给R0

但是我们会有一个问题?为什么我们不用MOV指令来将这个值给R0呢?其实原因很简单,每条指令最终都会翻译成32位(4字节)的机器码,机器码上需要几位来表示操作指令(MOV还是B,或者是其他),还需要几位来表示操纵哪个寄存器,有时候还需要目的寄存器。这么下来,一条留给我们表示0x12345678这个数肯定是不够32位(4字节)的,所以一条指令完成不了这个赋值任务,所以需要用LDR伪指令来赋值。LDR伪指令最终是要被翻译成多条指令来完成这个任务的。

add

add r0,r1,#4 相当于r0=r1+4

sub

sub r0,r1,#4 相当于r0=r1-4

sub r0,r1,r2 相当于r0=r1-r2

bl

bl main 跳转到main,并且把返回地址(即下一条指令地址)保存在lr寄存器中

ldm 读内存,写入多个寄存器

ldmia sp,{fp,sp,pc}

其中ia(increase after) 后缀的意思是"先读后增",什么叫先读后增呢,就是先把sp指向的位置的值读到寄存器中,之后sp再增加。(或者说先操纵数据,后移动指针)

stm 把多个寄存器的值,写入内存

stmdb sp!,{fp,ip,lr,pc}

其中db(decrease before)后缀的意思是"先减后存",什么叫先减后存呢,就是sp先减少,之后把寄存器中的值存到sp指向的位置(或者说先移动指针,后操纵数据)

在这里插入图片描述

例子1:点灯程序led_on.S


.text

.global _start

_start:

/*配置GPF4为输出引脚*/

ldr r1,=0x56000050

mov r0,#0x100

str r0,[r1]

/*配置GPF4输出高电平*/

ldr r1,=0x56000054

mov r0,#0

str r0,[r1]

/*死循环*/

halt:

b halt


编译 arm-linux-gcc -c -o led_on.o led_on.S

链接 arm-linux-ld -Ttext 0 led_on.o -o led_on.elf

生成bin arm-linux-objcopy -o binary -S led_on.elf led_on.bin

反汇编 arm-linux-objdump -D led_on.elf > led_on.dis


例子2:在汇编中调用main函数


.text

.global _start

_start:

/*设置内存: sp栈*/

ldr sp,=4096 /*nand启动*/

//ldr sp,=0x40000000+4096 /*nor启动*/


/*调用main*/

bl main

halt:

b halt


例子3:判断是nor/nand启动


在编写程序时,需要先了解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,=0x40000000+4096 /*先假设是nor启动*/

 moveq sp,#4096 /*nand启动*/

 streq r0,[r1] /*恢复原来的值*/


3.gcc

在这里插入图片描述

image.png

4.Makefile

为什么要引入Makefile?因为makefile能只编译修改过的.c为.o,免去了重复编译的过程,提高效率。


4.1 Makefile基础

规则

当依赖比目标新的时候(也就是修改过了),执行命令


目标文件:依赖文件

  命令


通配符


test:a.o b.o

gcc -o test $^

%.o:%.c

gcc -c -o $@ $<


【第二行】 $^表示所有的依赖,在上面的例子中也就是a.o b.o

【第三行】 %.o:%.c 对所有.c文件,都生成.o文件

【第四行】 $@ 表示的是目标文件,也就是%.o。$<表示第一个依赖文件,也就是%.c


假想目标

通过执行make <目标>命令,就可以执行makefile中相应目标文件下的命令(要满足依赖比目标新的规则)。如果没有<目标>的话,则会默认执行第一个目标。


有时候我们会遇到这种情况,如下所示


clean:

rm *.o test


如果这个时候目录中存在名字叫clean的文件的话,根据"依赖比目标新就执行命令"的规则,目标clean是没有依赖的,也就是依赖没有目标新,这个时候我们执行make clean命令的时候不能达到预期的效果。这时候就需要假想目标,声明假想目标的方式很简单,如下所示。


clean:

rm *.o test

.PHONY: clean


声明假想目标之后,在执行make clean就能达预期的效果了。


即时变量,延时变量

A:= xxxx A的值即可确定,这是即时变量

B = xxxx B的值使用到时才确定,这是延时变量

下面用一个例子更好说明这一点


A:= $(C)

B = $(C)

C = abc

all:

@echo $(A)

@echo $(B)


最终打印出来的结果是 A为空,B为abc。

image.png

makefile函数


$(foreach var,list,test)

这个函数的作用就是提取list中的每个字符串成员(以空格划分),赋值给var,之后变成test,这样说可能比较抽象,我们看一个例子。


A = a b c

B = $(foreach f,$(A),$(f).o)

all:

@echo B = $(B)


最终打印的结果为B = a.o b.o c.o,例子中的a b c分别赋值给f,再变成$(f).o,也就是a.o b.o和c.o


$(filter pattern ...,text) 在text中取出符合pattern的值

$(filter-out pattern ...,text)在text中取出不符合pattern的值


C = a b c d/

D = $(filter %/,$(C))

E = $(filter-out %/,$(C))

all:

@echo D = $(D)

@echo E = $(E)


最终打印的结果为

D = d/

E = a b c


$(wildcard pattern) 在pattren中定义了文件名格式,wildcard函数的作用是取出这个符合这个格式并且存在的文件

例子:首先我们先假设当前目录下存在a.c b.c c.c三个文件


files = $(wildcard *.c)

filesname = a.c b.c c.c d.c e.c

files2 = $(wildcard $(filesname))

all:

@echo files = $(files)

@echo files2 = $(files2)


最终打印的结果为

files = a.c b.c c.c 符合*.c格式

files2 = a.c b.c c.c d.c e.c由于当前目录不存在,所以没有打印


$(patsubst pattern,replacement,$(var)) 从var中取每个值,如果符合pattern,就替换为replacement

例子:


files = a.c b.c c.c d.c e.c abc

dep_files = $(patsubst %.c,%.d,$(files))

all:

@echo dep_files = $(dep_files)


最终打印的结果为

dep_files = a.d b.d c.d d.d e.d abc


4.2 Makefile自动依赖

其中目录文件如下

在这里插入图片描述

在向makefile中自动添加头文件依赖的之前,我们需要知道下面几条gcc命令


gcc -M main.c

查看main.c依赖的头文件(-M会将标准库的头文件也包含进来,如果不想这样,可以使用-MM),例如下面所示:

在这里插入图片描述

我们也可以将结果输出重定向到对应的.d文件中,如下所示:

gcc -MM main.c > main.d

在这里插入图片描述

sed命令

sed是一个非交互式的流编辑器。而流编辑器是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕,接着读入下一行。

通过sed命令我们可以将main.d中的内容进行修改,由main.o: main.c szg_math.h 变更为main.o main.d : main.c szg_math.h 将main.d加入到目标文件中。

sed 's,(main).o[ :]*,1.o main.d : ,g' < main.d > main.q

在这里插入图片描述

看到结果果然如我们所料。上面的命令大体上分为两个步骤。

1.将main.d中内容交给sed进行处理

2.将sed处理好后的内容输出到main.q(名字瞎取的)

下面我们详细的分析一下sed命令的处理流程和参数意义:

sed 's,(main).o[ :]*,1.o main.d : ,g'

sed中的s符号告诉sed命令,这次要做一个替换的任务。

s符号的格式为:[address[,address]] s/pattern-to-find/replacement-pattern/[g p w n]。

[address[,address]]:是指要处理的行的范围,在这次的操作中采用的是默认值。

pattern-to-find:是指要匹配的字符串,在这次操作中指的是(main).o[ :]*。

(main)指的就是main,只不过括起来加入到符号表中,之后我们可以通过1来等价于main。

.o就是匹配字符.o。

[ :]*就是正则表达式,其意思为匹配若干个空格和冒号。

所以这一字段匹配的字符其实就是main.o:

replacement-pattern:是指要替换成的字符串,在这次操作中指的是1.o main.d :,将1替换过来其实就是main.o main.d :

在有了以上几条命令之后,我们用一个比较综合的例子来进行说明


# wildcard找到当前目录下所有的.c文件

# patsubst将所有%.c转化为%.o

SRC_FILES=$(wildcard *.c)

OBJ_FILES=$(patsubst %.c,%.o,$(SRC_FILES))


CC = gcc

CFLAGS = -lpthread -g


test:$(OBJ_FILES)

$(CC) -o test $^ $(CFLAGS)


%.o:%.c

$(CC) -c -o $@ $< $(CFLAGS)

sinclude $(SRC_FILES:.c=.d)

# 1.@ 告诉makefile不打印命令 

# 2.set -e的作用是告诉后面命令返回值非0时立刻退出,用分号是为了让

#    set -e作用到后面所有命令(makefile 中的''就是连接下一行,让其视为同一行命令)

# 3.$(CC) -MM $(CFLAGS) $< > $@.$$$$ 

# $$是转义字符$,假设$@是a.d 那最终执行的就是 > a.d.$$ 其中$$在shell中的特殊变量表示执行进程号

%.d:%.c

@set -e;rm -f $@;

$(CC) -MM $(CFLAGS) $< > $@.$$$$;

sed 's,($*).o[ :]*,1.o $@ : ,g' < $@.$$$$ > $@;

rm -f $@.$$$$

clean:

rm *.o *.d test 

.PHONY:clean

关键字:2440裸机  基础知识  启动过程 引用地址:《2440裸机》基础知识

上一篇:《2440裸机》时钟体系
下一篇:《2440裸机》UART

推荐阅读最新更新时间:2024-11-11 10:39

LCD Black mura基础知识
当下是智能汽车盛行的时代,车内的中控、仪表、后排娱乐、空调、后视镜、扶手、电子后视镜等均对显示屏需求增多,且存在大屏化、高清化、交互化、多屏化、多形态化五大发展趋势!。尤其对液晶显示模组的画质要求较高,黑态均匀性 60% 的规格已作为高规车系必须达到的一个重要指标。 黑态漏光,即液晶显示面板 (TFT-LCD Panel)在黑态(显示灰阶为0)的情况下,由于液晶模式、玻璃材料、机械结构、工艺方式等多方面原因造成的漏光现象。根据人的视觉系统,在亮度越低的状态下,人眼感觉到的亮度不均匀现象就越明显。黑态漏光直接导致黑态均匀性差,这不是仅解决工艺过程瑕疵就可以避免的,有着较为复杂的原因和解决方法。 1 黑态漏光产生机理 当玻璃内
[嵌入式]
LCD Black mura<font color='red'>基础知识</font>
S3C2440地址空间的分配及启动过程
一、S3C2440地址空间的分配 1. s3c2440A 的存储器控制器有以下特性: l 大小端(通过软件选择) l 地址空间:每个bank有128M 的字节(总共1G字节/8个banks) l 可编程的访问位宽,bank0(16/32 位),其他bank(8/16/32 位) l 共8个存储器banks l 6 个是ROM,SRAM 等类型存储器bank l 2 个是可以作为ROM、SRAM、SDRAM 等存储器bank l 7 个固定的存储器bank起始地址 l 最后一个bank 的起始地址可调整 l 最后两个bank 大小可编程 l 所有存储器bank的访问周期可编程 l 总线访问周期可通过插入外部
[单片机]
S3C<font color='red'>2440</font>地址空间的分配及<font color='red'>启动</font><font color='red'>过程</font>
1_jz2440在linux下烧写裸机程序
常用的烧写方法有: 1.使用并口工具烧写:接线(参考百问网JZ2440V2开发板使用手册),使用oflash烧写(速度比较慢),可烧写.bin文件,从新上电观察效果。可烧写u_boot。 2.使用openJTAG烧写,接线,使用oflash烧写(oflash烧写完后,会复位开发板)。 3.使用Jlink烧写,请看如何烧写S3C2440裸板程序:JLink只支持烧写Nor Flash,不支持Nand Flash。 所以:选择J-link烧写u-boot 这是烧写代码的基础,因为开发板j-link不支持烧写nand-flash 但是烧写特质的u-boot里面有集成了串口,可以利用串口烧写nand flash。 所以j-link烧写u-
[单片机]
1_jz<font color='red'>2440</font>在linux下烧写<font color='red'>裸机</font>程序
2440裸机编程之三 通用I/O口
S3C2440A 具有130 个多功能输入/输出脚,分别包含在如下9 组端口中。 ●1 个25 位输出端口(端口A)。 ●1 个11 位输出端口(端口B)。 ●4 个16 位输入/输出端口(端口C、D、E、G)。 ●1 个8 位输入/输出端口(端口F)。 ●1 个9 位输入/输出端口(端口H)。 ●1 个13 位输入/输出端口(端口J)。 基本上,每个端口有三个寄存器: GPnCON:端口配置寄存器,多数端口有多种功能,所以需要这个寄存器来使某个端口确定某一功能。 GPnDAT:端口数据寄存器,当端口为输出功能时:写这个寄存器就是使端口引脚输出相应电平;当端口为输入功能时:读这个寄存器就是读端口引脚上的相应电平; GPnUP:端
[单片机]
<font color='red'>2440</font><font color='red'>裸机</font>编程之三 通用I/O口
S3C2440裸机------异常与中断__Thumb指令集程序示例
我们以之前的代码重定位程序为例简单看一下thumb指令集。 1.C代码修改为Thumb指令集格式 对于C程序,如果我们想把他们编译成Thumb指令集的话,只需要修改makefile,加上-mthumb选项即可,先看一下之前的makefile。 all: arm-linux-gcc -c -o led.o led.c arm-linux-gcc -c -o uart.o uart.c arm-linux-gcc -c -o init.o init.c arm-linux-gcc -c -o main.o main.c arm-linux-gcc -c -o start.o start.S
[单片机]
mini2440裸机试炼之——IIC控制EEPROM数据传输
内容: 向EEPROM(AT24C02)内部地址0x00—0xff,依次写入0x00—0xff,然后再读出数据。 IIC总线介绍: IIC(Inter-IntegratedCircuit,I2C)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微处理器及其外围设备。在iic总线上,只需要两条线:串行数据线SDA和串行时钟线SCL,便可完成通信 IIC要点 1、清IIC中断标志语句rIICCON&= ~0x10;一定要在读写寄存器IICDS的后面,中断是读写寄存器后发生的; 2、由于EEPROM的读取速度并不快,所以每次读写中断都需要短暂的延时函数; 3、在对AT24C02A进行读取数据时,在发送带有读命
[单片机]
mini<font color='red'>2440</font><font color='red'>裸机</font>试炼之——IIC控制EEPROM数据传输
热电偶基础知识
热电偶是一种常见的被动测温元件。它也是一种有源传感器,测量时不需外加电源,并且测量温度范围(高达2000°C)很广。它可以快速响应,故系统运行几乎没有显著的延迟。 热电偶结构图:热电偶结构简单,主要由两根金属导线组成一个回路。 一般热电偶产生的输出电压很小(K型为约〜40μV/每°C),故需要精确的运放支持。否则,外部噪声(尤其是在热电偶和测量电路之间使用长导线时)可能会使信号失真。下表显示了一些常见的热电偶类型和特性。 另一个问题是“冷端”,它是热电偶导线与信号电路的线连接的地方,如同线路中的第二个热电偶。 为了补偿冷端的影响,可以尝试测量冷端温度,并将得出的电压加上热电偶电压(Vout),让热电偶测
[测试测量]
热电偶<font color='red'>基础知识</font>
51单片机的IO口操作基础知识介绍
以我们常用的STC单片机为例:STC单片机所有IO口均可由软件配置成4种工作类型。4种类型分别为:准双向口/弱上拉(标准8051输出模式)、强推挽输出/强上拉、仅为输入(高阻)或开漏输出功能。每个口有2个寄存器中的相应位控制每个引脚的工作类型。上电复位后的工作模式为准双向/弱上拉模式。2V以上为高电平,0.8V以下为低电平,每个I/O口驱动能力可以达到20mA。 那么我们通过配置哪两个寄存器来设定I/O口的工作模式呢:这两个寄存器就是PxM1和PxM0,P0口对应的就是P0M1和P0M0,P1口对应的就是P0M1和P0M0,P2口对应的就是P0M1和P0M0,P3口对应的就是P0M1和P0M0。以P0口的设置为例: 如果有
[单片机]
51单片机的IO口操作<font color='red'>基础知识</font>介绍

推荐帖子

对于1KV的高压,它的放电回路电阻应该怎么设置啊?
对于1KV的高压,它的放电回路电阻应该怎么设置啊?对于1KV的高压,它的放电回路电阻应该怎么设置啊?根据你的放电电流,电阻能达到相应的功力并有一定余量即可10M,1/8w原帖由jxb01033016于2010-3-2909:25发表10M,1/8w 你,,,够狠,早爆了
linda_xia 模拟电子
“玩板”+周航慈书第10章第2个例子
此内容由EEWORLD论坛网友chenbingjy原创,如需转载或用于商业用途需征得作者同意并注明出处第10章采样任务设计10.2使用定时器中断控制采样周期当采样周期与节拍周期在同一个数量级时,如果仍然用延时函数来控制采样周期,其采样周期的时间抖动将比较明显(相邻两次采样的时间间隔误差不能忽略),会严重影响采样结果的质量。这时,可以另外使用一个定时器,由定时中断产生稳定的采样周期。下面的例子是用AD芯片TLC549采集电压值,采样周期由定时器3来控制,采
chenbingjy 测评中心专版
LPC1768芯片,关于USB连接复位问题
以前我用导线把3脚与4脚短接,我的芯片就会复位。用15脚与16脚短接,芯片不会复位。今天测试发现不行,不明白原因。请教怎么才能让芯片,每次想要复位的时候都复位一下。因为我想外部接一个按钮LPC1768芯片,关于USB连接复位问题红包求助啊,可以给个红包,真的没办法了
yunhai14 ARM技术
关于MP3硬件开源的全套资料(GD5600 GD5800 GD5801系列)
国电科技全面开源MP3硬件,包括GD5600GD5800GD5801系列最小工作系统里面包括PCB,原理图,BOM表,datasheet,用户只需下载就可以直接导入生产,非常方便,让没有设计能力的公司省去了设计的繁琐。此开源资料生产的模块可以直接用于防盗器,提示器,工业报警器等安防领域。只要有使用到声音的地方都能用到它!关于MP3硬件开源的全套资料(GD5600GD5800GD5801系列)偶也下来看看,菜鸟找入门资料学习下来学习学习!!谢谢提供下载来玩玩学习哈!
piao100 下载中心专版
关于高频信号线和多层电路板走线
有没有这方面的书推荐一下,去书店逛了一圈,发现讲这类的书很难找。关于高频信号线和多层电路板走线关于高频,纸上谈兵的也只是点理论,实践相当重要。你可以到外国大的网站(电子公司)去看看,推荐一本还不错的,挺实用的一本书:《pcb和电磁兼容设计》江思敏28元。里面有很多关于高速信号如何LAYout的内容,对实际的工作也很有用的
trason 嵌入式系统
【BIGTREETECH PI开发板】+08.音频测试(zmj)
【BIGTREETECHPI开发板】+08.音频测试(zmj)BIGTREETECHPi开发板拥有一个3.5mm音频接口,既可以播放音乐也可以用来录音。理论上讲可以一边听歌一边玩开发板(●'◡'●)1.程序安装BIGTREETECHPi开发板的系统支持常见的各种音频播放器软件,大家可以依据自己喜好自行选择,我这边安装了一堆//------播放器及依赖安装(可选)sudoaptinstallzoom-playerwor
卿小小 国产芯片交流
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved