前言:
上一期我们移植了LVGL但是是裸机的,不方便进行多任务运行,于是这一期我们把前几期结合起来,做一个基于RGB_TFT移植带FreeRTOS的LVGL。这样我们只需要简单的创建任务,并且理清任务间的关系就可以很方便的完成一个项目。
1.移植FreeRTOS 到我们上期的项目中
我们重新拷贝上一期的一个工程方便给他加上操作系统。首先我们将第三期测评的工程中的FreeRTOS文件夹拷贝到现在的工程中,现在的工程目录如下所示。我们拷贝之前FreeRTOS工程中的FreeRTOSConfig.h文件到我们现在工程的User文件夹下,文件的移植就大功告成了。
更改it中的中断文件中的SysTick_Handler函数,并且删除掉SVC_Handler和PendSV_Handler函数,和之前移植FreeRTOS的测评过程一样。有需要的可以去看我之前的测评。
#include "FreeRTOS.h"
#include "task.h"
extern void xPortSysTickHandler( void );
void SysTick_Handler(void)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
{
xPortSysTickHandler();
}
}
2.分配好栈空间大小
我这里的为什么要把分配好栈空间大小提出来专门做一个小标题来将呢。因为这个板子的ram有限。我在开始移植的时候一直报错,这里我研究了很久,最后分析可能是ram分配不合理导致的。我在做完上面的步骤之后出现了下面的报错,给大家分享一下。
我在创建两个任务后,就出现了上面的报错。这两个任务时其中一个是led灯以一秒钟间隔闪烁的任务,另一个是GUI的任务。
当我单独运行led的任务时,编译没有出现这种情况,后面我仔细分析发现可能是栈分配不合理的原因。下面是我用某翻译软件翻译得出来的结果。
当我减少FreeRTOS的configTOTAL_HEAP_SIZE的容量时候我发现这个错误中的size就变少了,就比如我上面是定义的
当我定义为15 *1024时候,错误中的size大小如下
显而易见我只要把这个地方变为0错误就没有了,于是我调整了main函数的栈大小和这里的FreeRTOS的栈大小,最终解决了这个问题。两个栈大小我分别定义如下的大小
遗留问题:
虽然最终我把这个问题解决了,但是我还是有点不理解,栈大小是使用的ram,而代码存储在rom当中,这之前报错也是报的一些代码文件没有地方存储个映射,如下图所示
那照这样为什么我修改ram的分配却能够解决掉这个错误呢? 我第一眼看到这个报错我也是一直认为是rom的不足。请知道的大佬麻烦分享一下我的这个疑虑。
3.编写多任务测试
上面我们已经完成全部的移植工作,这里我写了两个两个任务测试一下。也就是上面所说的led和GUI的任务。如下所示
最终测试效果如下所示:
可以看到led灯在以一秒的速率闪烁,GUI界面也在正常的显示。
总结:通过移植带操作系统的LVGL,可以方便的让GUI界面和其他任务同时运行,可以方便我们项目的快速开发。
本帖最后由 qiao--- 于 2024-1-18 18:34 编辑
引用: lugl4313820 发表于 2024-1-18 19:47 66666,有想法,有解决问题想的思路,是一个非常的程序员!
感谢版主支持
这内存不够问题我这也遇到了,按你说的在FreeRTOSConfig.h (Heapsize到10K)和启动.s文件(Heap_Size EQU 0x00011800 //有70K)调了,但降下来一点就变不动了,还是报错(.\Objects\FM33FT0xxA_Tester.axf: Error: L6407E: Sections of aggregate size 0x10118 bytes could not fit into .ANY selector(s).)。
楼主调这有啥经验对策分享下么
dirty 发表于 2024-1-26 18:02 这内存不够问题我这也遇到了,按你说的在FreeRTOSConfig.h (Heapsize到10K)和启动.s文件(Heap_Size ...
你这个和我遇到的情况一摸一样,启动文件里面的栈大小调了没,对于资源不足的单片机,栈的大小要分配的刚好合适,不然就会出现这个问题
本帖最后由 qiao--- 于 2024-1-26 18:29 编辑引用: qiao--- 发表于 2024-1-26 18:27 你这个和我遇到的情况一摸一样,启动文件里面的栈大小调了没,对于资源不足的单片机,栈的大小要分配的 ...
我用的MCU RAM 32KB,今天改了下代码,LV_MEM_SIZE分配12KB,configTOTAL_HEAP_SIZE 10KB,编译通过,RAM用了29KB,比较临界了,晚点回去开发板试下。
引用: dirty 发表于 2024-1-27 11:41 我用的MCU RAM 32KB,今天改了下代码,LV_MEM_SIZE分配12KB,configTOTAL_HEAP_SIZE 10KB,编译通过,RAM用 ...
好的