我正在为微控制器做一些代码,我需要根据函数指针查找数据(这些数据和函数将在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);
}
然而,为了实现这一点,myFunction1
,myFunction2
等需要在内存中一个接一个地布局(尽管不一定紧挨着彼此)。我需要使用-Os
编译所有内容以使其适合可用的ROM,因此如何确保函数实际保持正确的顺序?
...或者如果失败了,我怎么能重新订购mySearchData
以使其与函数的顺序相匹配?
关于我现在能想到的唯一事情是:
mySearchData
并再次编译 - 但是不能保证编译器是确定性的但这些都听起来不太好。