在从事嵌入式系统设计工作时,我经常遇到遗留代码,其中有人编写了一些 ISR,其中包含一个巨大的 if/else-Jungle,有时跨越多个屏幕长度。现在,为了成为一名优秀的程序员,我尝试重构函数,使用我学到的范例,其中之一是:“一个函数应该只做一件事”。
所以我将函数分解为多个静态子函数,它们具有描述性名称并封装变量。但是由于我正在使用嵌入式设备,因此我需要考虑堆栈大小和跳转次数(尤其是在可能经常调用并且本身可能被其他东西打断的 ISR 中)。
现在,大多数(甚至所有)编译器都可以强制内联函数(就像 __always_inline 对 gcc 所做的那样)。但即使这样也会增加堆栈大小,如果我必须传递参数(它们不一定会被优化掉),即使每个参数只有几个字节。
现在我的实际问题是:有没有办法在分解 C 中的函数时不增加堆栈大小?
编辑: 为了让我的问题更清楚:这是一些代码的示例,我只是将一些代码转换为内联函数。
静态堆栈使用量为 144(没有内联函数)和 160 个内联函数。
原来的:
#include <stdio.h>
#include <string.h>
int main(){
char inputString[100];
scanf("%s",inputString);
static char delimiterArray[] = {' ','+','-','/','*','='};
for(int i = 0; i<sizeof(inputString); i++){
printf("%c",inputString[i]);
char* inputChar = inputString + i;
for(int j = 0; j<sizeof(delimiterArray);j++){
if( *inputChar == delimiterArray[j]){
printf("DELIMITER: %c",delimiterArray[j]);
}
if(inputString[i] == '\0'){
printf("\nNuberOfChars: %d\n",i);
break;
}
}
}
return 0;
}
使用内联函数:
#include <stdio.h>
#include <string.h>
static inline void checkForDelimiters(char* inputChar)__attribute__((always_inline));
static inline void decomposeString(char* inputString)__attribute__((always_inline));
int main(){
char inputString[100];
scanf("%s",inputString);
decomposeString(inputString);
return 0;
}
static void checkForDelimiters(char* inputChar){
static char delimiterArray[] = {' ','+','-','/','*','='};
for(int j = 0; j<sizeof(delimiterArray);j++){
if(*inputChar == delimiterArray[j]){
printf("DELIMITER: %c",delimiterArray[j]);
}
}
}
static void decomposeString(char* inputString){
for(int i = 0; i<sizeof(inputString); i++){
printf("%c",inputString[i]);
checkForDelimiters(inputString+i);
if(inputString[i] == '\0'){
printf("\nNuberOfChars: %d\n",i);
break;
}
}
}