嵌入式爱好者

查看: 4338|回复: 3

C语言编程问题

[复制链接]

2

主题

4

帖子

13

积分

扫一扫,手机访问本帖
发表于 2011-9-21 10:37:56 | 显示全部楼层 |阅读模式
FL2440开发板,裸机编写C语言程序时,为什么前面要加一段用汇编写的init.s呢,请指教!
回复

使用道具 举报

13

主题

75

帖子

368

积分

发表于 2011-9-21 12:08:50 | 显示全部楼层
回复 1# cmz86121361


    谁说一定要汇编的啊?下面我写的一个项目就是用纯C来控制LED的,因为是下载到S3C2440的内核SRAM中运行,不需要初始化外部SDRAM。因为只是对GPIO进行操作,所以也没有对CPU进行一些初始化。这个程序下载到S3C2440的内部SRAM中就能够正常运行了。

    如果你是一些复杂的C代码,如需要设置堆栈等,或需要其他一些外设,如USB等,就需要用汇编对CPU,内存,外设等进行初始化了。

[guowenxue@localhost c_led]$ ls
led.c  led.lds  makefile
[guowenxue@localhost c_led]$ cat led.c

/***********************************************************************
*        File:  led.c
*     Version:  1.0.0
*   Copyright:  2011 (c) Guo Wenxue <guowenxue@gmail.com>
* Description:  This C code used to turn LED0~LED4 on on FL2440 board
*   ChangeLog:  1, Release initial version on "Mon Mar 21 21:09:52 CST 2011"
*
***********************************************************************/

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

#define LED0     5    /*LED0 use GPB5*/
#define LED1     6    /*LED1 use GPB6*/
#define LED2     8    /*LED2 use GPB8*/
#define LED3     10   /*LED3 use GPB10*/

#define DELAY_TIME   20000000

static inline void delay (unsigned long loops)
{
    __asm__ volatile ("1:\n"
        "subs %0, %1, #1\n"
        "bne 1b":"=r" (loops):"0" (loops));
}

int main(void)
{
    /*  Set GPB5,GPB6,GPB8,GPB10 as GPIO mode(0x01) */
    GPBCON = (GPBCON|0x333C00)&0x111400;
    GPBUP = (GPBUP | 0x560);

    while(1)
    {
        /* Set GPB5,GPB6,GPB8,GPB10 as high level, to turn LED0,LED1,LED2,LED3 off */
        GPBDAT = (GPBDAT | 0x560);
        delay(DELAY_TIME);

        /* Turn LED0 on */
        GPBDAT = (GPBDAT & (~(1<<LED0)) );
        delay(DELAY_TIME);

        /* Turn LED1 on */
        GPBDAT = (GPBDAT & (~(1<<LED1)) );
        delay(DELAY_TIME);

        /* Turn LED2 on */
        GPBDAT = (GPBDAT & (~(1<<LED2)) );
        delay(DELAY_TIME);

        /* Turn LED3 on */
        GPBDAT = (GPBDAT & (~(1<<LED3)) );
        delay(DELAY_TIME);
    }
}

[guowenxue@localhost c_led]$ make
/opt/buildroot-2011.02/arm920t/usr/bin/arm-linux-gcc  -c -o led.o led.c
/opt/buildroot-2011.02/arm920t/usr/bin/arm-linux-ld -Tled.lds led.o -o led.elf
/opt/buildroot-2011.02/arm920t/usr/bin/arm-linux-objcopy -O binary -S led.elf led.bin
rm -f *.elf *.o

2

主题

4

帖子

13

积分

 楼主| 发表于 2011-9-22 16:33:56 | 显示全部楼层
回复 2# dglwx


    我是看FL2440开发板给的ADS编程里的例子是这样的,而且我也试了,用H-JTAG联机调试,去调init.s代码后,例子里的led程序运行没反应,加上init.s代码后就可以了,所以有点疑惑,再次请指教!
snibm123 该用户已被删除
发表于 2011-10-27 23:06:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2025-1-11 00:25

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表