硬汉嵌入式论坛

 找回密码
 立即注册
查看: 924|回复: 33
收起左侧

[LVGL] LVGL求助,在主线程里调用芯片的定时器切换界面,结果导致界面卡死,怎么解决定时器线程卡死这个问题呀

[复制链接]

4

主题

31

回帖

43

积分

新手上路

积分
43
发表于 2023-7-17 10:35:11 | 显示全部楼层 |阅读模式
想问一下大佬们,在主线程里调用芯片的定时器切换界面,结果导致界面卡死,怎么解决定时器线程卡死这个问题呀?
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-17 11:12:39 | 显示全部楼层
[C] 纯文本查看 复制代码
void Lvgl_start(void)  
{ 
  int time1=0;
  int time2=0;
  /*LED1-LED2*/  
  GPIO_Congif(LED1_PORT,LED1_PIN,GPIO_Mode_OUT,GPIO_PuPd_NOPULL);
  GPIO_Congif(LED2_PORT,LED2_PIN,GPIO_Mode_OUT,GPIO_PuPd_NOPULL);
  /*lvgl tick*/	
  Sys_Timer1_Init();
  /*lvgl 初始化*/
  lv_init();
  lv_port_disp_init();
  lv_port_indev_init();
#ifdef RTP_TOUCH_USR	
  touch_chCalibrate();/*触屏校正*/
#endif

  while(1)
  {
    lv_task_handler();
    
    //STATUS注释此模块
    //30s切换一个界面
    if(Read_time_ms()>0&&Read_time_ms()<200)
    {
      Show_AC();
      printf("%d\r\n",Read_time_ms());
    }
    else if(Read_time_ms()>30000&&Read_time_ms()<30200)
    {
      Show_DC();
      printf("%d\r\n",Read_time_ms());
    }
    else if(Read_time_ms()>60000&&Read_time_ms()<60200)
    {
      Show_pri();
      printf("%d\r\n",Read_time_ms());
    }
    else if(Read_time_ms()>90000&&Read_time_ms()<90200)
    {
      Show_HYD_TEST();
      printf("%d\r\n",Read_time_ms());
    }
    else if(Read_time_ms()>120000&&Read_time_ms()<120200)
    {
      M_gui();
      printf("%d\r\n",Read_time_ms());
    }
    else if(Read_time_ms()>150000&&Read_time_ms()<150200)
    {
      display();
    }
    else if(Read_time_ms()>180000&&Read_time_ms()<180200)
    {
      Reset_time();
    }
    else if(Read_time_ms()>150000&&Read_time_ms()<150200)
    {
      Reset_time();
      printf("%d\r\n",Read_time_ms());
    }
    
    lcd_double_buffer_update();
    /*LED1*/
    if((Read_time_ms()-time1)>500)
    {
      time1=Read_time_ms();
      GPIO_SET(LED1_PORT,LED1_PIN); 	
    }
    else if((Read_time_ms()-time1)>250)
    {
      GPIO_RESET(LED1_PORT,LED1_PIN); 	
    }		
    /*LED2*/
    if((Read_time_ms()-time2)>1000)
    {
      time2=Read_time_ms();
      GPIO_SET(LED2_PORT,LED2_PIN);	
    }
    else if((Read_time_ms()-time2)>500)
    {
      GPIO_RESET(LED2_PORT,LED2_PIN);	
    }	
    /*delay*/	
    delay_us(10);
  }
}


