您的位置:首页 > 其它

bit操作的问题

2009-11-06 14:23 148 查看
文件:peacock/drv/hisi-sci/iti_sci_driver.c

代码上下文(前):
reg1 = readl(IO_ADDRESS(SCI_SCTRL1));

修改历史记录:
1.2.2.1
reg1 |=(0 <<18 );
1.2.2.2
reg1 |=~(0 <<18 );
1.2.2.3
reg1 |=~(1 <<18 );
1.2.2.4
reg1 |=(1 <<18 );
1.2.2.5
reg1 &=~(1 <<18 );

代码上下文(后):
writel(reg1,IO_ADDRESS(SCI_SCTRL1));

以上是关于一个寄存器的操作,前后修改了5版,历时将近2个月才最终改正确,我们分析一下问题在什么地方?

如1.2.2.1的操作,或上一个0肯定是一个空操作,即便不是错误,也是要值得怀疑一下的。
如1.2.2.2的操作,等同于reg1=0xFFFFFFFF,完全没必要借助BIT18、借助位操作(位或)来写这样的代码。
如1.2.2.3的操作,等同于reg1|=0xFFFBFFFF,一下子设置31个位不符合编程习惯:在位操作时,一般都是对单独的、或少量的几个BIT组合操作。
即只有
reg1 |= (BIT1 | BIT2, ...);
reg1 &= ~(BIT1 | BIT2, ...); 这两种操作习惯。(无论是置位还是清0,要操作的位是显式的)
而不应有
reg1 |= ~(BIT1 | BIT2, ...) ; 这种操作习惯。(要操作的位是隐式的)
如1.2.2.4的操作,则是没有和厂家沟通的一种尝试(CVS comment log: just a try)。

因为关于芯片寄存器的每一bit的定义和操作,芯片厂家最清楚,我们要听他们的建议,但是又不能盲从。
因为和我们打交道的很可能不是设计人员,而是FAE。FAE出现纰漏的可能性相对大一些。
在上面的例子中,有几处就是非常明显的错误,我们即使没有任何相关的硬件知识,全凭编程常识,也是可以做出怀疑和判断的。

总结一下,两点:
1)养成良好的编程习惯有助于发现不规范的代码,从而能快速的从中发现疑点、找到问题或隐患。
2)拿到别人的代码、修改时要多读一下,抱着怀疑、审慎、负责的态度来merge、commit代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: