问题解决了,源头出在一个补丁函数:
void * microros_reallocate(void * pointer, size_t size, void * state){
return NULL; // 静态策略下通常不使用 realloc
}
简单来说,就是micro-ROS 试图申请或调整内存时,需要用到这个函数,而我的函数直接返回了NULL值,导致了micro-ROS 无法调整内存
为此,求助LLM,对函数做出以下修改:
void * microros_reallocate(void * pointer, size_t size, void * state){
// 情况 1: 如果指针为空,这就相当于 malloc (这是 Micro-ROS 初始化最常用的情况)
if (pointer == NULL) {
return pvPortMalloc(size);
}
// 情况 2: 如果大小为 0,这就相当于 free
if (size == 0) {
vPortFree(pointer);
return NULL;
}
// 情况 3: 真正的 realloc (调整大小)
// 由于 FreeRTOS 的 heap_4 不支持 realloc,我们需要手动“搬家”
// ⚠️ 警告:我们不知道旧数据块的大小,这是一个风险点。
// 但 Micro-ROS 通常用它是为了扩大数组。
// 这里的策略是:申请新内存 -> 假定旧数据有效 -> 释放旧内存
void * new_ptr = pvPortMalloc(size);
if (new_ptr != NULL) {
// 这里的拷贝长度是个玄学,因为我们不知道旧块有多大。
// 但对于 wait_set 这种结构,通常是安全的,或者我们可以只拷贝一部分。
// 为了安全起见,我们假设旧数据也很重要,拷贝 size 长度 (可能会读越界,但在 RAM 连续的 MCU 上通常没事)
// 更安全的做法是引入记录内存大小的机制,但太复杂。
// 这里采用最简单的“能跑就行”策略:
memcpy(new_ptr, pointer, size); // 注意:如果 size < old_size,会截断;如果 size > old_size,可能会读到垃圾数据
vPortFree(pointer);
}
return new_ptr;
}
重新编译烧录,问题解决