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定义了一个系统的块内存,用户配置后即可使用。
并且提供了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):
}
}
上一篇: redis数据库键命令的基本操作
下一篇: redis数据库二:redis的键类型