KDocs 研发资料库
  • 屏融合应用方案入口汇总
  • JL701N穿戴客述问题FAQ
  • JL701N穿戴类补丁list
  • 手表软件调试
  • JL701手表硬件设计注意事项 总结
  • 手表烧录_升级工具说明
  • 手表量产相关
  • 生产烧录KEY及代码和升级代码
  • AC695N系列手表SDK开发指南
  • JL7012A手表-SDK入门指南V1.0
  • 穿戴手表JL701N-入门到进阶开发指导
  • 彩屏充电仓JL701N LVGL入门到进阶指导文档
  • AC695N手表软硬件问题整理
  • JL701N手表软硬件问题整理
  • 701n手表SDK共性问题汇总
  • UI效果参考demo文档
  • 屏幕触摸驱动相关参考
  • 穿戴类支付宝支付流程
  • AC701N_PMU_介绍
  • 经典蓝牙相关接口说明
  • music应用详细设计说明书
  • music_player接口设计说明文档
  • PO声测试以及处理方法
  • DAC性能测试指南
  • 杰理串口升级规范
  • AC696N串口升级说明
  • AC695N系列手表UI开发指南
  • AC695N添加升级UI说明文档.
  • UI布局工具使用说明
  • UI接口设计说明书
  • UI工具快速使用说明
  • 701N_UI编辑工具用户手册
  • UI工程源文件升级工具使用说明
  • 701N屏幕驱动配置说明
  • JL701N 2D图形硬件加速接口使用说明
  • JL701_watch常用例子参考
  • JL_WATCH_SDK UI相关工具使用文档
  • 智能手表音频 设计调试手册 V1.2
  • AC695X_AC696X_AD697X 常见通话问题处理参考资料
  • 701手表 PCBA产测工具使用说明书 V1.0
  • 杰理定频问题排查2021.1.26
  • BQB5.4 20231007
  • 各类概率性死机调试解决指南
  • 不开机问题处理汇总(仅供参考)
  • 蓝牙搜索不到问题处理汇总(仅供参考)
  • 样机发烫(仅供参考)
  • 蓝牙音乐卡顿问题处理汇总(仅供参考)
  • 充电问题处理汇总(仅供参考)
  • 触摸问题处理汇总(仅供参考)
  • 功耗调试指导
  • JL701N穿戴客述问题FAQ
  • 701N 开发板新屏幕驱动修改
  • AC701 nandflash A8图片显示问题
  • 支付宝乘车码接入资料
  • 多国语言及字库使用指南
  • 查看C程序Flash 和RAM 资源占用说明文档
  • 701N_SDK3.0.1_OPUS_OGG 编解码
  • 蓝牙在线调eq说明
  • BR EDR BLE 蓝牙性能测试配置方法_
  • BLE-HID
  • BLE-HID 调试文档
  • 【问题】701v301外置flash播放wts提示音
  • 本地录音开启及调试
  • 死机分析
  • 表盘传输APP层的压缩算法
  • 功能模版:JL701_V301_UI资源使用FAT文件系统demo
  • JL7013+4G CAT1 参考设计原理图
  • 吾爱4G模组+JL701接口说明
  • (电脑一拖多)手表升级dongle工具使用补充说明
  • 蓝牙接口使用说明
  • ble 开发流程
  • 彩屏仓功耗优化
  • 彩屏仓补丁list
  • 更新字库步骤
  • 支付宝硬件接入资料

701 PSRAM 常见接口

📎 原始文档:https://www.kdocs.cn/l/cknCFtBNSHIj 701 PSRAM 常见接口

  1. 配置

701 芯片A6s 和A7s 带内置psram ,TCFG_PSRAM_DEV_ENABLE 打开 , 默认配置128Mhz 即可
image

  1. 常见接口

(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);

类似内存打印,放在定时器里面打印看下
image

(5) psram 内存释放接口

/* ---------------------------------------------------------------------------- */
/**
 * @brief: psram 内存释放接口
 *
 * @param pv: 释放的内存地址
 */
/* ---------------------------------------------------------------------------- */
extern void free_psram(void *pv);

(6)数组分配到psram

imageimage