OpenEdv-开源电子网

 找回密码
 立即注册
查看: 11033|回复: 16

LVGL移植FreeRTOS+UCOSIII

[复制链接]

11

主题

314

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1039
金钱
1039
注册时间
2020-7-21
在线时间
258 小时
发表于 2021-3-8 17:53:27 | 显示全部楼层 |阅读模式
本帖最后由 DFY 于 2021-3-8 18:19 编辑

基于正点原子的探索者FreeRTOS/UCOSIII/LVGL工程上面移植的

步骤:1.添加lv_tick_inc                   2.建立任务循环调用lv_task_handler()

LVGL需要一个心跳,通过在定时器中断中调用lv_tick_inc()函数告诉LVGL的心跳时间。
lv_tick_inc()的参数代表心跳是多少ms,例如定时器是1ms产生中断的,那么lv_tick_inc(1);

原子裸机实验是通过1ms定时调用lv_tick_inc(1)就可以了。那么在操作系统中如何调用?

了解操作系统的开发人员知道,一般操作系统使用滴答定时器中断提供心跳给操作系统。
这样我们可以在滴答定时器中断里面调用lv_tick_inc函数提供心跳给LVGL。原子移植的
UCSOIII操作系统是5ms产生一次中断,FreeRTOS是1ms产生一次中断,那么它们在滴答
中断分别是lv_tick_inc(5)  和 lv_tick_inc(1)。

有了心跳,接着建立一个任务里面循环调用lv_task_handler(),延时5ms。(官方说计时并不严格,但应保持大约5毫秒,以保持系统响应速度)



一、UCOSIII:

1.delay.c


void SysTick_Handler(void)
{        
        if(delay_osrunning==1)                                        //OS开始跑了,才执行正常的调度处理
        {
                OSIntEnter();                                                //进入中断
                OSTimeTick();                                               //调用ucos的时钟服务程序

                lv_tick_inc(5);                          //  提供心跳给LVGL

                OSIntExit();                                                //触发任务切换软中断
        }
}


2.maic.c文件

//任务优先级
#define LVGL_TASK_PRIO                4
//任务堆栈大小        
#define LVGL_STK_SIZE                 512
//任务控制块
OS_TCB LVGLTaskTCB;
//任务堆栈        
CPU_STK LVGL_TASK_STK[LVGL_STK_SIZE];
//任务函数
void LVGL_task(void *p_arg);



void LVGL_task(void *p_arg)
{
        OS_ERR err;
        p_arg = p_arg;
        
        //通过TEST_NUM的值来选择运行不同的例程
        #if(TEST_NUM==1)
                demo_create();                        
        #elif(TEST_NUM==2)
                lv_test_theme_1(lv_theme_night_init(210, NULL));
        #else
                lv_test_theme_2();
        #endif
        while(1)
        {
                tp_dev.scan(0);
                lv_task_handler();
                OSTimeDlyHMSM(0,0,0,5,OS_OPT_TIME_HMSM_STRICT,&err); //延时5ms
        }
}



二、FreeRTOS:

1.delay.c
void SysTick_Handler(void)
{        
    if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
    {
        lv_tick_inc(1);    //  提供心跳给LVGL
        xPortSysTickHandler();        
    }
}

2.maic.c文件
//任务优先级
#define LVGL_TASK_PRIO                3
//任务堆栈大小        
#define LVGL_STK_SIZE                 512     
//任务句柄
TaskHandle_t LVGLTask_Handler;
//任务函数
void LVGL_task(void *pvParameters);





#define TEST_NUM                3   //1,2,3分别对应三个演示例程
//LVGL任务函数
void LVGL_task(void *pvParameters)
{
        
      //通过TEST_NUM的值来选择运行不同的例程
      #if(TEST_NUM==1)
                demo_create();                        
      #elif(TEST_NUM==2)
                lv_test_theme_1(lv_theme_night_init(210, NULL));
     #else
                lv_test_theme_2();
     #endif
    while(1)
    {
        tp_dev.scan(0);
        lv_task_handler();
        vTaskDelay(5);
    }
}

因为工程是在操作系统上面添加LVGL代码的,具体的添加步骤就不详细说了
(可以参考 操作系统移植教程 和 LVGL裸机移植教程 )

在这里提一下:
①任务的堆栈要开大一点,例如512,不然会死机。
②官方说LVGL线程是默认不安全的,如果涉及多个任务调用LVGL函数,会出现问题,要加互斥锁。

lv_tick_inc说明:https://docs.lvgl.io/latest/en/html/porting/tick.html#api
线程不安全:https://docs.lvgl.io/latest/en/h ... l#tasks-and-threads
lv_lv_task_handler说明:https://docs.lvgl.io/latest/en/html/porting/task-handler.html

开发手册:
littleVGL开发手册指南.rar (15.57 MB, 下载次数: 810)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2021-8-2
在线时间
16 小时
发表于 2022-3-15 20:15:12 | 显示全部楼层
原来是堆栈开太小了 所以一直卡死 发现问题还是得来论坛上找百度翻了一下午还不如论坛10分钟
回复 支持 1 反对 0

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2020-1-12
在线时间
21 小时
发表于 2021-4-29 10:43:49 | 显示全部楼层
6666666
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2020-9-24
在线时间
24 小时
发表于 2021-5-10 20:59:05 | 显示全部楼层
太强了,谢谢大佬
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2018-7-27
在线时间
19 小时
发表于 2021-6-7 16:55:13 | 显示全部楼层
①任务的堆栈要开大一点,例如512,不然会死机。  

