在一个微控制器程序中,我有一些指令,除了默认情况,我想为交换机中的每个案例执行一些指令.但是,我不想为每个案例编写函数调用或使用宏.
因为这适用于以3-7Mhz运行的微控制器,速度和代码空间非常重要.例如:
switch(letter)
{
case a:
ShowApple();
printf("You entered an english letter.");
break;
case b:
ShowBananna();
printf("You entered an english letter.");
break;
...
case z:
ShowZebra();
printf("You entered an english letter.");
break;
default:
printf("You did not enter an english letter. Silly human!");
break;
}
Run Code Online (Sandbox Code Playgroud) 在IAR C/C++编译器手册中,它声明编写优化友好的源代码:
避免使用&运算符获取局部变量的地址.由于两个主要原因,这是低效的.首先,变量必须放在内存中,因此不能放在处理器寄存器中.这会导致代码越来越大.其次,优化器不能再假设局部变量不受函数调用的影响.
还有哪些方法可以获取局部变量的地址?显然我知道,如果我有一个指向该变量的指针,我可以使用它,如果我有一个数组,我可以使用数组名称,但是我不知道任何其他方法来获取局部变量的地址而不是&运营商.
我正在调用一个通过指针参数返回变量的函数.我不关心这个参数的返回值,也不想让虚拟变量传递给函数.举一个简单的例子,假设函数如下,我不关心,也不想为参数"d"创建一个虚拟变量.
void foo(int a, int b, int* c, int* d)
{
*c = a+b;
*d = a+b+*c;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,NULL指针理论上是一个指向不是任何对象或函数地址的位置的指针.如果将NULL定义如下,那么在此函数中将NULL传递给"d"是否正确?或者这是否会改变内存中第0个元素的内容?
#define NULL ((void *)0)
Run Code Online (Sandbox Code Playgroud)
目标设备是MSP430,我正在使用IAR C. 没有使用操作系统,因此没有实现内存管理
编辑:请注意,我不想创建虚拟变量.此外,如果有一种方法可以欺骗编译器在不改变函数定义的情况下优化"d"参数,这是更可取的.
编辑#2:我宁愿不在函数调用中使用&运算符,因为它会生成我不想生成的低效代码
编辑#3:对于那些在我谈论&运算符时不相信我的人......编译器手册指出"避免使用&运算符来获取局部变量的地址.这主要有两个原因:效率低.首先,变量必须放在内存中,因此不能放在处理器寄存器中.这会导致代码越来越大.其次,优化器不能再认为局部变量不受函数调用的影响."