您的位置:首页 > 编程语言 > Go语言

汇编+C点亮led-用uboot的go命令运行

2015-08-26 20:30 579 查看

main.c

#include "led.h"

static void delay()
{
unsigned int i = 0;

for(i = 0; i < 0xffffff; i++);
}

int main()
{
led_init();

while(1)
{
led1_on();
delay();
led1_off();
delay();

led2_on();
delay();
led2_off();
delay();

}
return 0;
}


led.c

#define GPIO_BASE           0x01C20800
#define GPIO_PH_CFG2_BASE   (GPIO_BASE + 0x104)
#define GPIO_PH_DAT_BASE    (GPIO_BASE + 0x10C)

#define GPIO_PH_CON         (*(volatile unsigned *)GPIO_PH_CFG2_BASE)
#define GPIO_PH_DAT         (*(volatile unsigned *)GPIO_PH_DAT_BASE)

void led_init()
{
/* clear PH21 */
GPIO_PH_CON &= ~(0x7 << 20);

/* clear PH20 */
GPIO_PH_CON &= ~(0x7 << 16);

/* set PH21 output */
GPIO_PH_CON |= (0x1 << 20);

/* set PH20 output */
GPIO_PH_CON |= (0x1 << 16);
}

void led1_on()
{
GPIO_PH_DAT |= (1 << 21);
}

void led1_off()
{
GPIO_PH_DAT &= ~(1 << 21);
}

void led2_on()
{
GPIO_PH_DAT |= (1 << 20);
}

void led2_off()
{
GPIO_PH_DAT &= ~(1 << 20);
}


led.h

#ifndef _LED_H_
#define _LED_H_

void led_init();

void led1_on();

void led1_off();

void led2_on();

void led2_off();

#endif


start.S

.section .init

.global _start

_start: b reset

reset:

/* start main */
bl main

loop:
b loop


led.lds

SECTIONS
{
.text : {*(.init) *(.text)}
}


Makefile

CC = arm-linux-gnueabihf-gcc
LD = arm-linux-gnueabihf-ld
AS = arm-linux-gnueabihf-as
OBJCP = arm-linux-gnueabihf-objcopy

OBJ = main.o led.o start.o

all: $(OBJ)
$(LD) -T led.lds $(OBJ) -o led.elf
$(OBJCP) -O binary -S led.elf led.bin

led.o:
$(CC) -c led.c

main.o:
$(CC) -c main.c

start.o:
$(AS) start.S -o start.o

clean:
rm $(OBJ) led.elf led.bin


通过uboot下载并运行

1,在uboot中执行loadx等待下载(xmodem)

2,在minicom中选择编译好的led.bin文件,通过xmodem下载到uboot中

3,在uboot中执行 go 0x48000000,便可以看到Cubieboard2的两个led以流水灯方式亮起来了

这种方式的关键在于通过链接脚本指定了0地址处的第一条指令(即start.S中的第一条指令),然后通过bl main来调用C文件中的main函数。

另外,生成的led.elf也可以通过uboot中的指令bootelf来运行
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 u-boot cubieboard