optimize lv_mem_buf uage

This commit is contained in:
Gabor Kiss-Vamosi
2020-05-11 10:21:23 +02:00
parent a026a5b61d
commit eaeb362001

View File

@@ -66,6 +66,8 @@ typedef struct {
#define ALIGN_MASK 0x3 #define ALIGN_MASK 0x3
#endif #endif
#define MEM_BUF_SMALL_SIZE 16
/********************** /**********************
* STATIC PROTOTYPES * STATIC PROTOTYPES
**********************/ **********************/
@@ -84,6 +86,13 @@ typedef struct {
static uint32_t zero_mem; /*Give the address of this variable if 0 byte should be allocated*/ static uint32_t zero_mem; /*Give the address of this variable if 0 byte should be allocated*/
static uint8_t mem_buf1_32[MEM_BUF_SMALL_SIZE];
static uint8_t mem_buf2_32[MEM_BUF_SMALL_SIZE];
static lv_mem_buf_t mem_buf_small[] = {{.p = mem_buf1_32, .size = MEM_BUF_SMALL_SIZE, .used = 0},
{.p = mem_buf2_32, .size = MEM_BUF_SMALL_SIZE, .used = 0}};
/********************** /**********************
* MACROS * MACROS
**********************/ **********************/
@@ -472,15 +481,41 @@ void * lv_mem_buf_get(uint32_t size)
{ {
if(size == 0) return NULL; if(size == 0) return NULL;
/*Try to find a free buffer with suitable size */ /*Try small static buffers first*/
uint8_t i; uint8_t i;
for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { if(size <= MEM_BUF_SMALL_SIZE) {
if(LV_GC_ROOT(_lv_mem_buf[i]).used == 0 && LV_GC_ROOT(_lv_mem_buf[i]).size >= size) { for(i = 0; i < sizeof(mem_buf_small) / sizeof(mem_buf_small[0]); i++) {
LV_GC_ROOT(_lv_mem_buf[i]).used = 1; if(mem_buf_small[i].used == 0) {
return LV_GC_ROOT(_lv_mem_buf[i]).p; mem_buf_small[i].used = 1;
return mem_buf_small[i].p;
}
} }
} }
/*Try to find a free buffer with suitable size */
int8_t i_guess = -1;
for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) {
if(LV_GC_ROOT(_lv_mem_buf[i]).used == 0 && LV_GC_ROOT(_lv_mem_buf[i]).size >= size) {
if(LV_GC_ROOT(_lv_mem_buf[i]).size == size) {
LV_GC_ROOT(_lv_mem_buf[i]).used = 1;
return LV_GC_ROOT(_lv_mem_buf[i]).p;
}
else if(i_guess < 0) {
i_guess = i;
}
/*If size of `i` is closer to `size` prefer it*/
else if(LV_GC_ROOT(_lv_mem_buf[i]).size < LV_GC_ROOT(_lv_mem_buf[i_guess]).size) {
i_guess = i;
}
}
}
if(i_guess >= 0) {
LV_GC_ROOT(_lv_mem_buf[i_guess]).used = 1;
return LV_GC_ROOT(_lv_mem_buf[i_guess]).p;
}
/*Reallocate a free buffer*/ /*Reallocate a free buffer*/
for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) {
if(LV_GC_ROOT(_lv_mem_buf[i]).used == 0) { if(LV_GC_ROOT(_lv_mem_buf[i]).used == 0) {
@@ -507,6 +542,15 @@ void * lv_mem_buf_get(uint32_t size)
void lv_mem_buf_release(void * p) void lv_mem_buf_release(void * p)
{ {
uint8_t i; uint8_t i;
/*Try small static buffers first*/
for(i = 0; i < sizeof(mem_buf_small) / sizeof(mem_buf_small[0]); i++) {
if(mem_buf_small[i].p == p) {
mem_buf_small[i].used = 0;
return;
}
}
for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) {
if(LV_GC_ROOT(_lv_mem_buf[i]).p == p) { if(LV_GC_ROOT(_lv_mem_buf[i]).p == p) {
LV_GC_ROOT(_lv_mem_buf[i]).used = 0; LV_GC_ROOT(_lv_mem_buf[i]).used = 0;
@@ -523,6 +567,10 @@ void lv_mem_buf_release(void * p)
void lv_mem_buf_free_all(void) void lv_mem_buf_free_all(void)
{ {
uint8_t i; uint8_t i;
for(i = 0; i < sizeof(mem_buf_small) / sizeof(mem_buf_small[0]); i++) {
mem_buf_small[i].used = 0;
}
for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) { for(i = 0; i < LV_MEM_BUF_MAX_NUM; i++) {
if(LV_GC_ROOT(_lv_mem_buf[i]).p) { if(LV_GC_ROOT(_lv_mem_buf[i]).p) {
lv_mem_free(LV_GC_ROOT(_lv_mem_buf[i]).p); lv_mem_free(LV_GC_ROOT(_lv_mem_buf[i]).p);