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代码。
代码上下文(前):
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代码。
相关文章推荐
- C/C++位域(Bit-fields)操作的问题
- NKOI 1321--数列操作问题(裸BIT)
- jquery Firefox3.5中操作select的问题
- bit操作 转
- .net操作excel 注意的问题 和步骤
- poi导入xls表格老版本问题解决,写入文件,删除文件操作
- C++中对字符串或文件的操作函数,结尾的问题(持续补充)
- linuxOS权限问题,导致php对文件操作报错
- 位域操作--将帅问题的位域求解
- 迷宫问题_按要求操作
- C#操作文件的相关设置问题
- Python操作Mysql中文乱码问题
- javascript 操作 ListBox 的问题
- Cocoapods 64-bit(iPhone5s) 问题解决方案
- (转)解决“Internet Explorer 无法打开 Internet站点已终止操作”问题
- 解决java和.NET互相操作memcache差异问题
- python 常见面试问题(3)-单例模式/lambda函数/类型转换/文件操作/查询和替换/Fibonacci数列
- 操作win8系统时遇到无法拖动桌面图标问题的解决方法
- 如何避免spark dataframe的JOIN操作之后产生重复列(Reference '***' is ambiguous问题解决)
- 数据库操作中容易出现的问题及相关安全机制