【平头哥RVB2601创意应用开发】 第七篇 使用lvgl并解决SRAM内存不足的问题
<div class="parsedown-markdown"><h3>一、使用lvgl的步骤</h3>
<p>RVB2601开发板上已经移植好了LVGL,可以直接使用,使用步骤如下:</p>
<ol>
<li>加入OLED的驱动,可以从"ch2601_gui_demo"中,拷贝出OLED的驱动。如果是复制"ch2601_helloworld"中OLED驱动的话,还需要加入lvgl的注册函数。可以通过比较这两个项目里的oled.c的"oled_init()"函数看出区别。</li>
<li>引入头文件"lvgl.h"</li>
<li>调用函数"lv_init()",对lvgl进行初始化</li>
<li>在周期函数中加入以下两个函数"lv_task_handler()"和"lv_tick_inc()"</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>但是在"webplayer_demo"中使用lvgl时,会出现以下错误:</p>
<p><img alt="" src="2022-05-03-17-01-09.png" target="_blank" /></p>
<p>显示SRAM溢出了,因此需要精简一下变量的使用。在"lvgl_conf.h"中,有如下代码:</p>
<pre>
<code class="language-c">/* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB)*/
#define LV_MEM_SIZE (32U * 1024U)</code></pre>
<p>可以看出,默认分配了32KB的空间给LVGL,用于动态内存申请。这块空间给的太大了,因此可以将其改小一些,比如改成4KB。这样就不报错了。</p>
<h3>三、代码示例</h3>
<p>下面是我的初始化页面,全部使用的label控件,使用前记得引入"lvgl.h"和"lv_label.h"头文件:</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>
可以解决内存不足的问题就好,我前面就是因为这个放弃了LVGL。 <p>很好,讲的不错。很好,讲的不错。很好,讲的不错。很好,讲的不错。很好,讲的不错。很好,讲的不错。</p>
页:
[1]