arm开发tq2440上的c++裸奔程序

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.       armthumb混合模式关闭,需要修改配置页签和启动文件中nand.asm数据段的断言。

 

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

 

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

 

 

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这才是老公的正确用法,不吃就往死里打......

1 倒是好办法就是有点儿费爸爸▼2 一只被主人遗弃的小熊的奇幻旅程▼3 小子,你单身的命运gu7在你把美女老师撂倒那一刻就注定了...▼4 张萌姐姐自我肯定式唱歌▼5 ???有被冒犯到▼6 听说昨天有个少年28岁就退休了▼7 哪个男…

java将date类型转成yyyymmdd_Java时间日期格式转换

1.1 返回时间类型 yyyy-MM-dd HH:mm:sspublic static Date getNowDate() {Date currentTime new Date();SimpleDateFormat formatter new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateString formatter.format(currentTime);ParsePosition pos new Pars…

C# WPF MVVM模式下在主窗体显示子窗体并获取结果

01—前言在winform中打开一个新的子窗体很简单,直接实例化窗体并show一下就可以:Form2 f2 new Form2();f2.Show();或者Form2 f2 new Form2();f2.ShowDialog();但是,在wpf的mvvm模式下,这种方法是行不通的,因为逻辑是…

Exchange 2010发现拓扑失败

今天跟大家继续分享一个我在项目中遇到的问题哈,希望对大家今后的项目排错有帮助。问题背景:企业主域控从 Window Server 2003升级为Windows Server 2012 R2具体实施方法可以参考我之前的文章(http://horse87.blog.51cto.com/2633686/1613268)在顺利升级…

html引用单文件组件,vue之单文件组件 纯网页方式引入

上一节的vue组件开发是把组件内容统一放到了一个js文件里面里面写上模板字符串(引用组件) 这种方式还需要拼接转义 写法非常丑陋vue贴心的帮我们封装了单文件组件 可以不用再模板里面拼接字符串下面看下写法由于我们目前没有使用webpack和vue-cli等构建工具(为了快速学习vue的语…

足不出户,游遍七大洲,不可错过的14部地理纪录片!

见识是超越时间与空间的力量,使人身未行,而心已至之。今天的资源分享就从七大洲为切入点,为各位献上最值得观看的14部地理纪录片,与各位一起探索各大洲的独一无二的自然与人文景观,从这些丰富的影像中,不仅…

EXT2/EXT3/EXT4文件系统数据恢复工具开发计划

D-Recovery For Linux数据恢复软件已经开发完成,现在把研发计划贴出来,留个纪念。 EXT2/EXT3/EXT4文件系统数据恢复工具开发计划EXT2/EXT3/EXT4是Linux下常用的文件系统,也是除了Windows下FAT/NTFS文件系统以外最常用文件系统,所以…

在Cocos2d中实现能够惯性拖动的选择界面

苹果的应用讲究用户体验 有的时候仔细想想 的确,很多细节决定了用户体验 比如说惯性拖动 可以说之前没有任何一家厂商能把触摸惯性拖动做的像苹果的UI那么流畅 Cocos2D中实现能够惯性拖动的选择界面 完成的效果: 制作一个简单的图层,通过传入…

qt显示echart_Qt配置,载入html,Echart, 交互

一、下载、安装、配置b) 编译器下载,本次要用到MSVC的编译器,下载安装visual studio 2017 版本(某博客说该版本支持 QWebEngineView)c) QT 安装过程中缺少组件可在QT安装目录下找到 MaintenanceTool.exe 添加;i. 需要注册…

SignalR在React/Go技术栈的实践

哼哧哼哧半年,优化改进了一个运维开发web平台。本文记录SignalR在react/golang 技术栈的生产小实践。01背景有个前后端分离的运维开发web平台, 后端会间隔5分钟同步一次数据,现在需要将最新一次同步的时间推送到web前端。说到[web服务端推送]…

UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)

题意&#xff1a;有n支队伍&#xff08;n是2的整数幂&#xff0c;2<n<4&#xff09;&#xff0c;打淘汰赛&#xff0c;胜者进入下一轮&#xff0c;其中1号队伍能打败至少一半的队伍&#xff0c;对于它不能打败的队伍l&#xff0c;一定存在一支它能够打败的队伍w&#xff…

