- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)