manhuami2007 发表于 2022-5-4 15:31

【平头哥RVB2601创意应用开发】 第七篇 使用lvgl并解决SRAM内存不足的问题

<div class="parsedown-markdown">
<h3>一、使用lvgl的步骤</h3>

<p>RVB2601开发板上已经移植好了LVGL,可以直接使用,使用步骤如下:</p>

<ol>
        <li>加入OLED的驱动,可以从&quot;ch2601_gui_demo&quot;中,拷贝出OLED的驱动。如果是复制&quot;ch2601_helloworld&quot;中OLED驱动的话,还需要加入lvgl的注册函数。可以通过比较这两个项目里的oled.c的&quot;oled_init()&quot;函数看出区别。</li>
        <li>引入头文件&quot;lvgl.h&quot;</li>
        <li>调用函数&quot;lv_init()&quot;,对lvgl进行初始化</li>
        <li>在周期函数中加入以下两个函数&quot;lv_task_handler()&quot;和&quot;lv_tick_inc()&quot;</li>
</ol>

<pre>
<code class="language-c">int main(void)
{
    board_yoc_init();
    lv_init();
    oled_init();   
    show_page_init();   
    while(1){
      lv_task_handler();      
      aos_msleep(100);
      lv_tick_inc(100);      
    }
}</code></pre>

<h3>二、SRAM内存不足的问题</h3>

<p>但是在&quot;webplayer_demo&quot;中使用lvgl时,会出现以下错误:</p>

<p><img alt="" src="2022-05-03-17-01-09.png" target="_blank" /></p>

<p>显示SRAM溢出了,因此需要精简一下变量的使用。在&quot;lvgl_conf.h&quot;中,有如下代码:</p>

<pre>
<code class="language-c">/* Size of the memory used by `lv_mem_alloc` in bytes (&gt;= 2kB)*/
#define LV_MEM_SIZE    (32U * 1024U)</code></pre>

<p>可以看出,默认分配了32KB的空间给LVGL,用于动态内存申请。这块空间给的太大了,因此可以将其改小一些,比如改成4KB。这样就不报错了。</p>

<h3>三、代码示例</h3>

<p>下面是我的初始化页面,全部使用的label控件,使用前记得引入&quot;lvgl.h&quot;和&quot;lv_label.h&quot;头文件:</p>

<pre>
<code class="language-cpp">lv_obj_t * label_temp;
lv_obj_t * label_humity;
lv_obj_t * label_speed;

void show_page_init()
{
        lv_obj_t * label1 = lv_label_create(lv_scr_act(),NULL);
        lv_label_set_long_mode(label1, LV_LABEL_LONG_BREAK);   /*显示模式固定*/
        lv_label_set_align(label1, LV_LABEL_ALIGN_CENTER);       /*居中显示*/
    lv_label_set_text(label1,"Smart Fan");            /*显示标签的内容*/
    lv_obj_set_width(label1, 128);                        /*设置显示的宽度*/
    lv_obj_align(label1, NULL, LV_ALIGN_IN_TOP_MID, 0, 0);/*靠项端居中显示*/
       
        label_temp = lv_label_create(lv_scr_act(),NULL);
        lv_label_set_long_mode(label_temp, LV_LABEL_LONG_BREAK);   /*显示模式固定*/
        lv_label_set_align(label_temp, LV_LABEL_ALIGN_LEFT);       /*居中显示*/
        sprintf(temp,"TEMP\t: -- C");
    lv_label_set_text(label_temp,temp);            /*显示标签的内容*/
    lv_obj_set_width(label_temp, 128);                        /*设置显示的宽度*/
    lv_obj_align(label_temp, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 16);/*靠项端居中显示*/
       
        label_humity = lv_label_create(lv_scr_act(),NULL);
        lv_label_set_long_mode(label_humity, LV_LABEL_LONG_BREAK);   /*显示模式固定*/
        lv_label_set_align(label_humity, LV_LABEL_ALIGN_LEFT);       /*居中显示*/
        sprintf(humity,"RH\t: -- %%");
    lv_label_set_text(label_humity,humity);            /*显示标签的内容*/
    lv_obj_set_width(label_humity, 128);                        /*设置显示的宽度*/
    lv_obj_align(label_humity, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 32);/*靠项端居中显示*/
       
        label_speed = lv_label_create(lv_scr_act(),NULL);
        lv_label_set_long_mode(label_speed, LV_LABEL_LONG_BREAK);   /*显示模式固定*/
        lv_label_set_align(label_speed, LV_LABEL_ALIGN_LEFT);       /*居中显示*/
        sprintf(fan_speed,"Speed\t: 0");
    lv_label_set_text(label_speed,fan_speed);            /*显示标签的内容*/
    lv_obj_set_width(label_speed, 128);                        /*设置显示的宽度*/
    lv_obj_align(label_speed, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 48);/*靠项端居中显示*/
       
}</code></pre>

<p>效果如下:</p>
</div>

<p></p>

lugl4313820 发表于 2022-5-4 20:04

可以解决内存不足的问题就好,我前面就是因为这个放弃了LVGL。

z3099998888 发表于 2022-5-11 09:56

<p>很好,讲的不错。很好,讲的不错。很好,讲的不错。很好,讲的不错。很好,讲的不错。很好,讲的不错。</p>
页: [1]
查看完整版本: 【平头哥RVB2601创意应用开发】 第七篇 使用lvgl并解决SRAM内存不足的问题