天嵌 ARM开发社区

 找回密码
 注册
查看: 8484|回复: 11

求助: 全局变量的初值不正确(关于2440在ADS下的测试程序移植到MDK的问题)

[复制链接]
Pony279 发表于 2011-12-25 00:55:19 | 显示全部楼层 |阅读模式
本帖最后由 Pony279 于 2011-12-26 20:45 编辑

(http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=5302644&bbs_id=9999)

前段时间发了个简单的教程, 这个是没什么问题的
http://armbbs.net/forum.php?mod=viewthread&tid=10423

因为我用的TQ2440开发板配有裸奔测试程序, 不移植过来用就太浪费了,  
所以我就决定把程序移植到MDK上, 可是搞了好几天了, 一直不成功, 昨晚为了这个还熬到四点多...(因为打算睡觉前突然调出来了, 但是后来又发现...发现是调出来的bin文件是之前生成的, 然后不管我怎么改, 就是改不回去...555...)

先说说我整理的教程里的下载到nand的那个, 其实如果只是使用 keil 给的启动代码做简单的裸机开发的话, 就不适合把工程下载到nand里了, 因为...如果不写个把代码从NAND搬移到SDRAM的程序的话, 程序最大就只能有4K了 ( NAND没有运行程序的能力, 如果从NAND启动, 2440会把前4K的代码般到内部的存储器执行).  

而TQ2440的测试程序本来就有在ADS下的从NAND启动的那部分代码 (包括搬移到SDRAM的那部分), 因为我汇编不熟, 所以才想直接把代码移植过来, 唉, 费了好大的劲, 还是没成功...




现在说明问题:


让2440从NAND启动并执行程序确实是调出来了, 可是现在的问题就是全局变量的初始值不正确, 所以程序在执行的时候很有问题,

我测试的蜂鸣器唱歌的程序, 程序里有数组SONG (没有声明const) 保存了歌曲的音调和时间的信息,  

把生成的bin文件烧到NAND后用JLINK调试时发现, 从SDRAM搬完后, SONG数组的值就已经确定下来了, 而且不正确! (数字奇怪木有规律...我就不贴上来了...)

所以我比较怀疑是这从NAND搬运的这个环节出了问题, 但是这部分的代码我没动过, 之前又成功过一次, 所以具体问题出在哪里就不好说了

如果把SONG定义为const的话可以解决我移植的测试程序的部分问题, 但这个是解决问题的根本办法呀...

另外, 这个程序改成从NOR启动, 或者在SDRAM里调试, 一点问题也没有, 问题就出在NAND启动上了.

在网上也找到几个类似的问题, 但是并没有找到根本的原因:
其中一个链接: http://topic.csdn.net/u/20091210 ... 5-40b15fdcb572.html

实在没有办法了我才发帖子到论坛里求助了, 希望各位能帮下忙了!

下面是我的工程文件:
点击此处下载 ourdev_707346F3FWSI.zip(文件大小:2.64M) (原文件名:Example.zip)  
说明一下:
工程里有三种配置:
一种是生成从NAND启动的bin文件
一种是用JLINK在SDRAM调试
一种是用JLINK烧写到NOR的,
源代码都是一样的, 只不过有些配置不同, 可以从这里很方便的修改:
也可以从这里修改:  右键->Manage Compunents






然后上传我主要参考的文档:
点击此处下载 ourdev_707352U743DM.pdf(文件大小:1.50M) (原文件名:RealView MDK Jlink Mini2440测试程序移植(成功).pdf)  
生成下载到NAND的bin文件的话工程配置和文档里说的有些不同, 另外我的代码其实只是修改了 |Image$$ER_ROM1$$RO$$Base| 这一类名字上的问题, 还有一个8字对齐的指令
生成bin文件的那个目标的分散加载文件是自己写的, 因为前4K很重要, TMD那个MDK让用户设置连接顺序太麻烦, 我是这样设置的, 试了很多方法, 只有这样才能正常启动...(要是TQ2440的不把NAND那部分的代码单独做了nand.c的话就不用这么麻烦了...)
LR_ROM1  0x30000000 NOCOMPRESS {    ; load region size_region
   ER_ROM1  0x30000000 NOCOMPRESS 0x800000
   {  ; load address = execution address
;启动的核心部分, 把代码从NAND搬移到SDRAM中, 再跳到SDRAM中执行
      *.o (RESET, +First)
   ; 2440init.o(+RO, +ENTRY)
    nand.o (+RO )   
    2440slib.o (  +RO  )
}
+0 NOCOMPRESS 0x7ff000
   {
main.o (+RO)
2440lib.o (+RO)
mmu.o(+RO)
.ANY (+RO)
   }

  RW_RAM1 0x30800000 NOCOMPRESS 0x00800000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM1 0x40000000 NOCOMPRESS UNINIT 0x00001000  {
   .ANY (+ZI)
  }
}


