嵌入式技术论坛
直播中

李秀兰

7年用户 1437经验值
私信 关注
[问答]

LVGL lv_demo_widgets()样例编译后无法正常运行程序咋办?

最近遇到了一些非常奇怪的问题,希望获得各位大佬的指点,问题出现在移植LVGL的过程中。
我按照如下的过程进行移植:
1、配置为memheap内存管理模式
2、完成初始化SDRAM并挂载到memheap,SDRAM测试正常
3、完成初始化LTDC 测试屏幕驱动正常,完成画点函数测试正常
4、完成初始化触摸芯片代码并测试正常
5、LVGL env环境rtthread部分进行注释,并添加预定义宏使用自己的’lv_conf.h’文件,改到自己的线程中运行

自己线程主要内容如下:

void lvgl_c_thread_port(void * pra)
{
    lv_init();
    lv_port_disp_init();
    lv_port_indev_init();
    /*这部分是初始化屏幕内容代码,主要问题出现在这里*/
    show_somethings();
    /*end*/
    while (1) {
        /* ... */
        lv_task_handler();
        rt_thread_mdelay(30);
    }
}
该线程需要使用MSH命令启动,启动代码如下

int lvgl_test_thread()
{
    rt_thread_t tid;
    tid = rt_thread_create("lvgl", lvgl_c_thread_port, RT_NULL, 10240, 20, 5);
    if (tid)
        rt_thread_startup(tid);
    else
        LOG_E("lvgl thread not start!");
    return 0;
}
MSH_CMD_EXPORT(lvgl_test_thread, lvgl_test_thread);
如果’show_somethings();’为如下代码,则一切正常:

    lv_obj_t * btn = lv_btn_create(lv_scr_act());     /*Add a button the current screen*/
    lv_obj_set_pos(btn, 10, 10);                            /*Set its position*/
    lv_obj_set_size(btn, 120, 50);                          /*Set its size*/
    lv_obj_t * label = lv_label_create(btn);          /*Add a label to the button*/
    lv_label_set_text(label, "Button");                     /*Set the labels text*/
    lv_obj_center(label);

如果’show_somethings();’为如下代码,则可能在某次烧录中可以正常运行,而大概率在其他多次烧录中无法完成rtthread系统初始化(系统初始化时,按道理来说没有输入msh命令,所以lvgl线程应当还没有开始运行):

lv_demo_widgets();

这件事情令我非常疑惑,我开始怀疑是否是栈溢出,于是我做了如下修改:
2.jpg
但仍然无法令程序稳定的工作,时而正常时而不正常的状态令我非常崩溃;
通过DEBUG调试,我发现在不正常时,系统是在该处触发断言
2.jpg
该处断言的进入位置为
2.jpg
通过变量可知,其初始化内容为:将片内ram初始为名为heap的堆,而不是在执行初始化SDRAM为堆
2.jpg
但我没有思路该如何解决问题,是否有大佬可以帮忙看看。
Ps:其实我最最最想知道的是,为什么一个没有运行的程序仅仅是参与不参与编译就能够影响整体的运行,才疏学浅


回帖(3)

张鹏

2023-3-23 11:04:54
我提一个方面,编译器的优化等级和优化选项,有的时候也会造成影响.
没运行的程序不代表没编译进去
举报

张鹏

2023-3-23 11:05:20
感谢你的回答,以下是我的编译器选项,可以的话指教一二。
2.jpg
3.jpg
我能想到的编译但不运行会影响到的应该是栈了,是否还有其他会影响的呢?
不太会看.map,可以的话,可否传授些经验
举报

李秀兰

2023-3-23 11:06:21
问题的处理还是要从根源寻找
再次Debug,这次找的更深一些,我们从汇编读取data段Flash数据到内存中的栈来看,对应是此处。
2.jpg
从.map文件,我们知道之前出问题的那一个静态变量存放的地址
2.jpg
也就是说从第三次执行CopyDataInit开始将存放该变量的第一个数据。
分别Debug工作正常和工作不正常的两个固件,发现工作正常的可以正常读取Flash中的数据而工作不正常的则不行。
于是开始怀疑编译出的二进制文件有问题,对比以后发现除了存放位置不同,实际数据并没有问题。
开始怀疑下载算法,至此终于找对方向,因为Flash并有单独某个页面加锁一说,故怀疑是否是在某个莫名其妙的时候写入了脏数据。
既然是脏数据,下载算法没有检测到,flash页面没有清零,当然无法写入数据。
执行全片擦除,再次下载,正常运行了!
至此这个莫名其妙卡主我3天的问题终于解决了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分