像这样“聪明地”调用相应的函数吗 可行噶?解决思路
像这样“聪明地”调用相应的函数吗 可行噶?
char Uart_Getch(void)
{
if(whichUart==0)
{
while(!(rUTRSTAT0 & 0x1)); //Receive data ready
return RdURXH0();
}
else if(whichUart==1)
{
while(!(rUTRSTAT1 & 0x1)); //Receive data ready
return RdURXH1();
}
else if(whichUart==2)
{
while(!(rUTRSTAT2 & 0x1)); //Receive data ready
return RdURXH2();
}
}
这是原来的函数,我觉得有点罗嗦。想这样改进下,首先定义两个宏,把寄存器的名和号绑定到一起。比如:#define SelectTR( FuncName,UartNum) FuncName##UartNum
#define WaitReady(regvalue,mask) while(!(regvalue & mask)) 这样,就可以不用这些分支了。
上面的程序可以写成 char Uart_Getch(void){
WaitReady(SelectTR(rUTRSTAT,whichUart),0x1);
但是,这里怎么写呢?我怎么选择相应的函数呢?
return ???
我可以把函数名也绑定到对应的号上,如SelectTR (RdURXH,whichUart),但我该怎样调用它呢?
}
------解决方案--------------------
typedef char (*RDURXH_FUNC)(void);
RDURXHFUNC SelectFunc(int whichUart) {
switch(whichUart) {
case 0:
return RdURXH0;
case 1:
return RdURXH1;
case 2:
default:
return RdURXH2;
}
}
……
WaitReady(SelectTR(rUTRSTAT,whichUart),0x1);
return SelectFunc(whichUart)();
char Uart_Getch(void)
{
if(whichUart==0)
{
while(!(rUTRSTAT0 & 0x1)); //Receive data ready
return RdURXH0();
}
else if(whichUart==1)
{
while(!(rUTRSTAT1 & 0x1)); //Receive data ready
return RdURXH1();
}
else if(whichUart==2)
{
while(!(rUTRSTAT2 & 0x1)); //Receive data ready
return RdURXH2();
}
}
这是原来的函数,我觉得有点罗嗦。想这样改进下,首先定义两个宏,把寄存器的名和号绑定到一起。比如:#define SelectTR( FuncName,UartNum) FuncName##UartNum
#define WaitReady(regvalue,mask) while(!(regvalue & mask)) 这样,就可以不用这些分支了。
上面的程序可以写成 char Uart_Getch(void){
WaitReady(SelectTR(rUTRSTAT,whichUart),0x1);
但是,这里怎么写呢?我怎么选择相应的函数呢?
return ???
我可以把函数名也绑定到对应的号上,如SelectTR (RdURXH,whichUart),但我该怎样调用它呢?
}
------解决方案--------------------
typedef char (*RDURXH_FUNC)(void);
RDURXHFUNC SelectFunc(int whichUart) {
switch(whichUart) {
case 0:
return RdURXH0;
case 1:
return RdURXH1;
case 2:
default:
return RdURXH2;
}
}
……
WaitReady(SelectTR(rUTRSTAT,whichUart),0x1);
return SelectFunc(whichUart)();