start.S启动的汇编代码
#define S3C2440_MPLL_200MHZ ( (0x5C<<12)|(0x01<<4)|(0x02) )
#define MEM_CTL_BASE 0x48000000
.text
.global _start
_start:
/*1关看门狗*/
mov r0,#0x53000000
mov r1,#0
str r1,[r0]
/*2设置时钟*/
ldr r0,=0x4C000014
mov r1,#0x03
str r1,[r0]
mrc p15,0,r1,c1,c0,0
orr r1,r1,#0xc0000000
mcr p15,0,r1,c1,c0,0
ldr r0,=0x4C000004
ldr r1,=S3C2440_MPLL_200MHZ
str r1,[r0]
/*3初始化SDRAM*/
mov r0,#MEM_CTL_BASE
adr r1,sdram_config
add r3,r0,#(13*4)
1:
ldr r2,[r1],#4
str r2,[r0],#4
cmp r3,r0
bne 1b
/*4重定位:把代码从0内存复制到它的链接地址去*/
mov r0,#0;
ldr r1,=0x33f80000
mov r2,#4096
1:
ldr r3,[r0],#4
str r3,[r1],#4
cmp r2,r0
bne 1b
/*清bss段*/
/*5执行main函数*/
ldr sp,=0x34000000
ldr pc,=main
sdram_config:
.long 0x22011110
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00000700
.long 0x00018005
.long 0x00018005
.long 0x008C04F4
.long 0x000000B1
.long 0x00000030
.long 0x00000030
init.c测试文件
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)
void delay(unsigned long dly)
{
for(;dly>0;dly--);
}
int main()
{
int i=0;
GPBCON = 1<<5*2 | 1<<6*2 | 1<<7*2 | 1<<8*2;
while(1)
{
delay(100000);
GPBDAT =(~(i<<5));
++i;
i %= 16;
}
return 0;
}
链接脚本
SECTIONS{
. = 0x33f80000;
.text : {*(.text)}
. = ALIGN(4);
.rodata : {*(.rodata*)}
. = ALIGN(4);
.data : {*(.data)}
. = ALIGN(4);
__bss_start = .;
.bss : {*(.bss) *(COMMON)}
__bss_end = .;
}
Makefile
objs := start.o init.o
boot.bin:$(objs)
arm-linux-ld -Tboot.lds -o boot_elf $^
arm-linux-objcopy -O binary boot_elf $@
arm-linux-objdump -D -m arm boot_elf >boot.dis
%.o : %.S
arm-linux-gcc -c -o $@ $<
%.o : %.c
arm-linux-gcc -c -o $@ $<
clean:
rm -f *.bin boot_elf *.o *.dis
调试了一个下午,在这段程序的运行过程中,发现程序总是无法点亮LED,也就是程序根本就没有运行到main函数中。然后我就从后向前去找程序可能的出错地点。
1,刚开始 我怀疑是ldr pc,=main这句指令没有跳到地方。后来换用bl main。发现还是一样的结果。查看反汇编,发现指令也是跳到了指定的位置了。于是,继续向上找。
2,后来觉得是不是/*2设置时钟*/ 这个有问题,于是把这段删除了,然后问题依然没有解决!
3,排除法,问题可能出在/*3初始化SDRAM*/!!!!但是查看反汇编,也没有找到问题的所在!
最后,通过对比以前写的汇编程序发现,程序的28行(原来写的是ldr r1,=sdram_config)改成
adr r1,sdram_config后程序正常了!
后来我在网上搜了下:ldr和adr的区别主要就是地址的位置无关性的差别。ldr伪指令操作,一旦实际运行物理地址和期望运行物理地址存在差别,那就会造成程序运行错误。虽然adr有这么多优点,但是adr的寻址空间只有前后4kb,而且必须在同一个代码段中,ldr就没有这些要求。
我查看了这分别包含两条指令的程序的反汇编,也没有发现有什么大的分别!
比较搞笑的是这两都反汇编出的代码是一样的!但是两都的二进制文件却是不一样的
当使用adr对应的这个二进制指令为: e28f1034
当使用ldr对应的这个二进制指令为: e59f1074
这还是后来我写了个文件比较程序才发现的!这两个指令对应的汇编是什么,有待查证!待续。。。。。。
上一篇:s3c2440时钟+nandflash拷贝至SDRAM+开启mmu
下一篇:at91rm9200上u-boot移植
推荐阅读
史海拾趣
在电子行业,尤其是工业自动化与控制领域,Foxboro I C T Inc(现为施耐德电气旗下的一部分,通常简称为Foxboro)的发展充满了创新与挑战。以下是五个与Foxboro在电子行业里发展起来相关的故事,每个故事均基于事实进行描述:
1. Foxboro的起源与早期创新
Foxboro的历史可以追溯到1908年,在美国马萨诸塞州的福克斯伯勒,E.H.和B.B.兄弟联手开设了商店,并逐渐发展成为一家专注于工业控制自动化的公司。1920年代,Foxboro推出了其第一款Model 10 Stabilog比例加复位控制器,这标志着公司在工业自动化领域的初步探索。此后,Foxboro持续在控制技术上取得突破,如1950年代发布的全尺寸图形面板仪表和首款磁流量计,这些创新为公司在工业控制领域奠定了坚实的基础。(参考来源:Foxboro官网及相关历史资料)
2. 分布式控制系统的先驱
进入1970年代,Foxboro推出了SPEC 200系统,这是全球第一款真正的分布式控制系统(DCS)。该系统通过分散控制、集中管理的理念,极大地提高了工业生产的效率和可靠性。SPEC 200系统的成功推出,不仅巩固了Foxboro在工业自动化领域的领先地位,也推动了整个行业向更加智能化、自动化方向发展。(参考来源:知乎专栏及相关行业报告)
3. 进入中国市场,引领自动化发展
1983年,在中美贸易合作的大背景下,Foxboro与中国上海仪电控股(集团)公司共同投资成立了上海福克斯波罗有限公司(即Foxboro中国)。作为最早的中美合资企业之一,Foxboro中国迅速将最新技术和产品引入中国,推动了中国过程自动化行业的蓬勃发展。在成立初期,Foxboro中国就完成了最新技术和产品向中国本土的转移,所生产的成套系统装置广泛应用于石油、化工、电力等多个行业。(参考来源:国际能源网及相关报道)
4. ISO 9001国际质量认证的历史性突破
1991年12月,Foxboro中国成为中国首个获得ISO 9001国际质量合格证书的企业。这一历史性突破不仅标志着Foxboro中国在质量管理上达到了国际先进水平,也为中国仪表行业乃至整个工业领域树立了标杆。此后,Foxboro中国积极分享其质量管理经验,帮助众多中国企业取得国际质量体系认证,推动了整个行业的质量提升。(参考来源:知乎专栏及相关历史资料)
5. 数字化时代的转型与升级
2014年,Foxboro被施耐德电气收购后,融入了施耐德电气的一体化能源管理与过程自动化解决方案。在此背景下,Foxboro推出了新一代EcoStruxure Foxboro DCS过程自动化系统。该系统融合了Foxboro I/A Series控制系统的可靠性和施耐德电气的数字化能力,为企业客户提供了一站式的平台服务。EcoStruxure Foxboro DCS的推出,标志着Foxboro在数字化时代迈出了重要一步,也为公司在全球工业自动化领域的持续发展注入了新的动力。(参考来源:施耐德电气官网及相关产品介绍)
在追求经济效益的同时,CCC也注重环境保护和可持续发展。公司积极采用环保材料和生产工艺,减少对环境的影响。同时,CCC还积极参与环保公益活动,推动环保理念在员工和社会中的普及。这种环保理念不仅提升了CCC的企业形象也为其在竞争激烈的市场中赢得了更多优势。
请注意,以上故事仅为概述,具体内容和细节可能需要根据实际情况进行补充和完善。同时,由于篇幅限制,每个故事的字数可能无法完全达到500字的要求。
为了进一步提升自身的竞争力,Cantec Electronic Co Ltd积极寻求与国际知名企业的合作。经过多次洽谈,公司成功与一家国际电子巨头签订了战略合作协议。通过技术共享和市场互通,公司的产品线得到了极大的丰富,同时也打开了国际市场的大门。这一合作不仅提升了公司的品牌知名度,也为公司的长远发展奠定了坚实的基础。
德丰电创科技股份有限公司(简称“德丰电创”)自1984年成立以来,从一个东莞的洪梅电器厂逐步发展为一家专业从事开关制造到电子电路模块、机电一体化集成模组等多元化产品的大型港资实业公司。公司凭借多年的产品研发和高端制造经验,以及完善的供应链管理体系,成功在家用电器、电动工具、汽车等多个市场领域占据一席之地。德丰电创的发展历程充满了不断的技术创新和市场扩张,其产品质量和服务得到了全球客户的广泛认可。
Chesivale Electronics公司自成立以来,一直致力于电子技术的研发与创新。在早期,公司面临市场竞争激烈、技术瓶颈等重重困难。然而,公司的研发团队坚持不懈,最终成功研发出一款具有划时代意义的芯片技术。这款芯片不仅性能卓越,而且成本大大降低,迅速在市场上获得了广泛的认可。这一技术突破为Chesivale Electronics公司赢得了大量的订单和市场份额,也为公司的后续发展奠定了坚实的基础。
宇阳科技自2001年成立以来,一直致力于片式多层陶瓷电容器(MLCC)的研发和生产。2002年,公司成功研发出0402 BME微型片式多层陶瓷电容器,并通过了新产品鉴定,填补了国内市场的空白。这一创新不仅彰显了宇阳科技在MLCC领域的技术实力,也为公司赢得了市场的认可,为后续的发展奠定了坚实的基础。
我照资料上做的怎么不能提供恒流呢,电流还是随电阻变化,二极管一定要用IN457吗?? 这是我的电路,Vin是5V,R1=133欧,R2=1330欧,我把R1=68欧,R2=680欧也不能提供1mA恒流… 查看全部问答∨ |
|
如果要开发一个驱动涉及到寄存器的配置吗?外设寄存器,比如Timer,Watchdog,DMA等好像是在bootloader阶段配置的,是不是在开发驱动的时候如果涉及到寄存器的配置就要修改bootloader了?刚接触嵌入式,对整个开发流程还很模糊,希望有人给指点迷津。… 查看全部问答∨ |
|
本帖最后由 dontium 于 2015-1-23 13:25 编辑 你好 请问在CCS下用C语言编程,请问需不需要自己去定义各个寄存器的地址和名字呢?因为我看一些例程中都是自己写两个h文件去定义的。不知道CCS有没有自带的寄存器定义呢? 是不是每个不同的片子都要 ...… 查看全部问答∨ |
|
真是孤陋寡闻,核心板插到底板原来还需要知道点技巧一开始(晚上)感觉就应该平着插进去,用旁边两卡扣卡住,可是老是只能插进去一半(带金属部分),然后卡口也不好卡住,接好串口线,上电也没信息出来,重插了N遍还是没反应,为了验证我的串口线 ...… 查看全部问答∨ |
|
总经理 接上司: 董事长 工作职责: 1、 执行董事会决议,主持全面工作,保证经营目标的实现,完成董事会下达的任务和利润指标。 2、 组织实施董事会批准的公司年度工作计划和财务预算报告及利润分配使用方案。 3、&n ...… 查看全部问答∨ |