打印

探讨一下ARM以及RVDS的使用

[复制链接]
楼主: xinzha
手机看帖
扫描二维码
随时随地手机跟帖
21
xinzha|  楼主 | 2009-12-16 09:37 | 只看该作者 回帖奖励 |倒序浏览
没用Realview ICE试过,Realview每次复位重连太困难,一般只在打桩测试的时候用Realview(因为山寨Jlink确实扛不住)。
听楼上这么一说,看来某些重要时刻还是要用Realview啊,谢谢啊!
哎,ARM提供的这些调试工具真是没法说了。

使用特权

评论回复
22
desert_hawk| | 2009-12-16 10:04 | 只看该作者
呵呵,工具不好用,可以锻炼人的“逆商”:lol
我想了个办法应该能够得到LR的准确值,就是不通过调试工具的界面观察,而是通过编个简单的程序把LR的值从串口发送到计算机的串口上。不知道这个是否可行,没实践过,只是个想法。

使用特权

评论回复
23
xinzha|  楼主 | 2009-12-16 10:15 | 只看该作者
哈哈,不错!
要是有Jtag的话,也可以写到某个全局变量里面,在所有的异常处理中加上,然后直接看内存,省得ICE乱报。

使用特权

评论回复
24
liliang9554| | 2009-12-16 18:29 | 只看该作者
学习了

使用特权

评论回复
25
maikun0318| | 2009-12-16 20:49 | 只看该作者
支持一下

使用特权

评论回复
26
xinzha|  楼主 | 2009-12-22 22:16 | 只看该作者
下一步让整理一些关于RVDS调试和工程建立相关的东西,再写写scatter文件语法,链接加载的一些细节等等,这两天准备开始追一个USB相关的bug,等完事了一起写一下。

使用特权

评论回复
27
xinzha|  楼主 | 2009-12-23 22:09 | 只看该作者
本帖最后由 xinzha 于 2010-1-30 11:07 编辑

当有需求建立一个全新的RVDS工程的时候(这种需求比较少,但是还是会有),如果你要使用scatter文件加载方式的话,就有一些问题需要注意。
在不使用scatter文件的时候,RVDS默认库会帮你生成很多标号和几个函数定义(标号是有意义的,丫那几个函数我不用不行啊?),而当你决定使用scatter并指定了scatter文件之后,RVDS会把那些默认生成的东西屏蔽掉,而又会在链接阶段去寻找这些符号,这就需要你自己重新定义这些符号,至少包括以下几个
__user_initial_stackheap
_你如果不把这几个符号重定义是真不让你链接通过啊。

使用特权

评论回复
28
xinzha|  楼主 | 2009-12-23 22:22 | 只看该作者
在armlink的参数中,有一个参数entry比较有用,这个参数帮助你指定在调试firmware的时候,cpu复位之后的PC地址,之所以说它有用是因为在一款芯片的研发过程中,bootloader往往是在比较后期的时候才会实现,并且在做一些验证的时候由于各种原因,很有可能FPGA上的RAM不在零地址,在这种没有bootloader而ram又不在零地址的状况下,如果能让firmware在任意地址跑起来,这个功能简直就像亲人一样亲。
至于为啥大家要自找麻烦而使用分散加载,从0开始,一直编译链接到最后不也挺好?这个问题牵涉太广,有历史原因,有偷懒原因,有成本方面的考虑,也有出于安全方面的考虑,总之我们没办法,只能去默默地忍受。

使用特权

评论回复
29
xinzha|  楼主 | 2009-12-24 21:57 | 只看该作者
在非调试的版本,代码中一般要出现如下这句话,
   #pragma import(__use_no_semihosting_swi)
这是在C代码中出现的形式,在汇编中略有不同,但是意思是一样的,就是禁止使用semihost功能。至于semihost到底是有些什么功能,我也不是很清楚,目前知道的有两点,一个是swi(软中断)由host pc接管,一个是目标板可以使用pc上的很多资源。
swi由host pc接管有啥好处不知道,坏处倒是有,就是如果你的目标板上跑的是一个比较复杂的操作系统,系统调用是由软中断模式实现的,那废了,semihost不能用了,拜拜。
当使用semihost功能的时候,目标板的大块内存可以在host pc上申请,可以从host pc读取文件处理然后再写回到pc上的另外一个文件,这个功能对自动测试是相当有用的一个功能,也可以在外部接口模块或者输入源无法连接到目标板上的时候对目标板上的软硬件模块进行功能验证。

