欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

wirebed 内存管理

程序员文章站 2022-06-04 11:04:44
...

MCU外设比如 串口等接收到数据,提供给wirebed任务。任务有2种方法处理底层提供的数据

  • 直接数据处理。整个处理会在中调中调用,会降低系统反应性能。
  • 缓存数据,给任务发送消息,延后处理。

wirebed提供了2种内存: 块内存和系统内存。 

 

块内存

块内存是固定大小的内存,提供初始化宏,获取和释放接口。


#define BLOCKMEM(NAME,BLOCKNUM,BLOCKSIZIE) \
        block_mem_t NAME; \
        static uint32_t CONCAT(NAME,_data)[BLOCKNUM][BLOCKSIZIE];

#define BLOCKMEM_NAME(NAME,BLOCKNUM,BLOCKSIZIE) \
        extern block_mem_t NAME;

#define BLOCKMEN_INIT(NAME,BLOCKNUM,BLOCKSIZIE) \
        blockMemInit(&NAME,CONCAT(NAME,_data),BLOCKNUM,BLOCKSIZIE*4);


void  *blockMemGet (block_mem_t *pmem);
uint32_t  blockMemPut (block_mem_t  *pmem, void *pblk);

例如


BLOCKMEM(blockMem1, 16,4);


void init()
{
    BLOCKMEM_INIT(blockMem1, 16,4);
    //....
}

void data_input()
{
    void *ptr = blockMemGet (blockMem1);

    //data process

    blockMemPut(blockMem1,ptr):

}

内存指针管理

当外设多次传输数据给任务时,就需要链表管理这些数据指针。 wirebed提供了ptrbuf管理指针


#define PTRBUF(NAME,NUM) \
        ptrbuf_t NAME;   \
        void * CONCAT(NAME,_data)[NUM];

#define PTRBUF_NAME(NAME,NUM) \
        extern ptrbuf_t NAME;

#define PTRBUF_INIT(NAME,NUM) \
    ptrbufInit(&NAME,CONCAT(NAME,_data),NUM);


uint32_t ptrbufPush(ptrbuf_t *r, void * ptr);
void *ptrbufPop(ptrbuf_t *r);
uint16_t ptrbufNum(ptrbuf_t *r);

例如

BLOCKMEM(blockMem1, 16,4);
PTRBUF(ptrbuf1,10);

void init()
{
    BLOCKMEM_INIT(blockMem1, 16,4);
    //....
}

void data_input()
{
    void *ptr = blockMemGet (blockMem1);

    ptrbufPush(ptrbuf1,ptr);

    //send event

    
}

void task_event()
{

    void * ptr = 0;
    if(ptrbufNum(ptrbuf1)>0)
    {    
        ptr = ptrbufPop(ptrbuf1);
        //data process      
        blockMemPut(blockMem1,ptr):
    }
} 

wirebed系统内存

块内存不能解决多个任务之间共享内存。wirebed定义了一个系统的块内存,用户配置后即可使用。

wirebed 内存管理

并且提供了API操作这些块内存


void * memMalloc(uint32_t sizeByte);
void memFree(void *pblk);
void memLock(void *pblk);
void memUnlock(void *pblk);
void memSetLength(void *pblk,uint32_t len);
uint32_t memGetLength(void *pblk);

比如刚才的例子可以修改为


PTRBUF(ptrbuf1,10);


void data_input()
{
    void *ptr = memMalloc(16);
    
    memLock(ptr);
    memSetLength(ptr,5);

    ptrbufPush(ptrbuf1,ptr);

    //send event

    

}

void task_event()
{

    void * ptr = 0;
    uint32_t len = 0;
    if(ptrbufNum(ptrbuf1)>0)
    {    
        ptr = ptrbufPop(ptrbuf1);
        len = memSetLength(ptr);
        //data process      
        memUnlock(ptr):
    }
} 


 

相关标签: 内存管理