Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1409016
  • 博文数量: 430
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4388
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 18:04
文章存档

2013年(1)

2008年(2)

2007年(14)

2006年(413)

分类:

2006-06-01 12:45:27

1.隐藏光标
在EGui里光标从一个窗口A移到另一个窗口B,需要做如下动作。
隐藏A窗口光标,显示B窗口光标。
为了防止同时出现2个光标,在B显示前,需要等待A关闭。在kernel里做了10毫秒的等待。

我现在的做法是使用jiffies.

2.使用jiffies
初始化时我给变量timeout = jiffies,
当鼠标移动时判断 timeout + 1(10毫秒) > jiffies
程序如下:
WAIT_TIME = 1; (10毫秒)
while( ( timeout + WAIT_TIME) > jiffies);
这个程序正常情况下没有问题。

3. BUG的产生
jiffies 一般是一个unsigned long,
不应该为负值,如果为负值就相当月0xFFFFFFFF - 该值。
而恰恰系统给与初始化为-300 *HZ ,5分钟。

4.所以当启动后5分钟内启动EGui会产生
 while( ( timeout + WAIT_TIME) > jiffies);
 死循环。

5.bug修改和申明
 if ((timeout + WAIT_TIME)> jiffiess)
{mdelay(10);
timeout = jiffies;
}
这样绝对不会死机。

 上述BUG,里对jiffies有些阐述并没有经过专业文档验证。请谅解。

关于jiffies:

i386 在
arch/i386/kernel/vmlinux.lds里定义
让我费了很多功夫才找到,
jiffies = jiffies_64;

jiffies_64 在 arch/i386/kernel/time.c里
jiffies_64 = INITIAL_JIFFIES;
INITIAL_JIFFIES = -300 * HZ ;// 5分钟。

这里jiffies_64 为u64,
而jiffies 在vmlinux.lds里定义,我不知道这种定义它应该为u64,还是u32.

但是只要是unsigned的,我个人认为就不应该定义为-300 * HZ;
不知道这个实现到底是为什么?

这也许是我产生BUG的主要原因,
不过我程序本身也有责任。呵呵!


再谈delay

在kernel里使用delay
有udelay,mdelay
系统解释说5msec以下用udelay,可以提高性能!记住了!

建议把画鼠标形状移到egui.ko,这样处理起来可能比较简单,
而且通常16x16甚至32x32的点素图不会耗费太多的性能,
client想要改变形状的话让它发event,但可能带来的是内核模块
和绘图客户进程的同步更新问题。

其实timeout机制可以利用fcntl上锁和select或pselect来改为实时机制,
以便有时可留一些cpu的空间给其它进程或线程,10毫秒的时间其实可以
做很多事情的,当然,您示例的程序耗费可能不到1毫秒。

阅读(443) | 评论(0) | 转发(0) |
0

上一篇:窗口裁减计算

下一篇:色彩王国

给主人留下些什么吧!~~