AVR实验做到LCD的时候,就发现proteus上没有现成合适的显示模块,网上找的模块不是按一般方法封装的,想来自己还有一块arm9开发板,大概大三、大四时候买的,已经搁置三年了。毕业这两年已经从51玩到AVR,虽然大多在proteus上玩,但对如何开发嵌入式有了基本,准确的认识。现在应该可以转到arm平台上来了吧?

首先是开发工具,走了很大的弯路最终才发现只能用RealViewMDK。放弃IAR是因为IAR无法移植TQ2440中对各段地址的引用,类似 |Image$$RW_RAM1$$ZI$$Limit|,这使得我无法安排各段在内存中的位置。即使硬编码到代码中,也无法配置成从NAND flash启动,IAR的链接器太简陋了。

我花了很长时间看TQ2440init.s这个启动文件,最后还是看了TQ论坛上的一篇文章才真正移植成功的(用Keil MDK开发TQ2440裸机程序入门教程2(移植TQ2440测试程序).doc),这才发现自己移植的是链接上出了问题,没有用--sort=CallTree,map文件中可以看到使用前nand.o在4k外,使用后在4k内,这就是代码烧到板子上后起不来的根本原因。

看了一段时间TQ2440的测试代码,觉得后面用到具体某个驱动的时候再回来看,现在可以开发裸奔游戏了。第一个问题是我想用c++来开发,全局的方法和更接近底层的方法可以用c来实现,自己写的c++框架后面的开发可能用得着,用c++语言配合面向对象方式的思考要比用C来的简单,至少对我这个用java工作的人来说是这样。目前刚把c代码转换成c++代码,主要还是nand.o的链接问题,这回不能用Main函数了,c++编译器不认识,改回main后会把nand.o挤出4K地址范围,试了所有的sort方法都不行。网上曾经看到有人说为什么不把nand的代码直接放到TQ2440init.s中,用--asm编译出nand.s,再把它整个拷贝到启动代码末尾,编译后nand的代码就在4K内了。

哈哈!有意思的事才刚开始 !!

2012.08.19

接下来的问题是不能使用STL中的容器类,会报data abort。原因是没有初始化c++运行时库,模仿着MDK中的c++例子,把Main替换成__main,这样在进main()函数之前会初始化c++必要的库。还用到了__user_initial_stackheap,stack指针可以配置成功,heap指针没有配置成功,不过已无大碍。

昨天刚解决一个困扰我四五天的,内存相关的data abort问题。描述如下:

有个引擎类的成员是STL容器类,LCD屏幕的初始化也是这个引擎类完成,结果在使用容器类成员的时候,打log发现容器类的数据被破坏了。在类初始化的时候数据还是对的,LCD屏幕初始化完毕后数据就出错了。从log看到stack指针和我配置的不同,修改启动代码后解决,但还是有data abort。最终通过不懈的打log调试,发现是视频缓冲这个全局数据和容器类对象在RW段上数据发生了覆盖。所以因初始化顺序的不同,会造成显示异常或容器类数据被破坏。

原因找到了,解决方案就很容易想到了,之前试过64M内存可以随意存取,不用管堆或栈的溢出。所以我把视频缓冲的地址强制设置到远离RW段的地方,运行,一切OK啦!

附上源码:http://files.cnblogs.com/PrajnaKit/BoxPorter.zip

2012.08.29

显示模块初步完成后,我开始声音模块的开发和调试。遇到的问题是真机播放声音时无法触发DMA中断,导致声音刚播放了一点就停止了,直接下载到内存运行时一点问题也没有。我排查错误花了三四天,结果还是没找到原因。不过我基本明白了DMA和UDA1341的工作原理,可这个bug过不去的话我的“裸奔游戏”远景就无法实现了。因为刚刚移植好的TQ2440测试程序播放声音是没问题的,那我就一步一步的改,直到声音无法播放。由于改的匆忙,事后回想整理的时候顺序可能有错误,不过要点应该都讲到了。

1.       把源码移植到Keil中。

2.       首先把Main改成main,启动文件和主文件需要修改,然后把主文件后缀变成cpp。一些c的函数需要包裹在extern “C”中。

3.       变成cpp后拷贝nand flash的函数RdNF2SDRAM被挤出4K地址范围,通过集成汇编后的nand.asm到启动文件解决。

4.       使用scatter文件来配置RW段和ZI段,由于STL容器类对象数据地址不太对的原因,需要把ZI段定义在远离RW段的地方,否则stl容器对象数据会覆盖ZI段全局数据。因此也需要修改启动文件中ZI数据初始化的代码中ZI段的地址。注意linker页签中要去掉"Use memory layout from Target dialog"勾选,不然无法指定ZI段地址。

5.       Uart_Printf()方法在使用通配符的时候会出问题(%d, %s, %p…),具体原因没有深究,不过从现象上看可能是由于没有链接相应的库,也可能是没有初始化运行时库。

6.       data或者prefetch abort问题需要实现__user_initial_stackheap()方法,不然堆和栈的地址没有初始化。启动文件跳转地址改为__main。

注意使用__main()的话,无法使用c++的类,不然无法进入到main函数。

更正:更新的源码现在使用__main()进行跳转,这样运行时库也就能初始化,同时STL库也能正常工作。