另外我在网上找到了声称是移植成功了的, 这个是原文件:
点击此处下载 ourdev_707347ICV6O7.rar(文件大小:3.93M) (原文件名:移植天嵌的测试程序倒MDK.rar)  

我测试后发现掉电后程序就没了, 然后我就用我自己写的sct文件解决了这个问题, 然后继续测试又发现还是有全局变量不正确的问题(就是把程序烧到nand以后就JLINK调试, 看变量)
, 不知道我的测试有没有问题, 希望高手能帮忙看看
点击此处下载 ourdev_707348JU82NQ.zip(文件大小:3.81M) (原文件名:ADS_To_MDK.zip)  
 楼主| Pony279 发表于 2011-12-25 16:23:48 | 显示全部楼层
本帖最后由 Pony279 于 2011-12-27 11:24 编辑

问题基本解决,
有关移植测试程序的详细说明已经写好了, 参考:
http://www.armbbs.net/forum.php?mod=viewthread&tid=10500&page=1#pid59291

亚瑟王 发表于 2011-12-26 14:06:03 | 显示全部楼层
亲,我这里没有这个环境,没法直接测试,不过有以下几个建议给你:
1、建议你先把成功裸机程序精简了,比如只要一个汇编初始化的2440init.S,2440lib.S,一个Nand.c,一个main.c,这几个文件,然后编译连接了看看。
2、确认一下连接顺序:2440init.S->2440lib.s->nand.c(理论上到这里,镜像不会大于4K,如果大于4K就没法运行了)->......................
3、nand.c作为一个独立的文件,应该对你调试代码来讲要方便,如果做成汇编的搬运代码,对于你又不懂汇编的现实情况来讲,你会更崩溃的。
 楼主| Pony279 发表于 2011-12-26 14:51:52 | 显示全部楼层
本帖最后由 Pony279 于 2011-12-26 14:58 编辑
亚瑟王 发表于 2011-12-26 14:06
亲,我这里没有这个环境,没法直接测试,不过有以下几个建议给你:
1、建议你先把成功裸机程序精简了,比如 ...


谢谢, 你的建议
我是有这样想的, 下个星期要考试了, 所以现在不敢花太多时间玩这个了, 暂时没时间继续测试了

嗯, 我测试过, 一直到nand.c都是不会大于4K的,
用MDK的软件仿真看到nand.c的那部分代码是在4k以内的,
在J-LINK下NAND启动调试的时候也发现成功跳转到了SDRAM中执行, 就是

nand_boot_beg
        [ {TRUE}
                bl RdNF2SDRAM
        ]

        ldr        pc, =copy_proc_beg ; 设置到SDRAM中继续执行
;===========================================================
copy_proc_beg
;**********************************************
        adr        r0, ResetEntry             ; -----------------------J-LINK调试的时候, 我在这里打了个
    ;---------------断点, 程序成功跳转到了这个地方, 说明NAND搬移的那部分代码已经成功被执行了吧?
;***********************************************
        ldr        r2, BaseOfROM
        cmp        r0, r2

在挂科边缘...这几天都没时间测试了:'(

不过我是不打算再回到ADS的, 有几次都是辛辛苦苦写了代码, 然后ADS突然崩溃, 然后代码就没了...
虽然我有每隔几分钟就保存的习惯, 不过重写一段确实是很不爽的事情...

实在没办法的话以后直接烧NOR也不错

另外我在网上看到有方案是 直接下载个类似 NOR 上的bootloader 到NAND FLASH上, 既有启动功能又有重新用USB下载程序的功能, 但是没有提供源码,
我看了天嵌手册上的说明, 那个占了256K的uboot只专门用来启动LINUX的吧?
似乎没有我需要的这一类源码...(PS:我还不会移植bootloader...)
刚才说的方案的链接:
http://wenku.baidu.com/view/ee4f6e0e76c66137ee0619b8.html

