网站大量收购独家精品文档,联系QQ:2885784924

导致STM32芯片指令速度变化的问题分析过程.pdf

导致STM32芯片指令速度变化的问题分析过程.pdf

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
导致STM32芯片指令速度变化的问题分析过程

STM32 STM32 导致SSTTMM3322芯片指令速度变化的问题分析过程 过年那几天将一份代码从TI的LM3S8962 芯片移植到ST的STM32F103VB 芯片上, 结果发现了STM32 芯片指令速度会发生变化,本文将讲述这个问题的定位过程,从中你可 以看到作者根据问题的现象结合已有的知识,2次否定了出问题的地方,但随着逐步缩小定 位范围,认真分析现象,最终还是找回到了出问题的地方,并与网友讨论后,查找芯片手册 找到了问题的原因。本文的重点不在于介绍这个问题,而是在于介绍定位这个问题的思路以 及过程,很多问题通过仔细分析是可以找到原因的。 现象描述 下面这段延迟时间的函数在 LM3S8962 芯片上可以产生正确的延迟时间,但在 STM32F103VB 芯片上却表现出不确定性,有时候可以延迟正确的时间,而有时候则变为正 确时间的1.25倍。比如,输入200,正常的延迟时间是2000ms,而出现异常时这段代码则 运行了2500ms。 void DEV_DelayMs(U32 uiMs) { unsigned int i; unsigned int j; j = 5998 * uiMs; for(i = 0; ; i++) { if(i == j) { break; } } } 背景知识介绍 我写了2 个具有任务切换功能的小型操作系统,其中一个我称之为wanlix,需要函数主 动调用任务切换函数才能发生任务切换,只有这一个功能,功能虽少,但也非常小巧,编译 后只有几百字节,适合程序空间只有几十 K的小系统使用。另一个我称之为mindows,是 实时抢占式的内核,高优先级的任务会自动抢占低优先级的任务,支持信号量、队列等功能。 更多信息,请访问我的新浪博客/ifreecoding 其中DEV_DelayMs函数用来在任务中产生延迟,模拟任务的业务,其中mindows拥有 tick定时器,操作系统打印出的tick时间会反应出DEV_DelayMs 函数的执行时间。 LM3S8962芯片与STM32F103VB 芯片指令速度不一样,因此在移植这2个操作系统时 对DEV_DelayMs函数内的i、j数值做了精确的调整,并使用了O0(哦零,不优化)优化 选项,使之能产生精确的延迟。DEV_DelayMs 函数在 LM3S8962 芯片上工作正常,但在 STM32F103VB 芯片上却有时正常,有时异常。 原因分析 mindows操作系统的打印带有tick时间(每个tick是10ms),这个问题最先是在mindows 上发现的。程序中有一段2000ms的延迟,正常时,串口打印出这段延迟时间是2000ms, 如下所示: TaskTest1TaskTest2!Tickis: 200 Task2is running!Tickis: 200 但异常时打印却变成了2500ms,如下所示: TaskTest1TaskTest2!Tickis: 250 Task2is running!Tickis: 250 出现这个问题,有可能是tick时间不准,也有可能是DEV_DelayMs函数时间不准。在 运行时对比钟表的时间,发现tick 时间是准的,那么说明是DEV_DelayMs 函数时间不准。 既然是DEV_DelayMs函数不准,那么很可能是DEV_DelayMs 函数在编译时生成的汇 编指令不一样,导致DEV_DelayMs函数执行时间的长短不一样,而且,这个异常还伴随着 一个特点——异常与编译是相关的,也就是说编译后一旦出现异常,那么无论复位多少次, 异常一直出现,编译后一旦正常,那么无论复位多少次,均不会出现异常。这一点使我更加 坚信了是编译器编译出了不同的代码导致了问题。为了证明这一点,将正常和异常时的 DEV_DelayMs 函数进行反汇编,对比汇编代码,结果让我很失望,汇编代码完全一样(除 了函数跳转的绝对地址,但相对地址是一样的),这说明不是DEV_DelayMs函数的问题, 反汇编的代码如下: 正常的代码: 8019004: f241736e movw r3,#5998;0x176e 8019008: fb00f203 mul.w r2,r0,r3 801900c: f04f0300 mov.w r3,#0 8019

文档评论(0)

hhuiws1482 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5024214302000003

1亿VIP精品文档

相关文档