GCC + C:在二进制文件中按顺序保存函数

时间:2015-08-14 15:33:01

标签: c gcc function-pointers microcontroller

我正在为微控制器做一些代码,我需要根据函数指针查找数据(这些数据和函数将在ROM中)。

我希望能够相对快速地完成这项工作,而无需使用RAM进行查找表。我能想到的最简单的方法就是进行二分搜索。

我只是将其作为一个例子,所以它可能会被打破,但希望你能得到这个想法:

void myFunction1() {}
void myFunction2() {}
void myFunction3() {}
void myFunction4() {}
// ...

typedef struct {
  void *functionPtr;
  int myData[10];
} SearchData;

const SearchData mySearchData[] = {
 { &myFunction1, ... },
 { &myFunction2, ... },
 { &myFunction3, ... },
 { &myFunction4, ... },
 // ...
};

void doBinarySearch(void *func, int min, int max) {
  if (max<min) return;
  int mid = (min+max)/2;
  if (func < mySearchData[mid].functionPtr)
    doBinarySearch(func, min, mid-1);
  else if (func > mySearchData[mid].functionPtr)
    doBinarySearch(func, mid+1, max);
  else {
    // we found it!
  }
}

void realBinarySearch(void *func) {
  doBinarySearch(func, 0, (sizeof(mySearchData)/sizeof(SearchData))-1);
}

然而,为了实现这一点,myFunction1myFunction2等需要在内存中一个接一个地布局(尽管不一定紧挨着彼此)。我需要使用-Os编译所有内容以使其适合可用的ROM,因此如何确保函数实际保持正确的顺序?

...或者如果失败了,我怎么能重新订购mySearchData以使其与函数的顺序相匹配?

关于我现在能想到的唯一事情是:

  • 构建整个事物,然后进行后处理步骤,对二进制文件中的数组进行排序 - 虽然非常不便携。
  • 构建一次,查看列表文件以找出函数的实际顺序,重写mySearchData并再次编译 - 但是不能保证编译器是确定性的

但这些都听起来不太好。

0 个答案:

没有答案