另外还有一个网友提供的代码好像是类似的方案, 我试了下, bootloader程序可以运行, 不过他的说明不够详细, 所以我不会用...他的TQ2440是以前的的版本的, 他有自己写了MDK下烧写NAND flash的算法, 可惜这个算法在对我的板子上的NAND flash不能用
http://www.ourdev.cn/bbs/bbs_con ... ge_no=2&bbs_id=1032
 楼主| Pony279 发表于 2011-12-26 19:24:29 | 显示全部楼层
刚刚没事干看了下MDK的说明,
看到这个,

我改了一下链接器的设置,然后用RAM_DEBUG的配置去生成bin文件
全局变量正常了,

不过参数传递出了问题...正常的话应该返回数字的...
printf("%d", num)这种方式的参数传递失效了...

MDK好像不能直接设置链接顺序...我只是改了链接的sort属性,
改回去在ram里面调试就正常, 可惜下载到NAND的话全局变量不能用

不过这个已经是很大的进步了!!!:lol

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
 楼主| Pony279 发表于 2011-12-26 20:06:36 | 显示全部楼层
MDK的链接器真是麻烦...
好像有条什么 at指令可以用来绝对定位的,
不过我讨厌这一类的指令...这简直就是扼杀代码的通用性, 要么就是加重了程序员的负担...:dizzy:
 楼主| Pony279 发表于 2011-12-26 20:41:19 | 显示全部楼层
本帖最后由 Pony279 于 2011-12-26 21:03 编辑

:D问题成功解决, 虽然不知道为什么...也不算是圆满解决, 不过至少满足了我的需要了,

我又改了设置
(为了防止看不到图:  菜单栏->project->options for Target...-> C/C++ -> uncheck Enable ARM/Thumb Interworking
菜单栏->project->options for Target...-> ASM-> uncheck Enable ARM/Thumb Interworking)
file:///C:/Users/Pony/AppData/Local/youdao/ynote/images/8747B0A58E8149B495A781D5D917BB3C/clipboard.png
file:///C:/Users/Pony/AppData/Local/youdao/ynote/images/048DC4E52C184BA59D87F4E422324BE7/clipboard.png
然后 蜂鸣器就正常放歌, 参数传递也没问题了
file:///C:/Users/Pony/AppData/Local/youdao/ynote/images/4095D7D782414E089FB67646EC90CE57/clipboard.png

最后移植成功的代码:

ram_or_nand 这个配置既可以用J-LINK来SDRAM调试, 也可以用来生成bin文件下载到NAND里去
file:///C:/Users/Pony/AppData/Local/youdao/ynote/images/63A8817B66E64FA99651375A53A88E00/clipboard.png


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
TQ-lkp 发表于 2011-12-26 20:46:12 | 显示全部楼层
感谢楼主分享!
 楼主| Pony279 发表于 2011-12-26 20:46:57 | 显示全部楼层
相关的详细说明等我有时间的时候再写吧...
复习复习...:Q
 楼主| Pony279 发表于 2011-12-26 21:27:24 | 显示全部楼层
另外我发现一个问题,
测试程序不论是在ADS还是在MDK下编译, 都会冒出好多警告,
感觉有些地方是在驱动编写的时候的不好的编程习惯造成的, 代码不够规范,
如果这样积累下去, 因为警告太多, 与BUG有关的关键的警告不好注意到, 会给调试带来很多不方便呀
从点上讲感觉天嵌的测试程序的代码不太好, 特别是对我这样的菜鸟来说, 调试真的不太方便

以前玩51的时候都是尽量消灭所有的警告的...
也可能是当时写的代码比较少我才有这样的闲情吧...
TQ-lkp 发表于 2011-12-26 21:49:27 | 显示全部楼层
集思广益,大家有好的东西可以一起分享
swc129 发表于 2012-3-4 19:43:24 | 显示全部楼层
集思广益,大家有好的东西可以一起分享

评分

参与人数 1 +10 收起 理由
809721232 + 10 都是我需要的MDK移植指南,谢谢楼主,神贴!.

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-4 22:06 , Processed in 1.031250 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表