OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15019|回复: 6

一句代码运行时间是多少?

[复制链接]

96

主题

247

帖子

1

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2012-6-29
在线时间
0 小时
发表于 2012-10-16 21:54:35 | 显示全部楼层 |阅读模式
72MHz的MCU(原子的开发板)
运行一个代码,时间范围是多少?
假设一个单位是1/72MHz(振荡周期),那么一个代码大概运行多少单位(振荡周期)?
http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4666068
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2198
金钱
2198
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-10-17 00:42:50 | 显示全部楼层
stm32 的 programming manual 里面好有讲指令集的,有讲每条指令对应的时间,可以把你的代码反汇编出来,可以查出大概的时间,

但是有些指令的执行时间是不确定的,因为比较高级的CPU内部都有流水线,分支预测的结果会影响到指令的执行时间的,

其实一般是不需要去关注这个问题的,ns 级延时的之类的事情,我认为是不适合用 STM32 做的
https://github.com/roxma
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-10-16 21:59:52 | 显示全部楼层
看汇编,然后找到每个指令的运行周期,之后就可以计算时间了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

96

主题

247

帖子

1

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2012-6-29
在线时间
0 小时
 楼主| 发表于 2012-10-16 23:43:36 | 显示全部楼层
其他人,也给点建议啊,别老是几百人看过了,都没留下脚印............. 呵呵
http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4666068
回复 支持 反对

使用道具 举报

5

主题

53

帖子

4

精华

高级会员

Rank: 4

积分
675
金钱
675
注册时间
2010-12-14
在线时间
8 小时
发表于 2012-10-17 00:27:56 | 显示全部楼层
 这个不好说,现在大家多数用C编程,不同的语句,编译器汇编出来的汇编也不同,而不同汇编指令的指令周期也不一样。
指令周期倒是比较容易查,但汇编结果好像不好查。
所以光问一句代码的时间确实不好回答。
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2198
金钱
2198
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-10-17 00:33:47 | 显示全部楼层
回复【4楼】QiYuan:
---------------------------------
咦,师兄貌似好久没出现过了
https://github.com/roxma
回复 支持 反对

使用道具 举报

96

主题

247

帖子

1

精华

高级会员

Rank: 4

积分
801
金钱
801
注册时间
2012-6-29
在线时间
0 小时
 楼主| 发表于 2012-10-17 19:08:54 | 显示全部楼层
回复【6楼】Pony279:
---------------------------------
奇怪,我就是因为一个原子的窗口看门狗的实验,遇到问题。就是我在窗口上限值--0x40的区间喂狗,却老是出现复位的现象.......

主程序:
int main(void)
{
int x=2;
   Stm32_Clock_Init(9); //系统时钟设置
delay_init(72);      //延时初始化
// uart_init(72,9600);  //串口初始化 
LED_Init();     //初始化与LED连接的硬件接口
LED0=0;
delay_ms(100);
if(x==2)
{
LED0=1;
delay_ms(100);
x=3;
}   
WWDG_Init(0X7F,0X5F,3);//计数器值为7f,窗口寄存器为5f,分频数为8
// WWDG_Feed();    
//  while(1) 
// {
// LED0=1;       
// }  
}

中断响应程序:
int i = 0;
void WWDG_IRQHandler(void)
{     
// u8 wr,tr;  
// wr=WWDG->CFR&0X7F;
// tr=WWDG->CR&0X7F;
// if(tr<wr)WWDG_Set_Counter(WWDG_CNT);//只有当计数器的值,小于窗口寄存器的值才能写CR!!        
WWDG->SR=0X00;//清除提前唤醒中断标志位
for(i =0;i<100;i++)
{
WWDG_Set_Counter(WWDG_CNT);
WWDG->SR=0X00;
// delay_ms(100);
LED1=!LED1;
}
}

这样的程序,按理说,LED0的值只变一次,LED1一直跳动,但实际上是LED0和LED1轮流闪烁。。。。。。LED0也一直闪烁,说明程序一直在复位。
实际试验表明,当看门狗中断,清除了中断后,看门狗会继续向复位前进......
http://blog.tianya.cn/blogger/blog_main.asp?BlogID=4666068
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 11:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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