6931|30

74

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

问个简单问题,2440执行一条指令的时间是怎么算的? [复制链接]

我使用GPIO模拟IIC驱动程序。
搞了两天也不成功,
我怀疑是延时不精确
想问一下2440执行一条C语言指令的时间是怎么确定的?
比如
static void Delay(USHORT count)
{
        volatile int i, j = 0;
        volatile static int loop = S3C2440A_FCLK/100000;
        //RETAILMSG(1,(TEXT("S3C2440A_FCLK/100000=0x%x\r\n"),S3C2440A_FCLK/100000));
        //S3C2440A_FCLK/100000=0xfd2=4050会不会太大呢?
        for(;count > 0;count--)
                for(i=0;i < loop; i++) { j++; }
}

这是我模拟IIC使用的延时程序。

这个S3C2440A_FCLK是不是相当于51单片机的12M晶振的作用?

如果是这样那么2440执行一条C的指令应该是
(1/S3C2440A_FCLK)*12,我这样理解对吗?
请了解的人说一下。

我觉得我IIC模拟的不行极有可能是这样原因。

刚接触ARM几个月,发现好多不明白。

最新回复

多次循环,比如1000000次,用GetTickCount得到用掉的时间,再平均,不过这样不是很准  详情 回复 发表于 2010-4-14 16:24
点赞 关注

回复
举报

92

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没有人知道吗?

这个是驱动的基础啊?

我实在搞不定,才厚着脸皮发上来的,大家给点意见吧
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
拿示波器把波形抓下来分析一下,看到底是哪里的时序不对了了,再调整调整就可以啊
2440自己有标准的IIC接口,为什么要用GPIO来模拟呢?
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
选取UART0作为调试端口。
GPH2 and GHP3 are UART0 TXD0 and RXD0。

1. 修改C:\WINCE500\PLATFORM\SMDK2440\SRC\INC\bsp_cfg.h

#define BSP_DEVICE_PREFIX       "SMDK2440"        // Device name prefix

//------------------------------------------------------------------------------
// Board clock
//------------------------------------------------------------------------------

#define S3C2440A_FCLK           405000000           // 405MHz
#define S3C2440A_HCLK           (S3C2440A_FCLK/3)   // divisor 3
#define S3C2440A_PCLK           (S3C2440A_HCLK/2)   // divisor 6

#define BAUD_RATE               115200

//------------------------------------------------------------------------------
// Debug UART0
//------------------------------------------------------------------------------

#define BSP_UART0_ULCON         0x03                // 8 bits, 1 stop, no parity
#define BSP_UART0_UCON          0x0245              // Rx pulse interrupt, Tx level interrupt, Rx error status interrupt enabled.
#define BSP_UART0_UFCON         0x00                // disable FIFO
#define BSP_UART0_UMCON         0x00                // disable auto flow control, Inactivate nRTS
#define BSP_UART0_UBRDIV        (S3C2440A_PCLK/(BAUD_RATE*16) - 1)


 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
如果是这样那么2440执行一条C的指令应该是
(1/S3C2440A_FCLK)*12,我这样理解对吗?

这个好象有问题吧,每条C的指令转成汇编后有可能是几条指令,一般理解是要看汇编指令,执行不同的指令可能需要的时间也不一样,记得以前书上有说的
一般是1个或者2个或者4个Clock吧,具体的不记得了,没有仔细研究过
所以*12肯定是有问题的
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(中级)

6
 
引用 2 楼 hzdysymbol 的回复:
拿示波器把波形抓下来分析一下,看到底是哪里的时序不对了了,再调整调整就可以啊
2440自己有标准的IIC接口,为什么要用GPIO来模拟呢?


因为被占用了(可以接几个的,可惜电路这样画了。),并且,电路这样画,我也没有办法。

那个古董示波器,哎,估计不行。

不知道怎么回事,我的BSP在KITL过程中会断掉,

你使用过KITL吗?

