我有一个指向内存映射设备的全局指针,初始化如下:
volatile char *base_address = (char *) 0xa0000000;
在程序执行期间,我有一个switch语句,并根据输入而定 必须调整base_address指针,如下所示:
switch (input) {
case 'S':
base_address = (char *) 0xa0001000;
InitDevice();
break;
case 'A':
base_address = (char *) 0xa0001000;
InitDevice();
break
TBH,这看起来像是一个肮脏的黑客,将base_address传递给函数InitDevice((char *) 0xa0001000)
可能更好。后者是否是正确的方法或是否有更好的方法?
非常感谢, 亚历
答案 0 :(得分:5)
是的,显式地将所需参数传递给函数总是比通过全局变量传递它更好。
在嵌入式环境中,您可能必须考虑使用参数调用函数可能需要将参数压入堆栈并以其他方式弹出(除非编译器优化并将其传递到寄存器中)。但我不会基于此进行优化,除非我已经建立(通过测量)速度增益实际上值得污染代码 (并且由于您的示例是切换输入,与堆栈操作相比通常会以冰川速度进行切换,因此无论如何这都应该不是问题。)
然而,正如Lars在评论中所说的那样,如果这些文字地址被符号常量取代可能会更好:
volatile char* const A_base_address = (char *) 0xa0001000;
volatile char* const S_base_address = (char *) 0xa0001000;
switch (input) {
case 'S':
InitDevice(S_base_address);
break;
case 'A':
InitDevice(A_base_address);
break;