打印

Cortex-M3神奇的指令STRB啊,有图有真相!

[复制链接]
5156|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flamone|  楼主 | 2012-5-30 22:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
CPU:
STM32V103RCT6
@72MHZ


环境:
MDK
ARMCC 4.1.0.713
仿真器:
J-LINK


执行STRB指令之前,如下图


数组NMTTable[]的各值全部为0x0000000F;
(总共有128个元素)


nodId=0;

Disconnectedenum_nodeState中的元素,当前值是1:
enum enum_nodeState {

Initialisation
= 0x00,


Disconnected
= 0x01,


Connecting
= 0x02,


Preparing
= 0x02,


Stopped
= 0x04,


Operational
= 0x05,


Pre_operational = 0x7F,


Unknown_state
= 0x0F

};









执行STRB指令之后,如下图,请你见证奇迹:



数组NMTTable[]128个元素的各值全部被写成了0x00000001;

这一条寄存器到存储器的字节传送指令STRB,它能一次传送128???

神奇吧???
哪位高手能解释一下?





我这是在调试CanFestivalCanOpen源码,在此之前,我曾在M16C290单片机上,成功地运行了CanFestival,现在是想让它在STM32
上运行,不小心发现了STM32的神奇之STRB指令....




沙发
ilovezeno| | 2012-5-30 23:23 | 只看该作者
我感觉这个多半还是你debug信息更新的bug而不是STRB的问题,从反汇编那几行来看也没有问题。你不妨在这边放个串口打印或者一个测试用全局变量,把数组的其他值打印出来或者传递到全局变量里做观察,应该是对的。STRB绝对不可能传送多字节,我自己使用STRB的汇编程序从来没有出现过这类错误,所以不是cortex m3的原因,要么是盗版jlink数据更新不稳定的原因要么是mdk的bug。

使用特权

评论回复
板凳
aozima| | 2012-5-30 23:31 | 只看该作者
楼上正解

使用特权

评论回复
地板
airwill| | 2012-5-31 08:53 | 只看该作者
呵呵, 发现新大陆了!
可惜这是不可能的, 就是 DEBUG 数据更新的问题

使用特权

评论回复
5
IJK| | 2012-5-31 09:35 | 只看该作者
“有图有真相” 可见并不竟然。
如同最近在深圳发生的飚车案警方的解释一样,有图、有视频还不够,还需要大家的合理判断、分析,才能更接近于真相。

使用特权

评论回复
6
TECHWELL| | 2012-6-3 21:43 | 只看该作者
实际上,上边的问题,是我遇到的。是我请flamone帮我,来这儿请教高手的。
现在,有解了:改用MDK4.53,再了也没了这个烦恼!
   谢谢大家!

使用特权

评论回复
7
香水城| | 2012-6-4 16:43 | 只看该作者
观察的视角很重要。 听说过瞎子摸象的故事吧,错误的观察视角和观察手段,得出的就是错误的结论。

使用特权

评论回复
8
bwolf1986| | 2014-6-9 16:32 | 只看该作者
最近我也遇到类似的问题了,申请一个动态内存,赋值,赋值第一个字节的时候总会修改第二个字节的数,追踪到了STRB这了。MDK 4.7的  无语了。串口打出来和debug内存里看到的都一样,多赋值了一个字节。

使用特权

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

本版积分规则

0

主题

22

帖子

1

粉丝