conversion to dalvik format failed with error 1的解决办法

android低版本工程&#xff08;如1.5&#xff09;放到高版本环境中&#xff08;如2.2&#xff09;可能会上述错误&#xff0c;解决方法如下&#xff1a; 1。 如果不修改android sdk版本&#xff0c;则使用project clean 命令作用于某工程即可。 &#xff08;该处理方式…

16张扎心漫画,戳中女生私密日常,每一幕都很真实

全世界只有3.14 % 的人关注了爆炸吧知识比利时的插画师Planet Prudence&#xff0c;画了很多女生的真实日常&#xff0c;每一幕都很戳心&#xff0c;一起来看看吧。别人的痘痘一长就是一个&#xff0c;我一长就是一片。买买买的时候爽得要命&#xff0c;要穿的时候总觉得自己没…

刷magisk模块后不能开机_刷Magisk模块开机卡Logo了怎么办?两种方法教你轻松解决...

虽然&#xff0c;Magisk由于工作原理的不同&#xff0c;其模块对系统的兼容性相比较于此前的Xposed框架模块要好得多&#xff0c;但是依旧有可能出现刷了模块之后&#xff0c;卡Logo&#xff0c;无法开机的情况。今天&#xff0c;小编就提供两种方式解决刷Magisk模块卡开机Logo…

Linux添加用户(user)到用户组(group)

转载自“http://xxx.11tea.com/blog/15654” 将一个用户添加到用户组中&#xff0c;千万不能直接用&#xff1a; usermod -G groupA 这样做会使你离开其他用户组&#xff0c;仅仅做为 这个用户组 groupA 的成员。 应该用 加上 -a 选项&#xff1a; usermod -a -G groupA user (…

Magicodes.IE 2.5.6.2发布

2.5.6.22021.10.13支持自定义列字体颜色&#xff0c;具体见PR#342&#xff0c;感谢xiangxiren修复日期格式化的问题&#xff0c;具体见PR#344&#xff0c;感谢ccccccmd2.5.6.12021.10.06修复 #337&#xff0c;bool?类型导出的映射问题2.5.6.02021.10.05合并Magicodes.EPPlus到…

html的标签和标记有啥区别,HTML 元素 b 和 strong 有什么区别?//(强调标签的理解)...

不要动不动就把英语的术语、名称或概念牵强地翻译成中文。不是「粗体和加重有什么区别」(原题如此)&#xff0c;是「HTML 标签 和 有什么区别」。HTML 的标签负责将内容标记为 HTML 元素&#xff0c;浏览器的默认 CSS 样式表负责按照 W3C 的建议来指定 HTML 元素的默认样式。…

一个让我很不爽的外包项目——奔驰Smart2015新官网

七月份的下半个月&#xff0c;有幸做了奔驰 Smart 2015年新官网&#xff0c;包括手机端和PC端的宣传页&#xff0c;地址&#xff1a; PC端手机端这里&#xff0c;为了证明这个是一个事实&#xff0c;我还特意的留存了两张截图&#xff1a; 这里只想说明这么几个问题&#xff1a…

备赛脱脂经验分享_IEO国际经济学奥林匹克初选宏观备赛经验分享

背景介绍&#xff1a;国际经济学奥林匹克(IEO)是13项国际科学类奥林匹克竞赛(International Science Olympiads)之一&#xff0c;面向全球高中学生&#xff0c;旨在鼓励对经济学、财务和商业感兴趣的学生&#xff0c;激发他们用创造性方式解决问题。IEO由诺贝尔经济学获奖者、哈…

为什么饮料瓶大都是圆的,牛奶盒却是方的?原因你想不到

全世界只有3.14 % 的人关注了爆炸吧知识每日看着电视玩着手机再喝着饮料那是相当美好但是喝了这么久的饮料你有没有想过一个问题为什么饮料瓶一般都是圆的&#xff1f;而牛奶盒却是方的&#xff1f;图片来源网络有的人可能会说饮料瓶要拿在手上当然是圆的舒服啊拿着一个方形的饮…