int main(void)
{ 
  Sys_SET_UART_DBG(UART3);//选择调试口	
  sysprintf("\r\n\r\n\r\n");
  sysprintf("T113-S3 EXEC START...\r\n");
 
  //中断系统初始化
  T113_s3_interrupt_init();  
  
  //USB测试
  HidComUvcDemo();
  
  //------------
  Lvgl_start();
 
  while(1)
  {
   
  } 
}
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-17 11:29:20 | 显示全部楼层
#在这里快速回复#lvgl里面有很多全局变量,使用lv——
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-17 11:30:32 | 显示全部楼层
lvgl里面有很多全局变量,使用的时候要上锁
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-17 11:33:14 | 显示全部楼层
SAmomolin 发表于 2023-7-17 11:12
[mw_shl_code=c,true]
void Lvgl_start(void)  
{

实际代码逻辑是对的,这个粘贴过来的过程中有的地方重复了,但主体是这个逻辑
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-17 14:05:55 | 显示全部楼层
baobao5 发表于 2023-7-17 11:30
lvgl里面有很多全局变量,使用的时候要上锁

我给它们弄得都是静态变量
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-17 15:58:31 | 显示全部楼层
baobao5 发表于 2023-7-17 11:30
lvgl里面有很多全局变量,使用的时候要上锁

而且它如果单加载颜色界面切换的话就没有问题
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-17 16:13:41 | 显示全部楼层
SAmomolin 发表于 2023-7-17 15:58
而且它如果单加载颜色界面切换的话就没有问题

方便的话把工程传上来
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-17 16:25:30 | 显示全部楼层
baobao5 发表于 2023-7-17 16:13
方便的话把工程传上来

文件工程过大,无法上传,方便加您个联系方式吗?
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-17 16:26:02 | 显示全部楼层
baobao5 发表于 2023-7-17 16:13
方便的话把工程传上来

工程太大了,压缩后还64MB
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-17 18:34:17 | 显示全部楼层
SAmomolin 发表于 2023-7-17 16:26
工程太大了,压缩后还64MB

可以传到网盘,可以传到网盘
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-18 08:56:16 | 显示全部楼层
baobao5 发表于 2023-7-17 18:34
可以传到网盘,可以传到网盘

链接:https://pan.baidu.com/s/1AIIwnkjv8MYSRl5pHvlkwA
提取码:m300
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-18 09:56:28 | 显示全部楼层
你这个是不是一开始可以正常运行,然后跑一段时间就死机了。
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-18 09:57:16 | 显示全部楼层
我看你所有的对象都是只有创建,没有删除,然后一直while(1)循环创建,这样跑一会内存就不够了。
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-18 09:59:21 | 显示全部楼层
LV_USE_LOG

把LV_LOG_LEVEL_WARN以上的log打开以后找问题方便一点。
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-18 10:10:39 | 显示全部楼层
baobao5 发表于 2023-7-18 09:56
你这个是不是一开始可以正常运行,然后跑一段时间就死机了。

对的,跑几分钟就会出现定时器停止的情况
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-18 10:11:57 | 显示全部楼层
baobao5 发表于 2023-7-18 09:57
我看你所有的对象都是只有创建,没有删除,然后一直while(1)循环创建,这样跑一会内存就不够了。

我试着在定时器里去lv_obj_del();它那个界面,但是就不能切换界面了
回复

使用道具 举报

2

主题

20

回帖

26

积分

新手上路

积分
26
发表于 2023-7-18 10:30:26 | 显示全部楼层
切换用load,不用每次都创建屏幕把
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-18 10:30:48 | 显示全部楼层
如果你这个需求就是不同页面切换的话,可以在一开始把所有界面创建完,然后添加隐藏的flag,在定时把他们清除flag。

[C] 纯文本查看 复制代码
void Lvgl_start(void)  
{ 
  int time1=0;
  int time2=0;
  /*LED1-LED2*/  
  GPIO_Congif(LED1_PORT,LED1_PIN,GPIO_Mode_OUT,GPIO_PuPd_NOPULL);
  GPIO_Congif(LED2_PORT,LED2_PIN,GPIO_Mode_OUT,GPIO_PuPd_NOPULL);
  /*lvgl tick*/	
  Sys_Timer1_Init();
  /*lvgl 初始化*/
  lv_init();
  lv_port_disp_init();
  lv_port_indev_init(); 

  lv_obj_t* base_obj;
  lv_obj_t* base1_obj;
  lv_obj_t* base2_obj;
  lv_obj_t* base3_obj;
  lv_obj_t* base4_obj;

  Show_AC(base_obj);   
  Show_DC(base1_obj);
  Show_pri(base2_obj);
  Show_HYD_TEST(base3_obj);
  M_gui(base4_obj);
  
  while(1)
  {
    lv_task_handler();
      
    lv_obj_add_flag(base_obj, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_flag(base1_obj, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_flag(base2_obj, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_flag(base3_obj, LV_OBJ_FLAG_HIDDEN);
    lv_obj_add_flag(base4_obj, LV_OBJ_FLAG_HIDDEN);
    //STATUS注释此模块
    //30s切换一个界面
    if(Read_time_ms()>0&&Read_time_ms()<200)
    {
      lv_obj_clear_flag(base_obj, LV_OBJ_FLAG_HIDDEN);
    }
    else if(Read_time_ms()>30000&&Read_time_ms()<30200)
    {
      lv_obj_clear_flag(base1_obj, LV_OBJ_FLAG_HIDDEN);
    }
    else if(Read_time_ms()>60000&&Read_time_ms()<60200)
    {
      lv_obj_clear_flag(base2_obj, LV_OBJ_FLAG_HIDDEN);
    }
    else if(Read_time_ms()>90000&&Read_time_ms()<90200)
    {
      lv_obj_clear_flag(base3_obj, LV_OBJ_FLAG_HIDDEN);
    }
    else if(Read_time_ms()>120000&&Read_time_ms()<120200)
    {
      lv_obj_clear_flag(base4_obj, LV_OBJ_FLAG_HIDDEN);
    }
    else if(Read_time_ms()>150000&&Read_time_ms()<150200)
    {
      display();
    }
    else if(Read_time_ms()>180000&&Read_time_ms()<180200)
    {
      Reset_time();
    }
    
    lcd_double_buffer_update();
    /*LED1*/
    if((Read_time_ms()-time1)>500)
    {
      time1=Read_time_ms();
      GPIO_SET(LED1_PORT,LED1_PIN); 	
    }
    else if((Read_time_ms()-time1)>250)
    {
      GPIO_RESET(LED1_PORT,LED1_PIN); 	
    }		
    /*LED2*/
    if((Read_time_ms()-time2)>1000)
    {
      time2=Read_time_ms();
      GPIO_SET(LED2_PORT,LED2_PIN);	
    }
    else if((Read_time_ms()-time2)>500)
    {
      GPIO_RESET(LED2_PORT,LED2_PIN);	
    }	
    /*delay*/	
    delay_us(10);
  }
}
回复

使用道具 举报

2

主题

180

回帖

186

积分

初级会员

积分
186
发表于 2023-7-18 10:39:26 | 显示全部楼层
SAmomolin 发表于 2023-7-18 10:11
我试着在定时器里去lv_obj_del();它那个界面,但是就不能切换界面了

所有操作通过事件驱动,在lv同现成内进行操作
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-18 13:48:41 | 显示全部楼层
baobao5 发表于 2023-7-18 10:30
如果你这个需求就是不同页面切换的话,可以在一开始把所有界面创建完,然后添加隐藏的flag,在定时把他们清 ...

我试了一下,没有显示画面,直接白屏了
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-18 13:49:19 | 显示全部楼层
JasonGu 发表于 2023-7-18 10:30
切换用load,不用每次都创建屏幕把

我尝试过,出现不了界面
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-18 13:49:42 | 显示全部楼层
qq57379550 发表于 2023-7-18 10:39
所有操作通过事件驱动,在lv同现成内进行操作

方便具体说一下吗
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-18 14:50:34 | 显示全部楼层
baobao5 发表于 2023-7-18 10:30
如果你这个需求就是不同页面切换的话,可以在一开始把所有界面创建完,然后添加隐藏的flag,在定时把他们清 ...

我找到原因了,好像是因为频繁的界面切换导致内存满了,但是我在定时器里面对界面进行删除的话,它的自动切换就会停止,有什么好的建议吗?
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-18 15:12:32 | 显示全部楼层
SAmomolin 发表于 2023-7-18 14:50
我找到原因了,好像是因为频繁的界面切换导致内存满了,但是我在定时器里面对界面进行删除的话,它的自动 ...

上面已经回复过了,死机的原因是你只有creat没有del。

而且你这个代码del也不好做,因为到处都是指针,操作空指针的话会出问题。

所以按照上面回复的代码,一开始把所有界面创建好,记录好所有界面的base_obj,然后把所有界面都隐藏掉,再循环根据需要把想要展示的界面取消隐藏就好。
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-18 16:26:35 | 显示全部楼层
baobao5 发表于 2023-7-18 15:12
上面已经回复过了,死机的原因是你只有creat没有del。

而且你这个代码del也不好做,因为到处都是指针 ...

好的,我试一下,谢谢您
回复

使用道具 举报

2

主题

20

回帖

26

积分

新手上路

积分
26
发表于 2023-7-18 20:56:47 | 显示全部楼层
SAmomolin 发表于 2023-7-18 13:49
我尝试过,出现不了界面

出现不了界面肯定是实现有问题,我的多界面就是这么操作的,第一次切换界面的时候创建,后面都只用load到对应的screen即可
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-19 08:57:09 | 显示全部楼层
baobao5 发表于 2023-7-18 15:12
上面已经回复过了,死机的原因是你只有creat没有del。

而且你这个代码del也不好做,因为到处都是指针 ...

我照这个尝试了一下,它会出现动画第一遍显示,第二遍就不动了的情况,而且也不是无限轮播,好像还是会停
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-19 08:58:14 | 显示全部楼层
JasonGu 发表于 2023-7-18 20:56
出现不了界面肯定是实现有问题,我的多界面就是这么操作的,第一次切换界面的时候创建,后面都只用load到 ...

就是有问题我才求助......我要能解决,就不问了
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-19 11:32:15 | 显示全部楼层
SAmomolin 发表于 2023-7-19 08:57
我照这个尝试了一下,它会出现动画第一遍显示,第二遍就不动了的情况,而且也不是无限轮播,好像还是会停

发下代码,就发main.c的
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-19 11:44:30 | 显示全部楼层
修改过后的main代码

main.c

6.79 KB, 下载次数: 3

回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-19 11:45:00 | 显示全部楼层
baobao5 发表于 2023-7-19 11:32
发下代码,就发main.c的

已发,在其他楼,麻烦大佬了
回复

使用道具 举报

4

主题

31

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2023-7-19 16:39:50 | 显示全部楼层
baobao5 发表于 2023-7-19 11:32
发下代码,就发main.c的

这个解决了,现在只有最后一个问题就是有一个界面的动画只在第一次播放的时候动,第二次切到的时候就不播放了,次数设置的是无限次播放,再求教一下
回复

使用道具 举报

3

主题

47

回帖

56

积分

初级会员

积分
56
发表于 2023-7-19 17:33:42 | 显示全部楼层
SAmomolin 发表于 2023-7-19 16:39
这个解决了,现在只有最后一个问题就是有一个界面的动画只在第一次播放的时候动,第二次切到的时候就不播 ...

加点打印分析吧,看看动画回调函数有没有在定时执行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 01:19 , Processed in 0.291347 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表