使用的是RT-Thread Nano的最新版,第一次移植,不知道是不是因为这个lvgl只能移植到标准版里?
尝试过给lvgl的线程分配更大的栈,但是依旧会卡死在硬件错误中断里。
但只要把用户的ui初始化注释掉就能正常运行,而且进入硬件错误中断时r6到r11这些寄存器的值均为0xdeadbeef
线程代码如下:
同时board.h里的配置为:
后续测试中发现程序在lv_obj_create里就出现问题了,具体是其内的apply_theme函数第二次递归调用时出现了硬件错误中断
新手犯蠢了。。。找了许久才找到问题,原因在函数在main作为一个线程初始化使用的栈实在是太大了。以下是寻找例程:
查了网上资料,大多说要加栈。可即便我拉到近乎90%内存,仍然会触发硬件错误中断(不过也可能与我之前忘加lv_disp_int()有关)。后来把内存降至79%(加入lv_disp_int()了),调大链接脚本中栈的大小、调大main线程的堆栈、调大总栈等等,试了很久还是没能解决。
调试过程中,由于对RT-Thread的堆栈分配了解逐渐加深。于是我猜测会不会是栈(链接脚本里的,不是任务栈)不够导致的,就把启动文件里的入口函数直接对准了main,在main里调用lv_obj_create,结果可行。再经过一通通分析,发现即便是lvgl里相当常用的接口lv_obj_create,也经过很多次深层调用,而rt_thread_startup本身就有不少次调用,导致链接脚本里设的栈不够用并且分配的任务栈也不够用。于是又重新调整了一下函数进入方式(由main线程调整为了普通的main),但不改变系统的基本流程,把初始化直接放在了外面而不是放在main线程里的初始化。