7.       arm和thumb混合模式关闭,需要修改配置页签和启动文件中nand.asm数据段的断言。

启动文件中增加user栈指针设置,最后还是启动文件写的有问题啊。。。终于查出来了,我把栈指针初始化开头的” bic        r0, r0, #CONTROLMASK”注释掉了,结果就有data abort。

源码已更新,屏幕背景所在的内存区域没有零初始化,所以背景的颜色是不确定的。

转载于:https://www.cnblogs.com/PrajnaKit/archive/2012/08/10/2631182.html

arm开发tq2440上的c++裸奔程序相关推荐

  1. 将linux内核烧进arm板,ARM开发板上uClinux内核移植

    <ARM开发板上uClinux内核移植>由会员分享,可在线阅读,更多相关<ARM开发板上uClinux内核移植(19页珍藏版)>请在人人文库网上搜索. 1.纷傲掌秀悸篷益哑檀扬 ...

  2. 【linux】ARM开发板上设置RTC时间,断电重启后,设置失效的原因分析

    问题描述 linux中使用date设置时间后用hwclock -w同步到RTC,断电重启后,有时会失效 原因分析 保存时间戳 1.使用命令关机(halt)会调用rc0.d中的脚本: 2.使用命令重启( ...

  3. 如何在ARM开发板上从源码编译安装OpenCV和OpenCV contrib

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文主要介绍如何在ARM开发板上从源码编译安装OpenCV和OpenCV contrib. OpenC ...

  4. ARM开发板上iconv_open(utf-8, gb2312) 调用失败的解决方法(转)

    ARM开发板上iconv_open("utf-8", "gb2312") 调用失败的解决方法 应用程序代码如下: static int code_convert ...

  5. 摄像头在liunx上的QT显示和OK6410 ARM开发板上的使用

    摄像头在liunx上的QT显示和OK6410 ARM开发板上的使用 发布者:旺旺雪饼   时间:2013-01-05 16:56:09 环境: Ubuntu10.04 arm linux OS: 3. ...

  6. s3c2440第一个裸奔程序——跑马灯(转)

    经过前段时间的准备,现在终于开始正式写ARM程序了.本着先易后难的原则,先写无操作系统的ARM裸奔程序,以便熟悉s3c2440的内部结构,此后再编写有操作系统的程序. 第一个程序就从最最简单的点亮开发 ...

  7. 第0课第2节_刚接触开发板之烧写裸板程序

    第0课第2节_刚接触开发板之烧写裸板程序 tftp用法 q //退出菜单 help tftp print //显示IP set ipaddr 192.168.31.203 //设置开发板IP set ...

  8. python交叉编译_交叉编译Python3.6.2,使用海思arm-hisiv200-linux-gcc,移植到arm开发板上...

    最近在学习Python,感觉使用Python可以快速的写出程序,比之前使用的C语言快多了,能省出很多时间.多学一点知识有更多的选择.本职工作是嵌入式开发,学习了Python后想移植到开发板上,尝试嵌入 ...

  9. linux usb视频开发板,ARM开发板上USB 摄像头图像采集实现

    开发板上的arm是AT91RM9200,摄像头选用的是网眼的pc350,主控芯片是ov511+.系统内核是2.4,宿主机是fedora core 6,交叉编译器是2.95.3.就是这些家底了,:-). ...

最新文章

  1. winform 异步更新ui
  2. 关于flex布局,我大多数常用的几个点
  3. Okhttp源码解析(三)——责任链
  4. 数据结构(8)----栈与队列之循环队列
  5. 使用Visual Studio Code编写和激活ABAP代码 (上)
  6. Docker最全教程之MySQL容器化 (二十五)
  7. Python 面向对象之双下方法,内置函数
  8. 前后端分离之权限验证
  9. 全屏加载loading显示的解决方法
  10. Andoid Activity.getWindowManager().getDefaultDisplay().getWidth()已被废弃
  11. mysql使用变量填值为数组_MySQL如何有效的存储IP地址?
  12. php网页背景音乐代码,怎么用html设置背景音乐
  13. 信息系统项目管理师---第十三章 项目合同管理
  14. 微信支付--商家转账到零钱
  15. java的方法覆盖与方法重载有什么异同_Java语言中方法重载与方法覆盖的异同
  16. python打开谷歌浏览器新标签页_selenium chrome在新标签页打开链接的方法
  17. 复杂稀缺类分析:稀缺与不重要能否划等号?
  18. 16丨数据分析基础篇答疑
  19. ARM Linux中断机制分析
  20. 4个步骤,搭建接口测试自动化框架

热门文章

  1. MYSQL中where子句与having子句的区别
  2. 操作系统基础:进程知识笔记(一)
  3. C#easyui combotree 设置节点折叠
  4. DotNet 资源大全
  5. const没define好用 php,3分钟短文|PHP 定义常量,我该用define还是const?这下不迷茫了...
  6. python3.4 pip安装_python3.4的pycurl pip安装
  7. php ?redis,PHP使用Redis存储Session
  8. ​Cookie 从入门到进阶:一文彻底弄懂其原理以及应用
  9. 【赠书福利】不扶好眼镜,请别打开这本挑战JS语言特性的书
  10. 制作一个让客户满意的软件