第二章 裸机_u-boot下载裸机程序以及ARM编程基础

1.使用u-boot下载裸机程序

在笔记本没有并口和串口的情况下,使用u-boot下载裸机程序到nand flash主要分为以下几步:

(1)下载u-boot到nor flash。

(2)需要USB转串口线。

(3)需要USB下载线。

(4)设置超级终端。

(5)安装DNW软件(三星公司出的ARM程序下载器)。

DNW 在这里是我们的.bin 文件下载软件,可实现我们向flash或者内存当中烧写程序的功能。关于DNW的设置如下:

(1)点击“Configuration”菜单的“Options”,出现“UART\USBOptions”配置单:

按照如图所示配置,上图中的发送地址就是PC 通过USB 发送到开发板的SDRAM的地址,一般我们设置为0x30000000,当然也可以根据您的程序在SDRAM 中的位置进行配置。

(2)串口工具和开发板连接成功后,将选择开关打到norflash,并按一下重启键,开发板则自动按照选择从norflash启动。此时SecureCRT上会有相应的显示。此时,我们就可以在SecureCRT界面之中输入相应的下载程序的选项,然后回车。(此时即将开发板选择进入到这一种下载模式,然后用DNW配合来实现下载即可。)

(3)双击打开dnw,然后选择USB Port>>Transmit>>找到相应的需要烧写的bin文件,双节

即可完成烧写。

(4)至此测试程序已经被我们烧写到了nand flash 中。此时,我们再将选择开关打到nandflash 中并重启开发板,使开发板进入我们刚刚烧写的出厂程序中。

2.在使用ADS进行基于ARM处理器的程序开发过程中,ARM源程序文件主要有以下几种类型:

.s:表示该文件是一个汇编语言源文件

.inc:表示该文件是一个被汇编语言包含的文件

.c:表示该文件是一个c语言源文件

.h:表示该文件是一个头文件

3.启动AXD调试器

当用户第一次打开AXD调试器时,可能会出现这样的错误

RDI Warning 00159: Could not open specified deviceport.

这个错误是由于AXD调试器设置不正确引起的,解决的办法是单击“Configure”,弹出对话框之后单击“Add”按钮,选择ADS安装目录,在Bin文件夹下选择ARMulate.dll文件,单击“打开”即可。然后在ChooseTarget对框中单击“Configure”按钮,此时会弹出“ARMMulatorConfiguration”对话框,在“Variant”的下拉列表框中选择“ARM920T”。在AXD调试器主界面,选择“File”菜单,然后选择“LoadImage”,选择相应的映像文件即可。

4.#define和typedef的不同之处在于,typedef是在编译阶段处理的,而#define是在预处理阶段处理的。

volatile关键字用来修饰变量时表示该变量的值可能被硬件修改,因此每次读取这个变量的值的时候需要从新从内存中读取这个变量的值,而不是使用保存在寄存器里面的备份。

5.一般按位与用来清零,按位或用来置1。开发中一般情况下也遵循这种方式。

典型示例:

#define rGPBCON (*(volatile unsigned*)0x56000010)

rGPBCON &=~(3<<10);

rGPBCON |=(1<<10);

6.编译器对C语言源程序进行处理大致经过预处理、编译、汇编和链接4个步骤最终才生成可执行程序。一般在对源程序进行语法和词法分析之前,先要对程序进行预处理。C编译器专门提供了部分预处理指令来指示编译器如何对源程序进行预处理,预处理指令以#开始,单独占一行。

7.ARM编译器提供了许多对C语言扩展的关键字,如__irq、__swi、__asm、__inline(前面均是两条下划线)等。

__irq声明中断处理函数

声明之后当中断发生时,编译器会自动保存相应寄存器的值。

void __irq Timer0_Isr(void)

{

 

rSRCPND = 1 <<10;//清除中断标志位

rINTPND = 1 <<10;

}

__swi用来定义软中断

软中断的主要功能是:将处理器工作模式切换到管理模式,主要是为了支持操作系统的系统功能调用接口或者也可以使用软中断来实现任务的切换等。

声明软中断的基本形式为:__swi(0x20) void ledtest()。

__asm内嵌汇编

通常在C程序中需要潜入汇编代码,这时可以用__asm关键字来指示编译器下面的代码是用汇编语言写的,参见后例。

__inline定义内联函数

用__inline关键字定义函数就像在C语言中用define定义宏一样,用这个关键字定义的函数在调用的地方被展开,这主要是为了解决频繁的函数调用开销过大的问题。对于ARM处理器而言,开中断只需要将当前程序状态寄存器CPSR中I位清零即可。

__inline void irq_enable(void)

{

int val;

__asm

{

mrs val,cpsr

bic val,val,#0x80

msr cpsr_c,val

}

}

8.ARM汇编语言和C语言混合编程

汇编语言源文件:

    AREAInit,CODE,READONLY

    ENTRY

    EXPORTsum

    EXPORTloop

    IMPORTMain

start

    b Main

    sum addr0,r0,r1

    movpc,lr

loop

    bl loop

    END

解析:第1、2、12行是ARM汇编程序的基本结构,用AREA声明一个Init段,ENTRY指定了程序的入口,END指定了汇编程序的结束。这几行都不能顶格书写。

第3、4行用EXPORT声明了一个外部标号sum和loop,其实这就是在C语言中要引用sum和loop,所以要在汇编语言文件中用EXPORT将其声明。

第5行用IMPORT声明了在C语言中定义的函数Main,在汇编语言中调用C语言中的函数或者全局变量要用IMPORT伪操作在汇编语言文件中声明,否则编译器会报错。

第6行定义了一个标号,应顶格书写。

第7行用b跳转指令,实现程序跳转到C语言的Main处。

C语言源文件:

extern int sum(int, int);

extern void loop(void);

void Main(void)

{

int val;

val = sum(2,3);

if(val == 5)

{

loop();

}

}

解析:第1行用extern关键字声明了一个外部函数sum,这个函数就是在汇编语言中定义的。

9.APCS规则

APCS规则保证ARM汇编语言程序和C语言程序之间能够协调工作。

寄存器使用:R0~R3用来传递参数;R4~R11用来保存函数的局部变量;R13(sp)用做堆栈指针,用来保存当前处理器模式的栈顶指针;链接寄存器R14(lr)用来保存子程序的返回地址。

参数传递:当程序的参数小于或者等于4个时,参数传递可以通过寄存器R0~R4来实现。当参数个数大于4个时,需要借助堆栈来传递参数。

函数的返回值:如果函数的返回值是32位的整数,则一般是通过寄存器R0来传递的,如果是64位则通过R0和R1来传递。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值