5524|19

94

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

函数消耗时间问题 [复制链接]

小弟目前在优化BootLoader,减少启动时间,我使用OALGetTickCount()来测量每个函数的消耗时间来决定怎么优化,但是在使用OALGetTickCount()的时候,出现了不解的现象,如下:
[code]
BOOL OEMPlatformInit()
{
   UINT32 nStartTime;
   UINT32 nStopTime;
   nStartTime = OALGetTickCount();
   ........
   ........
   nStopTime = OALGetTickCount();
   RETAILMSG(1,(TEXT("OEMPlatformInit Spend time is %ld ms.\r\n"),nStopTime-nStartTime));
}

但是在DNW中打印出来的是:OEMPlatformInit Spend time is -46 ms.

不知道问题出现在哪里。。
在帮助文档里找到OALGetTickCount()的解释:
This function returns the number of 1-millisecond ticks that have elapsed since the last system boot or reset.

UINT32 OALGetTickCount();

Remarks
The tick counter can overflow, but the overflow period should be approximately 30 seconds or more.

Because this function is used during system boot, it must be called before the interrupt subsystem is active.



最新回复

请问是怎么做到的呢?mult-bin?  详情 回复 发表于 2009-11-24 12:46
点赞 关注

回复
举报

59

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
函数的执行只要是不是大型的copy,或者等待都是纳秒级别的。。。用这个函数估计不行吧。。这个函数最小是1微秒
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 unsway123 的回复:
函数的执行只要是不是大型的copy,或者等待都是纳秒级别的。。。用这个函数估计不行吧。。这个函数最小是1微秒

那就没有办法测试了吗??
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
问题不在这里
而在bin文件 TOC等 组织信息的读取很费事,这是eboot启动慢 的原因。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 gooogleman 的回复:
问题不在这里
而在bin文件 TOC等 组织信息的读取很费事,这是eboot启动慢 的原因。


我的ADS bootloader 烧写nb0文件 没有TOC的东西启动在10s以内。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
Bootloader 像是一个 firmware, 绝大多数的 win32api 是都没有 implement 的.

LZ 想要用 OALGetTickCount, 必须先确定该函数在 bootloader 中有某个地方有正确地 definition.

Paul, Chao @ Techware
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

7
 
测试函数的消耗时间?好主意,但是我没有试过,因为ARM处理机器指令都是每秒百万级,只要不是延迟和死循环应该可以说的上是很快的吧!至于你想减少启动时间建议从其他方面入手!
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 2 楼 hao507 的回复:
引用 1 楼 unsway123 的回复:
函数的执行只要是不是大型的copy,或者等待都是纳秒级别的。。。用这个函数估计不行吧。。这个函数最小是1微秒

那就没有办法测试了吗??


不管从哪方面入手优化,都是需要测试时间的。告诉楼主一个比较准确的测试时间的方法,一般人我不告诉他哦:
在测试代码段的前后修改某一I/O口的输出电平,然后用视波器抓取两次电平变化的间隔。虽然I/O操作有点慢,但对于代码优化测试来说,还算可以接受了。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 haierpro 的回复:
引用 2 楼 hao507 的回复:
引用 1 楼 unsway123 的回复:
函数的执行只要是不是大型的copy,或者等待都是纳秒级别的。。。用这个函数估计不行吧。。这个函数最小是1微秒

那就没有办法测试了吗??


不管从哪方面入手优化,都是需要测试时间的。告诉楼主一个比较准确的测试时间的方法,一般人我不告诉他哦:
在测试代码段的前后修改某一I/O口的输出电平,然后用视波器抓取两次电平变化的间隔。虽然I/O操作有点慢,但对于代码优化测试来说,还算可以接受了。

不错的办法~~示波器的值还是比较准确的。
其实我并不是要得到非常精确的时间,我只是想得到一个大概的时间,然后看哪个模块比较费时,然后进行优化~~希望大家多给我出出主意
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

10
 
楼主可以打印出StartTime,Stoptime的值,看看是怎么回事,
还可以用这个函数测试每一个函数的执行时间。
然后根据时间间隔来判定到底是哪个函数执行的时间较长
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

11
 
先看看有没有实现那个时间函数吧
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

12
 
OEMPlatformInit函数要完成时钟的初始化,你确认在调用OALGetTickCount的时候这部分工作做完了么?
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 ruritanian 的回复:
OEMPlatformInit函数要完成时钟的初始化,你确认在调用OALGetTickCount的时候这部分工作做完了么?

我仔细查看下~~谢谢楼上的兄弟们~
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

14
 
引用 10 楼 guopeixin 的回复:
先看看有没有实现那个时间函数吧


函数实现如下:
[code]
UINT32
OALGetTickCount(
    )
{
    OMAP_GPTIMER_REGS *pGPTimerRegs = OALPAtoUA(OMAP_GPTIMER1_REGS_PA);
    return INREG32(&pGPTimerRegs->TCRR) >> 5;
}
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

15
 
楼主,上面得函数实现看来是使用了CPU的计数器Timer,你检查一下计数器的初始化是否正确?你程序本身使用计数器计时是正确没有问题的。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(中级)

16
 
我这两天也在看启动时间的问题,不过,个人觉得BOOT的启动优化效果是有限的。
一般BOOT的启动都会在1S内完成,更多的时间是加载NK和驱动。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

17
 
引用 14 楼 suck666 的回复:
楼主,上面得函数实现看来是使用了CPU的计数器Timer,你检查一下计数器的初始化是否正确?你程序本身使用计数器计时是正确没有问题的。

找到出现问题的地方了,我使用OALGetTickCount()的地方,还没有初始化定时器呢~~嘿嘿,犯了一个弱智的错误~~
现在还有一处不明白的地方,在OALGetTickCount()函数里,
UINT32
OALGetTickCount(
    )
{
    OMAP_GPTIMER_REGS *pGPTimerRegs = OALPAtoUA(OMAP_GPTIMER1_REGS_PA);
    return INREG32(&pGPTimerRegs->TCRR) >> 5;
}
读出寄存器的值,为什么还要右移5位呢?

datasheet是这样藐视这个寄存器的:
31:0 TIMER_COUNTER The value of the timer counter register RW 0x00000000
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

18
 
引用 15 楼 sunrain_hjb 的回复:
我这两天也在看启动时间的问题,不过,个人觉得BOOT的启动优化效果是有限的。
一般BOOT的启动都会在1S内完成,更多的时间是加载NK和驱动。

是的啊,我粗略的测试了下,从Flash里读取内核的时间花费了5S!!基本上都是这地方占用的时间~~
不知道有没有什么好的方法?
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

19
 
建议楼主不要在BOOT里继续做类似的尝试了,这里优化的效果基本上是感觉不到的。如果有明显的停顿才值得去跟一下,如果没有,还是从别的地方入手。
加载NK的时间要看具体硬件平台,我的平台上加载40M的NK.nb0,2S多一点。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

20
 
引用 18 楼 sunrain_hjb 的回复:
建议楼主不要在BOOT里继续做类似的尝试了,这里优化的效果基本上是感觉不到的。如果有明显的停顿才值得去跟一下,如果没有,还是从别的地方入手。
加载NK的时间要看具体硬件平台,我的平台上加载40M的NK.nb0,2S多一点。

请问是怎么做到的呢?mult-bin?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表