我的死机问题,在你这里找到了,谢谢。。
回复 支持 反对

使用道具 举报

11

主题

314

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1039
金钱
1039
注册时间
2020-7-21
在线时间
258 小时
 楼主| 发表于 2021-6-18 20:38:53 | 显示全部楼层
hezhenghedao 发表于 2021-6-7 16:55
①任务的堆栈要开大一点,例如512,不然会死机。  

我的死机问题,在你这里找到了,谢谢。。

O(∩_∩)O好的
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2021-4-3
在线时间
15 小时
发表于 2021-10-18 16:38:10 | 显示全部楼层
你好大佬,在LVGL相关回调函数(例如:按键回调)里面使用freertos的API(例如:设置事件标志位或者清除事件标志位)需要加什么相关的保护吗?我不知道应该加什么的保护,现在一旦调用使用串口会打印:Error:..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,436  我百度了一下不知道对不对,好像大概的意思就是:在不受freertos管理的中断服务函数里面调用了freertos的API函数
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2021-4-3
在线时间
15 小时
发表于 2021-10-18 17:36:53 | 显示全部楼层
已解决! 程序使用了DMA传输,且中断优先级为8(超过我FREERTOS管理的最高优先级)。因为怕被打断所以加了临界断保护,现在去掉就行了
回复 支持 反对

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2021-9-30
在线时间
6 小时
发表于 2021-10-20 10:59:49 | 显示全部楼层
求助  :FreeRTOS+LVGL+F407的工程
编译报错 :   \lv_font\lv_font_roboto_16.c(2246): error:  #69: integer conversion resulted in truncation

.kern_dsc = &kern_pairs,

源码区:
/*Store all the custom data of the font*/
static lv_font_fmt_txt_dsc_t font_dsc = {
    .glyph_bitmap = gylph_bitmap,
    .glyph_dsc = glyph_dsc,
    .cmaps = cmaps,
    .cmap_num = 2,
    .bpp = 4,

    .kern_scale = 16,
    .kern_dsc = &kern_pairs,
    .kern_classes = 0
};
回复 支持 反对

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
35
金钱
35
注册时间
2021-11-14
在线时间
8 小时
发表于 2021-11-17 18:13:42 | 显示全部楼层

你好大佬,在LVGL相关回调函数 求助  :UCOSiii+LVGL+F407的工程

//事件回调函数
static void event_handler(lv_obj_t * obj,lv_event_t event)
{
        OS_ERR err;
//        const char * btn_title = NULL;
    uint16_t btn_id;
    if(event==LV_EVENT_VALUE_CHANGED)
        {

        //btn_title = lv_btnm_get_active_btn_text(obj);
        btn_id = *((uint16_t*)lv_event_get_data());
      
        switch(btn_id)
        {
            case 0:
                        {
                                dgb_printf_safe("%d\r\n",btn_id);
                                OSQPost(&g_queue,"0",strlen("0"),OS_OPT_POST_FIFO,&err);
                                break;
            }
            default:break;
        }

    }
}
在回调函数里面发送消息队列,只能发一次之后程序就进入空闲任务了,也试过在任务里面发消息队列一样的问题,有没有遇到这种问题呢,我试过不是ucosiii的问题,我用物理按钮就可以正常的发送消息队列
回复 支持 反对

使用道具 举报

3

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2019-7-21
在线时间
61 小时
发表于 2022-3-6 20:18:30 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2022-3-13
在线时间
1 小时
发表于 2022-3-13 01:11:44 来自手机 | 显示全部楼层
大佬,f103不带os移植lvgl,使用外部sram显示白屏什么情况
回复 支持 反对

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6077
金钱
6077
注册时间
2018-6-27
在线时间
524 小时
发表于 2022-4-8 09:58:40 | 显示全部楼层
学习学习,学习学习。
回复 支持 反对

使用道具 举报

16

主题

103

帖子

0

精华

高级会员

Rank: 4

积分
830
金钱
830
注册时间
2020-7-1
在线时间
110 小时
发表于 2022-5-18 22:16:02 | 显示全部楼层
问个问题: 我想使用LVGL图形界面,实现按下一个button,MCU控制执行一系列流程:开继电器1、继电器2,延时5s;关闭继电器1,延时4s;关闭继电器2,延时3s。 这个循环流程 是每一次按下button 都能走一遍。 以LVGL本身的任务管理 是不是不能完成啊,我看例程里,图形界面是靠whilie1里的lv_task_handler()保证刷新率和响应的。 如果要让屏幕保证刷新,且随时能按下button后执行我的控制流程, 必须要上RTOS吗?
刚跨过大门,入眼是海洋
回复 支持 反对

使用道具 举报

3

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2021-7-31
在线时间
34 小时
发表于 2022-7-26 15:08:37 | 显示全部楼层
大佬,我LVGL V6移植到UCOSIII上后老是隔几秒就会有一次明显的刷新链接:[url]https://pan.baidu.com/s/1ykLUgd2-7hOJV2OL3_JnsQ  提取码:1111[/url]
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-7-11
在线时间
8 小时
发表于 2022-9-12 19:24:59 | 显示全部楼层
原子哥,这里编译ram大于芯片ram值192K了,为什么还能运行?
捕获.JPG
回复 支持 反对

使用道具 举报

1

主题

232

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3312
金钱
3312
注册时间
2015-4-19
在线时间
364 小时
发表于 2022-12-26 11:29:15 | 显示全部楼层
谢谢分享!
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 16:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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