level 1
不过如此--
楼主
刚刚看完韦东山老师的第一期的nandflash视频,看的是云里雾里的,感觉很多概念还是很模糊,特别是MMU那一块,对协处理器的操作不是很了解。不管怎么说,也想对这些天的学习做个总结,也分析下我自己学习第一期视频遇到的一些问题,希望大家入手的时候不要在遇到这样的小麻烦。
首先是学前班,由于楼主以前有过一些单片机开发经验,这部分我就跳过了,直接看了第一课。第一课是GPIO口的实验,听了课之后思路还是蛮清晰的,就是先配置I/O,然后给I/O写1或者是0,不过这里的重点我觉得应该是在那个寄存器的定义那里,因为点灯是个很简单的事情,但是,寄存器的定义我们平时可能都是直接COPY到芯片厂家的头文件的,或者直接是编译器给我们搞好了的,所以,这里应该重点去理解那个寄存器的定义哪里。汇编代码就不说了,在这里楼主简单的说下是怎么理解C语言那句话的。
(*(volatileunsigned long *)0x56000050)
我是这样看的,(volatileunsigned long *)这个就是强制类型转换,将0x56000050转换成一个unsigned long的地址指针,最前面的那个* 就是去指向这个地址,后面用到这句话就是往这个地址写值了。(volatile是一个禁止编译器优化的选项。)
第二课就是个存储管理器的实验,实验的内容就是把第一课的LED点灯代码移到了SDRAM中去执行,我觉得这节课的重点应该是在对2240启动方式的理解和两种启动方式的地址编址的区别。代码是不难的,不过楼主当时还是因为一个小问题折腾了两天!就是把
LDR SP,=0x34000000写成了LDRSP,=0X36000000。
唉,说多了都是泪,大家还是不要这么粗心好,也建议大家这里遇到灯不亮的时候看看是不是堆栈设置错误。
MMU那块确实楼主是看不懂,就跳过了,等哪天学的差不多了在回来学习吧。。。
接下来就是nand flash的学习,这节课的重点应该是nandflash的数据读取吧。这里楼主还是说一个遇到的问题吧。当时楼主调试的时候发现,无论我是否去初始化SDRAM,灯都可以点亮,郁闷了一段时间之后我发现是Makefile出了问题,就是在链接的时候,我把文件顺序写反了。
arm-linux-ld-Ttext 0x30000000 head.o leds.o -o sdram_elf
被我写成了这样
arm-linux-ld-Ttext 0x30000000 leds.o head.o -o sdram_elf
结果就是 leds.o的代码总是放在最前面,而我又在leds.c里面写了个while(1)的大循环,系统上电之后就跑这段大循环,后面的代码就没啥意义了。于是就决定恶补一下Makefile的知识,这里给大家推荐一个Makefile的讲解视频吧,感觉分析的不错。
http://www.maiziedu.com/lesson/450/ 看完之后感觉Makefile的基本知识还是知道了不少吧。
2015年05月05日 11点05分
1
首先是学前班,由于楼主以前有过一些单片机开发经验,这部分我就跳过了,直接看了第一课。第一课是GPIO口的实验,听了课之后思路还是蛮清晰的,就是先配置I/O,然后给I/O写1或者是0,不过这里的重点我觉得应该是在那个寄存器的定义那里,因为点灯是个很简单的事情,但是,寄存器的定义我们平时可能都是直接COPY到芯片厂家的头文件的,或者直接是编译器给我们搞好了的,所以,这里应该重点去理解那个寄存器的定义哪里。汇编代码就不说了,在这里楼主简单的说下是怎么理解C语言那句话的。
(*(volatileunsigned long *)0x56000050)
我是这样看的,(volatileunsigned long *)这个就是强制类型转换,将0x56000050转换成一个unsigned long的地址指针,最前面的那个* 就是去指向这个地址,后面用到这句话就是往这个地址写值了。(volatile是一个禁止编译器优化的选项。)
第二课就是个存储管理器的实验,实验的内容就是把第一课的LED点灯代码移到了SDRAM中去执行,我觉得这节课的重点应该是在对2240启动方式的理解和两种启动方式的地址编址的区别。代码是不难的,不过楼主当时还是因为一个小问题折腾了两天!就是把
LDR SP,=0x34000000写成了LDRSP,=0X36000000。
唉,说多了都是泪,大家还是不要这么粗心好,也建议大家这里遇到灯不亮的时候看看是不是堆栈设置错误。
MMU那块确实楼主是看不懂,就跳过了,等哪天学的差不多了在回来学习吧。。。
接下来就是nand flash的学习,这节课的重点应该是nandflash的数据读取吧。这里楼主还是说一个遇到的问题吧。当时楼主调试的时候发现,无论我是否去初始化SDRAM,灯都可以点亮,郁闷了一段时间之后我发现是Makefile出了问题,就是在链接的时候,我把文件顺序写反了。
arm-linux-ld-Ttext 0x30000000 head.o leds.o -o sdram_elf
被我写成了这样
arm-linux-ld-Ttext 0x30000000 leds.o head.o -o sdram_elf
结果就是 leds.o的代码总是放在最前面,而我又在leds.c里面写了个while(1)的大循环,系统上电之后就跑这段大循环,后面的代码就没啥意义了。于是就决定恶补一下Makefile的知识,这里给大家推荐一个Makefile的讲解视频吧,感觉分析的不错。
http://www.maiziedu.com/lesson/450/ 看完之后感觉Makefile的基本知识还是知道了不少吧。