在嵌入式系统上将数组排序功能从 C++ 移植到 C
Porting array sorting function from c++ to c on embedded system
我尝试将以下 C++ 排序函数移植到 C,但现在我的嵌入式系统在尝试使用我的新 C 函数进行排序时遇到硬故障错误。
该函数大约每秒调用一次,有趣的是,排序工作的第一个循环,它总是在第二次迭代期间崩溃。
C++代码:
typedef struct featureData {
float Value[NO_OF_ATT];
float Distance;
bool operator < (const featureData& rhs) const {
return Distance < rhs.Distance;
}
} featureData;
std::sort(trainData, trainData+NO_OF_TRAINDATA);
C代码:
int compare_function(const void *a,const void *b)
{
featureData *x = (featureData *) a;
featureData *y = (featureData *) b;
if ( x->Distance > y->Distance ) return 1;
if ( x->Distance < y->Distance ) return -1;
return 0;
}
qsort(trainData, NO_OF_TRAINDATA, sizeof(*trainData), compare_function);
更多信息:
NO_OF_TRAINDATA = 609
NO_OF_ATT = 22
如果我将 NO_OF_TRAINDATA 设置为小于 50,则 C 函数 运行s 没有任何问题。这让我相信这是一些内存大小问题,因为我经常 运行 进入我的嵌入式系统的内存问题。
但是 C 快速排序(或调用 qsort 使用的任何东西)在内存分配方面是否与 std::sort 不同?
我发现了问题:
我是 运行 FreeRTOS,并错误地认为 freeRTOS 中的任务正在系统堆栈上分配它的堆栈内存。
我的意思是 FreeRTOS 内部堆栈实际上是在我设备的堆上分配的。
显着增加设备堆后 运行 没有任何问题。
但我想知道 std::sort 和 qsort() 之间的区别,一个是使用较小的 FreeRTOS 堆栈,而另一个不是。我假设 qsort() 具有更高的内存占用量,导致 stack/heap 溢出。
我尝试将以下 C++ 排序函数移植到 C,但现在我的嵌入式系统在尝试使用我的新 C 函数进行排序时遇到硬故障错误。 该函数大约每秒调用一次,有趣的是,排序工作的第一个循环,它总是在第二次迭代期间崩溃。
C++代码:
typedef struct featureData {
float Value[NO_OF_ATT];
float Distance;
bool operator < (const featureData& rhs) const {
return Distance < rhs.Distance;
}
} featureData;
std::sort(trainData, trainData+NO_OF_TRAINDATA);
C代码:
int compare_function(const void *a,const void *b)
{
featureData *x = (featureData *) a;
featureData *y = (featureData *) b;
if ( x->Distance > y->Distance ) return 1;
if ( x->Distance < y->Distance ) return -1;
return 0;
}
qsort(trainData, NO_OF_TRAINDATA, sizeof(*trainData), compare_function);
更多信息:
NO_OF_TRAINDATA = 609
NO_OF_ATT = 22
如果我将 NO_OF_TRAINDATA 设置为小于 50,则 C 函数 运行s 没有任何问题。这让我相信这是一些内存大小问题,因为我经常 运行 进入我的嵌入式系统的内存问题。 但是 C 快速排序(或调用 qsort 使用的任何东西)在内存分配方面是否与 std::sort 不同?
我发现了问题: 我是 运行 FreeRTOS,并错误地认为 freeRTOS 中的任务正在系统堆栈上分配它的堆栈内存。 我的意思是 FreeRTOS 内部堆栈实际上是在我设备的堆上分配的。 显着增加设备堆后 运行 没有任何问题。
但我想知道 std::sort 和 qsort() 之间的区别,一个是使用较小的 FreeRTOS 堆栈,而另一个不是。我假设 qsort() 具有更高的内存占用量,导致 stack/heap 溢出。