QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2153|回复: 5

一个EGui的BUG,和系统tick说明

[复制链接]
发表于 2006-5-20 10:13:47 | 显示全部楼层 |阅读模式
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有些阐述并没有经过专业文档验证。请谅解。
 楼主| 发表于 2006-5-20 10:20:35 | 显示全部楼层
关于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,可以提高性能!记住了!
回复

使用道具 举报

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

使用道具 举报

发表于 2006-5-21 02:23:42 | 显示全部楼层
其实timeout机制可以利用fcntl上锁和select或pselect来改为实时机制,
以便有时可留一些cpu的空间给其它进程或线程,10毫秒的时间其实可以
做很多事情的,当然,您示例的程序耗费可能不到1毫秒。
回复

使用道具 举报

 楼主| 发表于 2006-5-21 14:37:35 | 显示全部楼层
我在kernel部分实现的,您说的是用户部分。
回复

使用道具 举报

 楼主| 发表于 2006-5-21 14:38:52 | 显示全部楼层
[quote:47c22b7298="AnthonyLee"]建议把画鼠标形状移到egui.ko,这样处理起来可能比较简单,
而且通常16x16甚至32x32的点素图不会耗费太多的性能,
client想要改变形状的话让它发event,但可能带来的是内核模块
和绘图客户进程的同步更新问题。[/quote]

这个问题。我也是这么考虑过的。
我是有这个计划。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-2 16:31 , Processed in 0.039345 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表