如何在不增加stacksize的情况下拆分C函数

时间:2018-06-10 14:16:31

标签: c refactoring inline compiler-optimization stack-size

在嵌入式系统设计中工作时,我经常遇到遗留代码,其中有人写了一些ISR,其中包含一个巨大的if / else-Jungle,有时会跨越多个屏幕长度。现在,我试图成为一名优秀的程序员,尝试重构函数,使用我学到的范例,其中一个是:"一个函数应该只做一件事"。

所以我将函数分解为多个静态子函数,它具有描述性名称和封装变量。但是因为我正在使用嵌入式设备,所以我需要考虑堆栈大小和跳转次数(特别是在可能经常被调用的ISR中,并且可能会被其他东西打断)。

现在,大多数(甚至所有)编译器都可以强制内联函数(因为__always_inline使用gcc)。但即使这会增加stacksize,如果我必须传递参数(它们不一定会被优化掉),即使每个参数只有几个字节。

现在我的实际问题是:在分解C中的函数时是否有办法不增加stacksize?

修改 让我的问题更清楚:这是一些代码的示例,我刚刚将一些代码转移到内联函数。

静态堆栈使用率为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;
    }
  }
}

0 个答案:

没有答案