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

来源:互联网 发布:sql拼接两个字段 编辑:程序博客网 时间:2024/05/16 18:27

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 resetreset:    /* start main */    bl mainloop:    b loop

led.lds

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

Makefile

CC = arm-linux-gnueabihf-gccLD = arm-linux-gnueabihf-ldAS = arm-linux-gnueabihf-asOBJCP = arm-linux-gnueabihf-objcopyOBJ = main.o led.o start.oall: $(OBJ)    $(LD) -T led.lds $(OBJ) -o led.elf    $(OBJCP) -O binary -S led.elf led.binled.o:    $(CC) -c led.cmain.o:    $(CC) -c main.cstart.o:    $(AS) start.S -o start.oclean:    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来运行

0 0
原创粉丝点击