我正在尝试在启用 PSRAM 的 ESP32-S3 上的 PSRAM 中创建向量。 这是我的测试代码(使用 std=gnu++14)。
我可以:分配一些 PSRAM 内存,在 PSRAM 中创建一个向量,创建一个测试记录并将其添加到向量中并确认大小增加,从向量的开头删除记录并确认大小减少
但是我不知道如何读取矢量数据,请参阅中间注释掉的块。
struct EventRecord_t { // owned by MESH_ROOT
uint8_t node = 0;
uint8_t errorCount;
};
void eventsStart(){
void* eventsRam;
eventsRam = heap_caps_malloc(1000000, MALLOC_CAP_SPIRAM); // get memory from PSRAM
std::vector<EventRecord_t>* eventStack; // declare pointer to vector of struct
eventStack = (std::vector<EventRecord_t>*) eventsRam; // create vector in PSRAM
EventRecord_t eventRecord; // create record entry and populate it
eventRecord.node = 1;
eventRecord.errorCount = 34;
eventStack->push_back(eventRecord); // add record to eventstack
std::cout << "Size: " << eventStack->size() << std::endl; // confirm size is increasing
eventRecord.node = 2;
eventStack->push_back(eventRecord);
std::cout << "Size: " << eventStack->size() << std::endl;
eventRecord.node = 3;
eventStack->push_back(eventRecord);
std::cout << "Size: " << eventStack->size() << std::endl;
// how to access eventStack data here;
// eventRecord = eventStack[0];
// uint8_t inode = eventStack[0]->node;
eventStack->erase(eventStack->begin()); // delete first record from eventStack
std::cout << "Size: " << eventStack->size() << std::endl; // confirm size is increasing
eventStack->erase(eventStack->begin());
std::cout << "Size: " << eventStack->size() << std::endl;
eventStack->erase(eventStack->begin());
std::cout << "Size: " << eventStack->size() << std::endl;
free(eventsRam);
}
输出:
Size: 1
Size: 2
Size: 3
Size: 2
Size: 1
Size: 0
你需要编写自己的分配器
template <typename T>
class SPIRamAllocator {
public:
using value_type = T;
SPIRamAllocator() = default;
template <typename U>
constexpr SPIRamAllocator(const SPIRamAllocator<U>&) noexcept {}
[[nodiscard]] T* allocate(std::size_t n) {
// Allocate memory using heap_caps_malloc with MALLOC_CAP_SPIRAM
T* ptr = static_cast<T*>(heap_caps_malloc(n * sizeof(T), MALLOC_CAP_SPIRAM));
if (!ptr) {
/* do something */
}
return ptr;
}
void deallocate(T* ptr, std::size_t) noexcept {
// Free the allocated memory
heap_caps_free(ptr);
}
};
template <typename T, typename U>
bool operator==(const SpirAMAllocator<T>&, const SpirAMAllocator<U>&) {
return true;
}
template <typename T, typename U>
bool operator!=(const SpirAMAllocator<T>&, const SpirAMAllocator<U>&) {
return false;
}
然后就可以使用它了:
std::vector<int, SpirAMAllocator<int>> vec;
这个分配器不太好,但它只是展示如何编写它们。您可能想要为向量提供最大大小、分配更大的块或结合任何其他方法。