查看: 9782|回复: 4

s5pv210延时程序

11

主题

20

回帖

39

积分

bian.hu 发表于 2015-12-2 15:41:57 | 显示全部楼层 |阅读模式
s5pv210延时程序怎么写,没写过能提示下吗?
回复

使用道具 举报

2

主题

7

回帖

12

积分

zjl12006 发表于 2015-12-29 15:20:37 | 显示全部楼层
简延时还是精确延时?简单延时,用while循环就可以了。
精确延时的话,用定时器。(几年前玩51用过,ARM裸机还没玩过)汇编也可以做吧。一条指令一个时钟周期,跳转除外,跳转是三个时钟周期,然后自己去计算一下,这个我用过。下面这个是1GHz计算出来的udelay。
void _udelay(unsigned int nCount)
{
        __asm__ __volatile__(
        "000:\n"
        "ldr r1,=250\n"
        "111:\n"
        "subs r1,r1,#1\n"       //one arm clock
        "bne 111b\n"            //three arm clock
        "subs r0,r0,#1\n"
        "bne 000b\n"            //three arm clock
        );
}
点评回复 支持 反对

使用道具 举报

11

主题

20

回帖

39

积分

楼主| bian.hu 发表于 2016-1-21 16:02:01 | 显示全部楼层
static void Delay(int count)
{
            volatile int i, j = 0;
            volatile static int loop = 800000000/10000;
            for(;count > 0;count--)
                    for(i=0;i < loop; i++) { j++; }
}
count =10;这里的loop=8000000000/10000是怎么得出来的?
点评回复 支持 反对

使用道具 举报

2

主题

7

回帖

12

积分

zjl12006 发表于 2016-2-4 10:01:39 | 显示全部楼层
不用想了,ARM处理器应该只有用timer才能写出准确的延时程序。。通过这种for循环写的,都是尝试得到的大概数值。也就是说loop的值是尝试后得到的。ARM指令也不像51那样有固定的指令周期(所以,我上次的回复也有问题,后来才了解到的:( 。),经测试,打开icache和不开icache,运行速度相差很大。。。结论就是:这个loop值没什么意义,就是别人尝试后感觉这个值可满足他的需求。
点评回复 支持 反对

使用道具 举报

2

主题

7

回帖

12

积分

zjl12006 发表于 2016-2-4 10:08:25 | 显示全部楼层
所以,如果你不打算自己写定时器,那你就写一个类似的delay函数,尝试一个可满足自己需求的值就行了。
点评回复 支持 反对

使用道具 举报

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

本版积分规则