玩ARM9已经很久了,但心里早就想玩玩新的开发板了,前两天TQ6410已入手,这里先感谢一下,天嵌科技给我提供的开发板及其配件,十分感谢,我也愿意用业余时间来学习,并与大家分享,为天嵌贡献我自己的一份力量。 说到TQ6410,感觉很亲切,和TQ2440差不多,拿到手里真高兴啊,感觉一下子充满了能量,想尽快把它弄明白,简单的看过了电路图后,我决定先从S3C6440的芯片手册下手,以前给别人查资料的时候,就下载过,可是始终没来得及好好看,这一打开,吓死人,先不说1300多页的内容,看完书签栏就感觉好多东西都没有用过,只是稍微了解一些。对于6410,“我==新手”的。我这名新手也愿意和大家通过博客的方式共同学习TQ6410,一起进步。 感觉还是先弄几个简单的裸奔程序先玩玩,熟悉一下软、硬件资源吧。 说到ARM11裸奔,大家肯定会笑话,用那么高级的的东西做那么低级的事,其实我也很清楚,可是我一直认为,一上来就弄系统有两大陷阱:一就是系统太庞大,不紧需要的知识广且深,而且代码复杂,就好比一个LED的Linux驱动吧,看过源码的都知道,在裸奔情况下很容易解决的问题在Linux下就完蛋了,变得十分复杂,不易新手理解;二来就是系统都很相似,可以用可移植性来解释,无论是ARM9还是ARM11,在Linux下都很相似,只是硬件变了一点,而编程都差不太多,这样也不容易理解硬件的工作机制,写出效率较高的代码。 综上,我还是决定先把几个重点的程序裸奔一下,或者在U-BOOT中实现,不急于直接进军6410的Linux。可由于本人思给定式,也是中国人的思维定式,一下子就想到了LED是最简单的,哎,不知道啥时候能有创新。下面就整个TQ6410 V0.1开发板的LED闪烁实验总结一下,方便以后查阅,也方便大家拍砖啊。 一、换了硬盘,双系统吧告诉大家,我现在用的电脑是MSI的MEGABOOK S425,最低配置版本,奔4单核1.6G的CPU,不是1.7G的那板,听说在淘宝上,1.7G版的这款笔记本现在卖2000块,我想想,我的这个?(越想越伤心,有卖笔记本的联系我啊,便宜点啊!!) 由于对老机器的感情和经济上的原因,一直没舍得换,不过做开发来说,还是足够用的。但由于硬盘只有80G,老婆(自称C语言专家,不过Unix文盲)还在用,一直没装LINUX,只有在虚拟机上跑了,可是配置又低,那叫一个卡,每天蓝屏N次,前两天,一咬牙,买了一个320G的ATA口硬盘,真TMD的贵,不过这下好了,做了双系统,以后的开发就完全在UBUNTU10.40 LTS下了。 1、开发环境介绍开发环境:Ubuntu10.04;arm-linux-gcc3.4.5或4.3.3 串口工具:minicom或kermit 下载方式:TFTP 执行环境:steppingstone中运行。 2、重点说明交叉编译工具看了一下很多开发板的供应商都提供交叉编译器,都和他们以前的ARM9开发板的一样,是基于ARMv4指令集的。我记得我看过arm1176jzfs核已经支持更高级的指令集了,可迟迟没有推出新的交叉编译器,反正现在没有时间弄这些,估且用这老的吧,可是话说回来,arm9的裸奔教程,我使用的是3.4.5来编译的,可是编译内核的时候,又要切换成4.3.3,真麻烦啊,我决定来好好弄一弄编译器。 下面的内容同样适用于TQ2440: 如果使用天嵌自带的4.3.3交叉编译器编译裸奔程序,就会出现类似于这处错误: `__aeabi_unwind_cpp_pr0' 这种eabi错误是很麻烦人的,明明程序代码没问题,可就是编译不过去? 什么是EABI:embeded application binary interface. 链接:http://baike.baidu.com/view/3547622.htm 出现问题的分析: 这各问题一般是出现在链接阶段,而且是在子程序或子函数的入口或返回值处(个人经验)。可能是由于程序的调用问题。 解决办法: 1. 改用天嵌的3.4.5的交叉编译器。 2. 如果想用4.3.3编译的话,在出错的程序一端加入一个空函数,比如,上面的错误是:`__aeabi_unwind_cpp_pr0',就在main()函数前,加入一个空函数void __aeabi_unwind_cpp_pr0( ) { return 0 ; }。再用4.3.3编译,就不会报错了。 3. 另一个办法是改变程序调用规则,在arm-linux-gcc编译时,加上一个选项-mabi=aapcs。 上述3点我已多次实验(见程序代码),均无问题,编译出来的程序也和3.4.5的完全一样,如果大家发现问题,请及时联系我。至于为什么用上面的3个方法就能解决问题,我也没有深究,找了一些资料,足有几百页,没时间看,有时间再说吧。 二、程序详解本程序是由crt0.S,led_on_c.c,Makefile三个文件组成 。其中crt0.S文件是程序入口,完成设置指针功能,然后程序就设置到led_on_c.c文件中的main函数运行。 TQ6410开发板,共有4个LED,连接在GPM0、GPM1、GPM2、GPM3上,因此对GPM操纵即可实现控制LED。程序我已上传,请大家下载。其它部分我已做好了注释,我就不多说了。 三、运行方法及实验现象使用天嵌自带的U-BOOT启动开发板, 我是SD卡启动,具体的方法详见天嵌的使用手册,上面写得已经是很清楚了。 具体步骤: 1、 连接好开发板的电源、串口线及网线。 2、 打开MINICOM,按住PC机的空格键,打开开发板电源,使其进入菜单模式。 3、 按q退出菜单进入命令行模式。 4、 输入命令tftp 0x0c000000 led_on_c.bin完成烧写。 5、 用go 0x0c000000执行程序 实验现象:可以看见TQ6410开发板上的LED闪烁起来,改变程序中的延时,可以改变闪烁的频率 四、遗留问题及注意事项 1、问题大家有没有想过这样一个问题,TQ2440 是S3C2440的CPU,核是ARM920的,是armv4架构;而TQ6410是S3C6410的CPU,是arm1172jzfs核,是armv6架构,我们使用同一处交叉编译器怎么编译出来的程序即可以在TQ2440上运行,又可以在TQ6410上运行呢? 首先交叉编译器是不会知道我们是为哪款CPU在编译程序,而程序中也没有任何提示,告诉编译器这是哪款CPU的程序。 答案就是ARM11使用的是仍然是ARM9的armv4的指令,没有采用新的指令,这就是所谓的向下兼容。而另一个遗留问题是交叉编译器是可以在编译时通过选项来选择为哪款CPU编译的,不过具体的我没有试过,可以通过选项来指定CPU的类型及架构。现在网上已经有新版交叉编译器的建立方法了,大家可自行参考。 2、注意 TQ6410的存储空间已和TQ2440的不一样了,请大家注意查看一下Makefile中的链接地址。这里是链接到0x0c000000的steppingstone中,等讲到此处时,再详细说明。 并请注意一下新版的U-BOOT,和TQ2440的有一些差别。 三、参考资料 1、S3C6410手册 2、天嵌使用手册 3、http://blog.chinaunix.net/u3/98651/showart_2420850.html 4、http://yatusiter.blogbus.com/c3426171/
转自:http://dogking.chinaunix.com/space.php?uid=24189228&do=blog&id=61835