使用特权

评论回复
30
xinzha|  楼主 | 2009-12-26 22:17 | 只看该作者
ARM的两种工作模式,ARM/THUMB,arm模式很好理解,就是正常的32位指令,32位数据,而THUMB模式是用16位指令,32位数据,这种模式的主要目的就是为了减少代码空间,节约成本。
  从理论上讲,THUMB模式的二进制代码应该接近于ARM模式的一半,而实际上这个数值略有偏差,原因是什么呢?因为当指令变为只有16位宽的时候,大多数指令可以被处理,比如左移右移之类的,而少部分指令却因为指令宽度的减小,可能需要多条指令组合来完成,至于是不是会比32位宽还占地方没有仔细研究过,这些指令就包含了立即数加载之类的,实际上即使是32位宽的时候,也有很多立即数加载指令不能在一条指令内完成,因为32位中指令和状态位之类的占用了不少,而arm的桶形移位器也不能涵盖所有的32位立即数表达,所以就会有很多加载是由多条指令完成,至于大家在写汇编的时候没有遇到过这种情况是因为汇编器帮助程序员屏蔽了这个细节,而如果你真正去查机器码的时候就会发现。

使用特权

评论回复
31
zuoyi001| | 2010-1-22 10:24 | 只看该作者
:)  研读中...

使用特权

评论回复
32
xinzha|  楼主 | 2010-1-24 17:13 | 只看该作者
惭愧,我这纯属野路子,近期要好好读一下arm手册,到时候在更新,看看以前写的是不是有错误。

使用特权

评论回复
33
雪水泡茶| | 2010-1-29 16:44 | 只看该作者
semihosting的功能简单来说就是把原来调试时需要使用串口输入输出的数据改走JTAG链路,从而节约系统资源。实用性因人而异

使用特权

评论回复
34
wowow| | 2010-1-30 08:19 | 只看该作者
semihosting用的是swi,现在好像用DCC更好一些,只是初步了解,还不知道怎么用。

使用特权

评论回复
35
wowow| | 2010-1-30 08:21 | 只看该作者
关于27楼说到的需要重新定义模块,一般只需要定义__user_initial_stackheap就可以了吧?其它我都没有定义。楼主是不是os里要用的?

使用特权

评论回复
36
wowow| | 2010-1-30 08:30 | 只看该作者
关于28楼的entry,只在用仿真器调试时有用,可以load程序后自动修改PC地址开始运行,但脱机运行时,必须从0地址开始运行的。各家有各种解决方案,如remap,nor启动之类的。
分散加载还是很有用的,特别是有外部flash、sdram等,需要优化分配存贮,分散加载是必不可少了。
楼主可能也是用了os吧,很多东西可能被os管理了。

使用特权

评论回复
37
xinzha|  楼主 | 2010-1-30 09:59 | 只看该作者
本帖最后由 xinzha 于 2010-1-30 10:28 编辑
关于28楼的entry,只在用仿真器调试时有用,可以load程序后自动修改PC地址开始运行,但脱机运行时,必须从0地址开始运行的。各家有各种解决方案,如remap,nor启动之类的。
分散加载还是很有用的,特别是有外部flash ...
wowow 发表于 2010-1-30 08:30

是只有在仿真的时候有用,在真机运行的时候必须是从0开始,这个entry是指示ide强行修改pc的复位指针。
这个功能比较多地用于FPGA验证过程中,因为这个阶段还没有bootloader,要想保证程序正确地在有ram的地址上跑起来就必须指定entry。

使用特权

评论回复
38
xinzha|  楼主 | 2010-1-30 11:08 | 只看该作者
关于27楼说到的需要重新定义模块,一般只需要定义__user_initial_stackheap就可以了吧?其它我都没有定义。楼主是不是os里要用的?
wowow 发表于 2010-1-30 08:21

刚才试了一下,把能注的都注掉,确实只要__user_initial_stackheap就能编过去了,感谢!

使用特权

评论回复
39
zhuang1127| | 2010-2-1 22:33 | 只看该作者
受教了

使用特权

评论回复
40
xinzha|  楼主 | 2010-3-30 11:15 | 只看该作者
最近学习了一下关于volatile的用法,里面有些以前没有注意到的东西,很值得讨论一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则