我没有使用原来的eboot,而是优龙修改 的ADS环境的boot,据说KITL和bootloader有关系,是这样吗?
如果可以KITL,就什么都好办。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 hzdysymbol 的回复:
如果是这样那么2440执行一条C的指令应该是
(1/S3C2440A_FCLK)*12,我这样理解对吗?

这个好象有问题吧,每条C的指令转成汇编后有可能是几条指令,一般理解是要看汇编指令,执行不同的指令可能需要的时间也不一样,记得以前书上有说的
一般是1个或者2个或者4个Clock吧,具体的不记得了,没有仔细研究过
所以*12肯定是有问题的


在单片机中应该是(1/单片机晶振)*24

 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
wdw1600 ,你的优龙板子怎么变成5.0BSP了?
那个clock我知道是什么

什么时候买的?
你的手册上说支持KITL吗?

有人说ADS中要设置才能支持KITl。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(高级)

9
 
用过Kitl, kitl跟Bootloader没有什么关系的
没有示波器?那怎么用GPIO来模拟?怎么知道时序对不对,Faint
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

10
 
要是能KITL就好了。
上面正确的问法应该是执行一条汇编指令所需要的时间。
因为一条C可以生成几条汇编语句的。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

11
 
啊。那个不是我的板子,我是在网上搜的。我搞不来wince的,你说的我那个少写了一个周期指令到底是什么嘛?我真搞不明白,程序我已经调到执行bl Main了但是Main没有执行,估计是拷贝到内存里的有问题。我加到200分了,
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

12
 
对,只能算出汇编代码的执行时间,C语言不行。
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 yashi 的回复:
对,只能算出汇编代码的执行时间,C语言不行。

是啊.


我用逻辑分析仪测过时间的, 给你参考:
void static Delay(int cnt)
{
    volatile int i;
    for(;cnt>0;cnt--)
               for(i=0;i<133;i++);
}
这样的Delay(1)为117us , (S3C2440, 400MHZCPU, RAM为HCLK(133MHZ))
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

14
 
循环2000次吧
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 12 楼 eagle1597 的回复:
引用 11 楼 yashi 的回复:
对,只能算出汇编代码的执行时间,C语言不行。

是啊.


我用逻辑分析仪测过时间的, 给你参考:
void static Delay(int cnt)
{
    volatile int i;
    for(;cnt>0;cnt--)
      for(i=0;i <133;i++);
}
这样的Delay(1)为117us , (S3C2440, 400MHZCPU, RAM为HCLK(133MHZ))


哦,谢谢。搞这个东西真是郁闷透顶。没有KITL调试驱动是比较郁闷的事情。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

16
 
其实我只是把4.2下面的驱动的一部分放到5.0BSP下面,现在我发现代码没有什么可疑的地方,
后来我觉得可能是在运行程序的时候被打断了,导致IIC时序破坏。从而读不出ID。

有什么办法,在模拟IIC的过程中不让别的线程打断呢?
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

17
 
C是无法算时间的,如果用的库不一样或者是用的编译器不一样执行时间也是不一样的。特别是编译器对一些程序优化方法不同执行时间更差别大,这个我自己的理解不晓得对不对。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

18
 
既然不确定就先延时的够长一点试试,比如在原先的基础上延时时间×10。
不过最好还是有一台示波器,看看i2c设备晶振有没有正常工作,电源复位是不是正常打开,再量量输出的波形正不正常。
延时不会非常精确的,2440 wince50偶们的经验值是每ms800次循环。
另外担心模拟的i2c被其他线程打断完全没必要。i2c设备一般都是非常低速的设备,你真用2440标准i2c反而容易出问题。slc和sda的上下沿一般要错开一点时间的,2440上的标准i2c好像是无法控制这个时间,模拟的则不怕这个问题。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

19
 
用示波器看看吧。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

20
 
C是无法算时间的,如果用的库不一样或者是用的编译器不一样执行时间也是不一样的。特别是编译器对一些程序优化方法不同执行时间更差别大,这个我自己的理解不晓得对不对
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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