版权声明:wahahaguolinaiyou https://blog.csdn.net/wahahaguolinaiyou/article/details/89225539
6.开始写第一个裸机程序—LED程序
编写led_on.c程序,还需要编写一段汇编程序start.s来调用C程序。Start.s做了什么工作?
设置堆栈,调用C函数并保存返回地址。
ldmia ,stmdb批量操作数据。
7.C程序内部机制
调用者传参给被调用者或者返回参数都是用寄存器r0-r3,
用到谁就保存谁.
传参直接在汇编中调用函数前面写数据
使用volatile拒绝编译器优化这个参数。
注意:norflash是不可以写的,监测nor启动还是nand启动,往0地址处写0,如果读出来是0,则说明硬盘被修改了,是nand启动,如果不是0,则是nor启动。
8.编写按键控制LED的程序
思想:查看按键原理图的引脚位置,找到相应的寄存器地址,然后按键是输入数据到CPU,所有配置模式为输入模式,然后CPU判断输入的是什么数据,当读到按键的数据后,向led引脚发送低电平点亮LED。----mini2440实现
附代码:
/*汇编源程序start.s,为C函数设置堆栈,调用C函数*/
.text
.global _start
_start:
/*设置内存:sp栈*/
ldr sp,=4096 /*nand启动时,0地址处是4K的片内内存,它会映射到0地址,设置为4K的顶部(栈可能是满减栈)*/
// ldr sp,=0x40000000 + 0x4096 /*nor启动*/
/*调用main函数*/
bl main
halt:
b halt /*加一个死循环*/
/*led_on.c*/
#include<stdio.h>
int main()
{
unsigned int *pGPBCON = (unsigned int *)0x56000010;
unsigned int *pGPBDAT = (unsigned int *)0x56000014;
*pGPBCON = 0x400;
*pGPBDAT = 0x0;
return 0;
}
/*Makefile--连接地址从0开始*/
all:
arm-linux-gcc -c -o led_on.o led_on.c
arm-linux-gcc -c -o start.o start.S
arm-linux-ld -Ttext 0 start.o led_on.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
clean:
rm *.o *.bin *.elf