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