求助:udelay()的怪问题?

leiyun121 2010-10-13 04:42:19
我在mips上移植了一个2.6.30的内核,但是在调试内核时,发现udelay()函数很奇怪,在init/main.c或其它核心代码中调用是正常的,但是在驱动程序中(编译进内核)调用udelay(1)却需要半分钟,调了好久都不知道是什么问题!请大虾们帮我指点指点。。。不胜感激。。。
...全文
352 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dfysy 2010-10-14
我估计是不是系统初始化的时候,HZ和timer的配置不太对,你在console上输命令sleep(1)看看是否是一秒后这个命令结束,如果不是的话,估计就是系统timer配置不对了。
回复
leiyun121 2010-10-14
并不是半分钟,我只是说个大概。

//在驱动nandflash驱动中或其它驱动中:
static int __init era_nand_init(void)
{
struct nand_chip *this;
int retval;
udelay(1);//这里将变的很慢(纠正:上面多了个s)
ndelay(1); //照样慢(纠正:上面多了个s)
...
}
回复
leiyun121 2010-10-14
下面是2.6.30中__udelay()函数的实现:
#include <linux/module.h>
#include <linux/param.h>
#include <linux/smp.h>

#include <asm/compiler.h>
#include <asm/war.h>

inline void __delay(unsigned int loops)
{
__asm__ __volatile__ (
" .set noreorder \n"
" .align 3 \n"
"1: bnez %0, 1b \n"
" subu %0, 1 \n"
" .set reorder \n"
: "=r" (loops)
: "0" (loops));
}
EXPORT_SYMBOL(__delay);

/*
* Division by multiplication: you don't have to worry about
* loss of precision.
*
* Use only for very small delays ( < 1 msec). Should probably use a
* lookup table, really, as the multiplications take much too long with
* short delays. This is a "reasonable" implementation, though (and the
* first constant multiplications gets optimized away if the delay is
* a constant)
*/

void __udelay(unsigned long us)
{
unsigned int lpj = current_cpu_data.udelay_val;

__delay((us * 0x000010c7 * HZ * lpj) >> 32);
}
EXPORT_SYMBOL(__udelay);

void __ndelay(unsigned long ns)
{
unsigned int lpj = current_cpu_data.udelay_val;

__delay((ns * 0x00000005 * HZ * lpj) >> 32);
}
EXPORT_SYMBOL(__ndelay);


这里是函数调用:
init\main.c
main()
{
...
calibrate_delay();
udelay(1); //这里调用正常
ndelay(1); //正常
...
}


在驱动nandflash驱动中或其它驱动中:
static int __init era_nand_init(void)
{
struct nand_chip *this;
int retval;
udelays(1);//这里将变的很慢
ndelays(1); //照样慢
...


求解????
回复
memoleak 2010-10-13
还是贴code吧,udelay的实现好像在mips上有些不一样.有一些是用HRT做的,有些有对参数的要求.
回复
deep_pro 2010-10-13
你怎么判断慢半分钟的啊

还有,顺带贴点代码
回复
leiyun121 2010-10-13
换用ndelay()也是一样的慢
回复
deep_pro 2010-10-13
udelay是忙等实现的,要是udelay的参数不大于1000 ,不会出现这种情况的
换用ndelay 看看是否依旧
回复
leiyun121 2010-10-13
不是中断中,也没有上锁,就是普通调用。
回复
deep_pro 2010-10-13
但是在驱动程序中(编译进内核)调用udelay(1)却需要半分钟
-----------------
具体调用位置,中断处理中?
回复
相关推荐
发帖
Linux_Kernel
创建于2007-08-27

4155

社区成员

Linux/Unix社区 内核源代码研究区
申请成为版主
帖子事件
创建了帖子
2010-10-13 04:42
社区公告
暂无公告