701 PSRAM 常见接口
📎 原始文档:https://www.kdocs.cn/l/cknCFtBNSHIj 701 PSRAM 常见接口
- 配置
701 芯片A6s 和A7s 带内置psram ,TCFG_PSRAM_DEV_ENABLE 打开 , 默认配置128Mhz 即可
- 常见接口
(1) 参考原本sdk psram_api.h 中的用法
extern void *malloc_psram(size_t size);
extern void free_psram(void *pv);
(2)psram的realloc
#define portBYTE_ALIGNMENT 4
#define portBYTE_ALIGNMENT_MASK ( 0x0003 )
#define HEAP_SANITY_CHECK 1
typedef struct A_BLOCK_LINK {
#if (HEAP_SANITY_CHECK)
int magic_a;
#endif
struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */
size_t xBlockSize; /*<< The size of the free block. */
#if (HEAP_SANITY_CHECK)
int magic_b;
#endif
} BlockLink_t;
/* The size of the structure placed at the beginning of each allocated memory
block must by correctly byte aligned. */
static const size_t xHeapStructSize = (sizeof(BlockLink_t) + ((size_t)(portBYTE_ALIGNMENT - 1))) & ~((size_t) portBYTE_ALIGNMENT_MASK);
static const size_t xHeapUsedStructSize = (sizeof(BlockLink_t) - sizeof(void *) + ((size_t)(portBYTE_ALIGNMENT - 1))) & ~((size_t) portBYTE_ALIGNMENT_MASK);
static const size_t xBlockAllocatedBit = (8 * 1024 * 1024); //Max Bulk Limit
void *psram_user_Realloc(void *pv, size_t xWantedSize)
{
uint8_t *puc = (uint8_t *) pv;
BlockLink_t *pxLink;
size_t xValueSize;
void *pvReturn = NULL;
if (pv != NULL) {
/* The memory being freed will have an BlockLink_t structure immediately
before it. */
puc -= xHeapStructSize;
/* This casting is to keep the compiler from issuing warnings. */
pxLink = (void *) puc;
if ((pxLink->xBlockSize & xBlockAllocatedBit) == xBlockAllocatedBit) {
/* if (pxLink->pxNextFreeBlock == NULL) { */
/* The block is being returned to the heap - it is no longer
allocated. */
xValueSize = (pxLink->xBlockSize & ~xBlockAllocatedBit) - xHeapStructSize;
/* printf("0x%x - %d byte (%d, %d)", pv, xValueSize, pxLink->xBlockSize & ~xBlockAllocatedBit, xHeapUsedStructSize); */
if (xValueSize >= xWantedSize) {
pvReturn = pv;
} else {
pvReturn = malloc_psram(xWantedSize);
ASSERT(pvReturn);
if (pvReturn) {
memcpy(pvReturn, pv, xValueSize);
free_psram(pv); //此处可以再优化,直接调用prvMergeBlockIntoFreeList
}
}
} else {
ASSERT(0);
}
}
return pvReturn;
}
(3)calloc 接口实现
void *csi_calloc(uint32_t nblock, uint32_t size)
{
printf("%s\n", __func__);
void *pt = malloc_psram(nblock * size);
memset(pt, 0x00, nblock * size);
return pt;
}
(4) psram内存统计接口
/**
* @brief: psram内存统计接口, 调用可获取信息:
* 1. Free Block: 空闲块数量;
* 2. MaxBlockSize: 最大空闲块大小;
* 3. MinBlockSize: 最小空闲块大小;
* 4. TotalFree: 空闲块总大小, EverMinFree: 系统运行过程中曾经最小值
*
*/
/* ---------------------------------------------------------------------------- */
extern void psram_heap_stats(void);
类似内存打印,放在定时器里面打印看下
(5) psram 内存释放接口
/* ---------------------------------------------------------------------------- */
/**
* @brief: psram 内存释放接口
*
* @param pv: 释放的内存地址
*/
/* ---------------------------------------------------------------------------- */
extern void free_psram(void *pv);
(6)数组分配到psram

