为什么例程中用从新定义指针变量指向定义好的寄存器而不直接使用定义好的寄存器来操作?
例如以下三个:
/* 发出命令 */
static void s3c2440_write_cmd(int cmd)
{
volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFCMD;
*p = cmd;
}
/* 发出地址 */
static void s3c2440_write_addr(unsigned int addr)
{
int i;
volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;
*p = addr & 0xff;
for(i=0; i<10; i++);
*p = (addr >> 9) & 0xff;
for(i=0; i<10; i++);
*p = (addr >> 17) & 0xff;
for(i=0; i<10; i++);
*p = (addr >> 25) & 0xff;
for(i=0; i<10; i++);
}
/* 读取数据 */
static unsigned char s3c2440_read_data(void)
{
volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFDATA;
return *p;
}
为什么不直接用这些定义好的寄存器来操作?
比如下面的:
/*发送命令*/
void s3c2440_write_cmd(int cmd)
{
s3c2440_nand->NFCMMD |= 0xff&cmd;
}
/*发出地址*/
void s3c2440_write_addr(unsigned int addr)
{
int i;
s3c2440_nand->NFADDR |= addr & 0xff;
for(i=0; i<10; i++);
s3c2440_nand->NFADDR |= (addr >> 9) & 0xff;
for(i=0; i<10; i++);
s3c2440_nand->NFADDR |= (addr >> 17) & 0xff;
for(i=0; i<10; i++);
s3c2440_nand->NFADDR |= (addr >> 25) & 0xff;
for(i=0; i<10; i++);
}
到底为什么?是不是有什么微妙之处在里面?
|