汇编+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来运行
相关文章推荐
- U-Boot源码分析及移植-fs2410
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- C语言进制转换代码分享
- 基于C语言fflush()函数的使用详解
- 对比分析C语言中的gcvt()和ecvt()以及fcvt()函数
- C语言单链队列的表示与实现实例详解