Chinaunix首页 | 论坛 | 博客
  • 博客访问: 951713
  • 博文数量: 113
  • 博客积分: 7235
  • 博客等级: 少将
  • 技术积分: 2101
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-14 11:24
文章分类

全部博文(113)

文章存档

2013年(7)

2012年(5)

2011年(6)

2010年(8)

2009年(15)

2008年(72)

分类: LINUX

2009-03-22 14:52:09

前一次试验了配置ADS1.2,不过那个源文件只有一个,并且是使用汇编编写的。本次讲的是如何配置ADS1.2,并且编写简单的汇编来初始化C语言运行的环境,最后调用C语言程序。

关于ADS1.2的配置,基本配置和上一次说的一样,最不过在第六步(配置ARM Linker)就不是上次讲的那麽简单了,因为程序现在是采用多个文件:一个汇编文件,负责为调用C程序设置环境(主要是栈);另一个是使用C语言编写的程序。我们知道在多文件编译的时候,要指定程序的入口,所以本次配置ARM Linker如下:

打开DebugRel SettingsALT + F7),选择”ARM Linker” 选择”LinktypeSimple”,将”Simple image””RO Base”改为0x30000000。设置“Equvalent Command Line”为:

-info totals -entry 0x30000000 -ro-base 0x30000000 -first Init.o(Init)

说明:Init.oInit.S编译生成的目标文件,(Init)Init.S中的Init域(AREA Init,CODE,READONLY)。

设置好之后,我们就可以分别编写程序了。在次给出我写的程序:

Init.S

 

    IMPORT main
    CODE32
    AREA Init,CODE,READONLY
    ENTRY
    ldr r0, =0x53000000
    mov r1, #0x0
    str r1, [r0]
    ldr sp, =1024 * 4
    
    bl main
main_loop
    b main_loop
    END

main.c


#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)

#define LED1 (1 << (5 * 2))
#define LED2 (1 << (6 * 2))
#define LED3 (1 << (7 * 2))
#define LED4 (1 << (8 * 2))
#define LEDS (LED1 | LED2 | LED3 | LED4)

void delay(int dly);

int main()
{
    int flag = 0;
    GPBCON = LEDS;
    
    while (1) {
        if (flag) {
            GPBDAT = 0xffffffff;
            flag = 0;
        } else {
            GPBDAT = 0x00000000;
            flag = 1;
        }
        delay(120);
    }
    return 0;
}

void delay(int dly)
{
    int i;
    for (;dly > 0; dly--)
        for (i = 0;i < 10000; i++);
}

阅读(5177) | 评论(7) | 转发(0) |
给主人留下些什么吧!~~

乡下老曹2013-04-28 20:39:35

你好,我想问下,不写那个汇编程序行吗?求回答!谢谢!

niutao.linux2009-08-27 21:44:45

这样也可以,不过用了判断标志之后使用一个delay()函数就可以了。

chinaunix网友2009-08-27 12:34:28

while (1) { if (flag) { GPBDAT = 0xffffffff; flag = 0; } else { GPBDAT = 0x00000000; flag = 1; } delay(120); } 这里为什么要设个判断标记?? 直接这样不就行了?? while (1) { GPBDAT = 0xffffffff; delay(120); GPBDAT = 0x00000000; delay(120); }

chinaunix网友2009-08-24 15:11:14

ldr sp, =1024 * 4 请问这里为什么要设为4K??

chinaunix网友2009-08-24 14:18:41

main_loop b main_loop 我想这一句应该是多余的。。main里面已经是死循环了~~