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毫秒。
阅读(483) | 评论(0) | 转发(0) |