初入领悟:
1、 程序编译
2、 GPIO操作
3、 Volatile使用与意义
Test1 ----- 裸板操作代码
首先代码有汇编部分与C部分;
汇编部分:1、堆栈首地址设置
2、watchdog屏蔽
3、跳转至main()函数
4、停机处理
C部分:实现控制4盏led的点亮操作
首先说明汇编的必要性:程序运行平台为裸板,既无操作系统情况下;先考虑一下,代码编译过程分为:1、预处理2、编译3、汇编4、链接
(此图出自:http://www.chineselinuxuniversity.net/articles/50450.shtml)
在进行编译时编译器会自动在执行程序下加入一些称为启动文件的代码:ctrl.o、ctri.o、crtend.o、crtn.o这些文件均为标准库文件,脱离操作系统后将无法执行,其主要功能为堆栈设置于调用main()函数;
因此我们必须自己完成堆栈与main()函数调用的操作在脱离系统的情况下;
======================================================================
Frist:ctr1.s
/**************************
*完成堆栈设置
*watchdog屏蔽
*main()调用
**************************/
.text
.global _start
_start:
ldr r0,=0x53000000 @将r0设置为watchdog寄存器
mov r1,#0x0 @使用r1保存watchdog寄存器预配值
str r0,[r1] @屏蔽watchdog
ldr sp,=1024*4 @设置堆栈地址
blmain @调用main()函数
loop_tst:
b loop_tst
======================================================================
Second:led_on.c
#define GPBCON (*(volatile long *)0x56000010)
#define GPBDAT (*(volatile long *)0x56000014)
#define GPB4_out (1<<(4*2))
#define GPB3_out (1<<(3*2))
#define GPB2_out (1<<(2*2))
#define GPB1_out (1<<(1*2))
int main(void)
{
GPBCON= (GPB1_out) | (GPB2_out) | (GPB3_out) | (GPB4_out);
GPBDAT= 0x00000000;
return 0;
}
==================================================================
Third:Makefile
led_on.bin:ctr1.0 led_on.o
arm-linux-gcc-g -c -o ctr1.o ctr1.s
arm-linux-gcc-g -c -o led_on.o led_on.c
arm-linux-ld-Ttext 0x00000000 -g ctr1.o led_on.o -o led_on_elf
arm-linux-objcopy-O binary -s led_on_elf led_on.bin
arm-linux-objdump-D -m arm led_on_elf > led_on.dis
clean:
rm-f *.o led_on_elf led_on.dis led_on.bin
==================================================================
至此点亮开发板上的led的裸板程序就完成了,make之后即可下载了。