打印
[其他ST产品]

实时操作系统FreeRTOS + LVGL图形库

[复制链接]
3600|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
o88ne|  楼主 | 2023-6-27 19:02 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

我又来了!这部分我加入了实时操作系统FreeRTOS,话不多说,直接开始移植。

首先打开我之前的工程,点一下全局编译(rebuild),确保无错:



然后打开cubemx,找到中间件Middleware的FREERTOS,选择CMSIS_V2:

然后会蹦出一堆参数,先别急,我们只需要修改少数几个参数就行。


使用特权

评论回复
沙发
o88ne|  楼主 | 2023-6-27 19:02 | 只看该作者
首先在Kernel setting(内核设置)中找到USE_MUTEXES,确保其为Enable;这是一个宏定义,作用是使能mutex——互斥信号量,待会要用到:


使用特权

评论回复
板凳
o88ne|  楼主 | 2023-6-27 19:03 | 只看该作者
接下来去创建LVGL任务:

使用特权

评论回复
地板
o88ne|  楼主 | 2023-6-27 19:04 | 只看该作者
第一个是任务句柄的名字,随便取都可以,最好能够简洁地表示意思;第二个是任务优先级,这里我设置得比defaultTask高一级;第三个是任务堆栈大小,单位是字(Words),可以尽量给高一些,到时候可以在程序里面用获取高水位值的函数来读取任务剩余堆栈大小,就可以根据需求来调整堆栈大小(1024个words就是1024 * 4 = 4096个bytes);第四个是任务调用的函数名字,也可以随便取,最好跟任务句柄挂钩方便确认;然后下面的参数保持默认即可:

使用特权

评论回复
5
o88ne|  楼主 | 2023-6-27 19:05 | 只看该作者
接下来去创建一个互斥锁,因为LVGL是线程不安全的,所以需要一个互斥锁来避免出错(可以简这样简单地理解:当一个任务在访问LVGL中的变量,如果另外一个任务来修改了LVGL中的变量,那么就会导致变量值不确定,从而导致错误的结果)



使用特权

评论回复
6
o88ne|  楼主 | 2023-6-27 19:05 | 只看该作者
最后去修改一下堆栈大小(这里提一下,一般正常用的话给个几k就可以了,假如程序报错,再改),接着生成代码:

使用特权

评论回复
7
o88ne|  楼主 | 2023-6-27 19:06 | 只看该作者
然后就出现了一个警告:


这是因为用了FreeRTOS之后,RTOS默认使用Systick来作为时基单元,而HAL库也默认用了Systick来作为时基单元,二者冲突了,有可能导致出错(具体出说明错我也不太清楚,反正既然报了警告的话咱就去改一下)。

使用特权

评论回复
8
o88ne|  楼主 | 2023-6-27 19:06 | 只看该作者
点击No,回到cubemx工程面板,找到HAL库时基配置面板,如下:

使用特权

评论回复
9
o88ne|  楼主 | 2023-6-27 19:06 | 只看该作者
可以随便选一个定时器作为HAL库的时基单元,这里我选了定时器6,接着生成代码:

使用特权

评论回复
10
o88ne|  楼主 | 2023-6-27 19:07 | 只看该作者
打开keil,先不点编译,首先打开delay.c文件,把第6行注释,第7行放出来,接着修改10,11行,选择HAL库时钟为htim6(因为我刚刚选了定时器6),让延时函数能够正常运行:

使用特权

评论回复
11
o88ne|  楼主 | 2023-6-27 19:07 | 只看该作者
接着打开lv_conf.h文件,找到88行,这次我们用systick的钩子函数来提供lvgl心跳,所以这里直接把LV_TICK_CUSTOM取消掉 :

使用特权

评论回复
12
o88ne|  楼主 | 2023-6-27 19:09 | 只看该作者
然后打开freertos.c文件,往下找到84行的钩子函数:

使用特权

评论回复
13
o88ne|  楼主 | 2023-6-27 19:09 | 只看该作者
在这里添加LVGL的心跳(记得先去前面include一下lvgl.h):

使用特权

评论回复
14
o88ne|  楼主 | 2023-6-27 19:09 | 只看该作者
接着往下找到LVGL的任务函数:

使用特权

评论回复
15
o88ne|  楼主 | 2023-6-27 19:09 | 只看该作者
前面说了,LVGL线程不安全,需要互斥锁来互斥访问变量,FreeRTOS中获取互斥锁的函数为xSemaphoreTake,这是一个宏函数,但是当我输入这个函数的时候报错,说函数无定义,这是因为没有包含特定头文件的缘故:

使用特权

评论回复
16
o88ne|  楼主 | 2023-6-27 19:11 | 只看该作者
其实这个宏函数包含在头文件semphr.h里面,包含进来即可:

使用特权

评论回复
17
o88ne|  楼主 | 2023-6-27 19:11 | 只看该作者
可以看到需要两个参数,第一个是互斥量的句柄,第二个是等待的时间,选择一直等待即可,也就是只有当前任务拿到了互斥量,才去访问LVGL,否则不访问LVGL:

使用特权

评论回复
18
o88ne|  楼主 | 2023-6-27 19:12 | 只看该作者
然后进行触摸扫描以及lvgl的处理函数;结束之后还要通过 xSemaphoreGive函数来释放互斥量,等待下一次调用;xSemaphoreGive函数只有一个参数,就是传进去互斥量的句柄即可;最终函数如下:

使用特权

评论回复
19
o88ne|  楼主 | 2023-6-27 19:12 | 只看该作者
接下来还有最后一步,打开touch.c文件,找到63行TP_Read_AD函数,将整个代码加入任务切换的临界段,也就是扫描的时候不进行任务切换(需要先在前面include FreeRTOS.h以及task.h):

使用特权

评论回复
20
o88ne|  楼主 | 2023-6-27 19:13 | 只看该作者
然后编译: 下载后发现可以和之前裸机得到一样的效果!

链接:https://pan.baidu.com/s/1b_BXxAG-H7g7vDL5tgahIA
提取码:0xFF

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

418

帖子

3

粉丝