s3c2440学习之路-002 C语言点亮led

1. 主要流程
【s3c2440学习之路-002 C语言点亮led】2. 源码
3. SP(stack )的设置
硬件平台:
软件平台:.04 arm-linux-gcc-3.4.5
源码位置:
1 主要流程
承接上一篇博客 , 原理分析就略过 , 流程也很简单:
1)设置栈
2)跳到C语言
3)将GPF4配置成输出模式

s3c2440学习之路-002 C语言点亮led

文章插图
4)将GPF4输出低电平 , 即可点亮LED1
2 源码
start.s
.global _start_start:ldr sp, =4096 /* for nand *//*ldr sp, =0x40000000 + 4096/* for nor */bl mainloop:b loop
汇编代码很简单 , 设置完了栈之后就直接跳到了C源的main函数
.c
intmain(){unsigned int *pGPF4CON = (unsigned int *)0x56000050;unsigned int *pGPFDAT = (unsigned int *)0x56000054;*pGPF4CON = 0x100;*pGPFDAT = 0x0;return 0;}
C代码也很简单 , 将地址强制转换成了指针 , 再对指针进行赋值
3 SP(stack )的设置
这里要引出2个问题:
为什么要设置SPSP的值如何设置 3.1 为什么要设置SP
当程序跳到C语言执行时 , 第一件事情就是保存现场 , 而保存现场就需要将数据压入到栈中 。因此查看反汇编代码时 , 跳到main之后 , 开头就执行了 “stmdb sp!, {fp, ip, lr, pc}”指令 , 这里就用到了SP。
.dis
3.2 SP的值如何设置
SP的设置根据nand flash, nor flash这2种不同启动方式可以配置成2个值 , nand flash 是4096, nor flash 是 + 4096 。
主要原因:
1)nand flash的数据无法直接读取 , 需要预先发送指令 , 所以当使用nand启动时 , 2440会把nand 前4K的数据拷贝到内部的SRAM里面 , 这样程序是从在内部的SRAM里面读取指令 。因为程序是从0地址开始拷贝 , SP设置成4906(4K) , SP的数值又是往下减的 , 所以保证SP不会踩到程序 。
2)nor flash是跟CPU统一编址 ,  CPU可以直接从nor flash读取数据(写数据需要预先发送命令) 。当使用nor flash启动时 , 程序是直接从nor flash读取指令 , 根据2440的手册 , 此时SRAM的起始地址为, 所以把SP的值设置为 + 4096 。
如果写了一个简单的流水灯程序会发现一个问题 , 程序烧到nand flash上运行的速度比nor flash要快 , 原因就是一个是在内部的SRAM读取指令 ,  另一个是在外部的nor flash读取指令 。