换了个板子了,那个板子太不好用了
还换了个发行版,换成了ubuntu,所以不太熟,昨天就遇到ip的问题,ifconfig eth0 用不了 ifconfig eth4也用不了,百度得知可以:sudo gedit /etc/network/interfaces 然后就去修改ip,然后再:sudo ifup -a 更新设置,ip就设置好了。还好今天解决了,下面这个网址
https://blog.csdn.net/fengyee_zju/article/details/8306189
tmd,一个led流水灯搞了一上午,我去,怎么调都不对,用了少了个 .dls 链接文件。下午继续。下午就得起飞了。
下午,来说说下午,要吐血了,又调了一下午。
key_led.bin : crt0.S key_led.c
arm-linux-gcc -g -c -o crt0.o crt0.S
arm-linux-gcc -g -c -o key_led.o key_led.c
arm-linux-ld -Ttext 0x0000000 -g key_led.o crt0.o -o key_led_elf
就这个Makefile 都有大名堂, 就这句key_led.o crt0.o -o key_led_elf 中的 crt0.o非要放在key_led.o的前面才可以,哎,你说说,这有什么区别吗?无语了都!!!! 哎,其实还是有区别的,别人是初始化是要放前面,以后注意一下!
/****************************Makefile**********************************************************************/
all:led.o uart.o init.o main.o start.o
arm-linux-ld -T sdram.lds $^ -o sdram.elf
arm-linux-objcopy -O binary -S sdram.elf sdram.bin
arm-linux-objdump -D sdram.elf > sdram.dis
clean:
rm *.bin *.o *.elf *.dis
%.o:%.c
arm-linux-gcc -c -o $@ $<
%.o:%.S
arm-linux-gcc -c -o $@ $<
说一下这个: $< 表示第一个依赖——%.S
$^——所有依赖——all:led.o uart.o init.o main.o start.o中的led.o uart.o init.o main.o start.o
%.S——所有.S文件 %.o也一样
/**************************start.S**********************************************/
.text
.global _start
_start:
b reset //这2个是异常向量表,还有其他的,没写了
b do_und //跳转到他的地址
do_und:
/*sp_und 未设置,还有设置它*/
ldr sp, =0x34000000
stmdb sp!, {r0-r12,lr} /*在und异常处理函数中有可能会修改r0-r12,所以保存r0-r12*/
/*保存现场*/
@说下{} 视频上反正是{r0-r12,lr}:把r0到r12的寄存器,和lr寄存器保存 发生异常地址会保存在lr寄存器
/*处理Und异常*/ @stmdb 先减后存 ldmia先读后加
mrs r0, cpsr @把cpsr的值读人r0
ldr r1, =und_string
bl printException
/*恢复现场*/
ldmia sp!, {r0-r12, pc}^ @把r0-r12的值读取出来 ^会把spsr的值恢复到cpsr里面
und_string:
.string "undefined instruction exception" //汇编里面定义字符串 相当于c: char und_sting[]="undefined instruction exception"
说说arm架构里面的这个图
cond:状态,不用管 27,26,25不知道 24-21:表示指令(如:mov,ldr....) 20-12不知道 11-0:立即数。
ldr r0, =#0x100 #0x100 就是立即数 说到这,我们得先说说0-11,分为前4位代表rotato,后8位
立即数=(后8位 右移rotato*2位)
这是0x100的表示形式。 1100 =12 所以右移24位,1>>1变成 100000(31个0),然后右移23位0....0100000000
100000000=0x100。
如果要表示0x400呢 0x400=400000000, 对于二进制右移左移,值分别改变2的移动的位数的次方。所以右移动22位就好了