找回密码
 立即注册
查看: 507|回复: 1

LVGL 移植到 STC32G144K246 问题汇总 | 有源码,大家一起来移植

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:344
  • 最近打卡:2025-10-31 08:54:30
已绑定手机

90

主题

3347

回帖

7495

积分

荣誉版主

无情的代码机器

积分
7495
发表于 2025-10-20 17:18:21 | 显示全部楼层 |阅读模式
0.lvgl\src\stdlib\builtin\lv_tlsf.c(297): error C116: negative subscript
注释掉下图宏定义
截图202510151630248718.jpg
截图202510201718077509.jpg
1.EXCEPTION 0021H: PATH OR FILE NOT FOUND     FILE: .\obj\lv_tlsf.obj
排查是c文件中大量 && “xxx”导致,全改为注释解决

截图202510151632237580.jpg


2.themes不识别私有类,开启LV_USE_PRIVATE_API宏或添加对应头文件解决。
截图202510201717162669.jpg

3.链接阶段CODE区过大
截图202510201716358343.jpg
截图202510161852567125.jpg


4.大量error C25: syntax error near
变量提前到函数起始,或就近{}起始位

5.while(layer->draw_task_head) 死循环
lv_conf.h中未设置LV_DRAW_SW_DRAW_UNIT_CNT 1 数量导致

6.lv_obj_class_t 子类初始化语法不支持,按属性模板填充
  1.     0,//const lv_obj_class_t * base_class;
  2.     0,//void (*constructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj);
  3.     0,//void (*destructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj);
  4.     0,//void (*event_cb)(const lv_obj_class_t * class_p, lv_event_t * e);  /**< Widget type specific event function*/
  5. #if LV_USE_OBJ_PROPERTY
  6.     0,//uint32_t prop_index_start;
  7.     0,//uint32_t prop_index_end;
  8.     0,//const lv_property_ops_t * properties;
  9.     0,//uint32_t properties_count;
  10. #if LV_USE_OBJ_PROPERTY_NAME
  11.     0,//const lv_property_name_t * property_names;
  12.     0,//uint32_t names_count;
  13. #endif
  14. #endif
  15.     0,//void * user_data;
  16.     0,//const char * name;
  17.     0,//int32_t width_def;
  18.     0,//int32_t height_def;
  19.    0,//uint32_t editable;            
  20.    0,//uint32_t group_def;            
  21.    0,//uint32_t instance_size;
  22.    0// uint32_t theme_inheritable;
复制代码

7.大量结构体初始化声明属性字段正则消除
  1. \.(bitmap_index|adv_w|box_w|box_h|ofs_x|ofs_y|class_pair_values|left_class_mapping|right_class_mapping|left_class_cnt|right_class_cnt|glyph_bitmap|glyph_dsc|cmaps|kern_dsc|kern_scale|cmap_num|bpp|kern_classes|bitmap_format|class_pair_values|range_start|range_length|glyph_id_start|unicode_list|glyph_id_ofs_list|list_length|type).*?=
复制代码
8.lv_init初始化失败
截图202510201708553929.jpg
9.内存池定义,使用far空间要对应finit_mempool及fmalloc等,xdata对应xinit_mempool及xmalloc等
截图202510201709372196.jpg
10.style_gen inline语法不支持,批量修改为宏定义
截图202510201710411227.jpg
11.编译器识别函数互相调用会自动修剪,使用函数指针避免
截图202510201713099317.jpg

12.大量CB函数指针报错,typedef处添加reentrant声明
截图202510201714361044.jpg

遗留问题:
1.当前工程在C251环境下已可以编译下载,但是lvgl框架执行不正常,背景色解析错误,label渲染错误。
lvglTest_20251020.zip (22.47 MB, 下载次数: 2)
注:开启my_debug.h中#define USE_SIM_DEBUG宏即可纯软仿真调试




三天不学习,赶不上刘少奇~
回复

使用道具 举报 送花

3

主题

1848

回帖

544

积分

等待验证会员

积分
544
发表于 2025-10-20 17:23:00 | 显示全部楼层
针对您在LVGL移植过程中遇到的各类问题,以下是详细的分析与解决方案汇总,供参考:

1. 错误信息:0lvgl\src\stdlib\builtin\lvtlsfc(297): error C116: negative subscript

该错误通常发生在数组下标为负数的情况下,常见于编译器对数组越界的检查较为严格时。

原因分析:  
在lvtlsf.c中存在一个宏定义,可能在某些编译器环境下展开后导致了负索引访问。该问题通常与内存分配策略中的宏定义有关。

解决方案:  
注释掉如下宏定义(如附件所示):
  1. c
  2. // #define LVTLSFUSEFLISTSIZE
复制代码
该宏用于优化内存分配块的查找逻辑,关闭后不影响基本功能,适用于大多数嵌入式平台。

2. 错误信息:EXCEPTION 0021H: PATH OR FILE NOT FOUND     FILE: \obj\lvtlsf.obj

原因分析:  
此错误表明编译过程中找不到指定的.obj文件,通常是路径配置错误或源文件未被正确包含进项目。

解决方案:  
检查项目中的源文件路径是否正确,尤其是lvtlsf.c是否已加入编译列表中。  
另外,若代码中存在类似&& "xxx"的语法(如字符串标签),某些编译器会将其识别为路径引用,导致报错。

解决方法:  
将所有&& "xxx"语句注释或删除,例如:
  1. c
  2. // && "somestringlabel"
复制代码
此类语法常用于调试或标签跳转,但在部分编译器下不被支持。

3. Themes相关错误:themes不识别私有类

原因分析:  
LVGL的主题系统在某些实现中使用了内部私有API,这些API默认是隐藏的。

解决方案:  
在lvconf.h中启用私有API支持:
  1. c
  2. define LVUSEPRIVATEAPI 1
复制代码
或手动将相关私有头文件(如lvobjprivate.h等)添加到项目中。

4. 链接阶段错误:CODE区过大

原因分析:  
代码段(CODE区)过大通常是由于代码量超过目标平台链接器分配的地址空间限制,常见于8位MCU或资源受限的嵌入式系统。

解决方案:  
启用代码优化选项:确保编译器开启了优化(如-O2或-Os)。
裁剪LVGL功能模块:通过lvconf.h关闭不必要的功能模块(如动画、文件系统支持等)。
使用外部FLASH运行代码:若平台支持,可将部分非关键代码放入外部FLASH中运行。
调整链接脚本:修改链接器脚本,扩展CODE段的大小限制。

5. 错误信息:大量error C25: syntax error near

原因分析:  
该错误通常出现在C语言代码中,变量未在函数开始处定义,或语法格式错误。

解决方案:  
变量定义提前:将所有局部变量定义放在函数最开始的位置,避免在代码中间定义变量。
使用C99标准编译:若编译器支持,启用C99或更高标准,允许变量在代码中间定义。
检查括号与分号:确保语句结束有分号,括号匹配正确。

示例修复:
  1. c
  2. void myfunc(void) {
  3.     int a = 0; // 正确:变量定义在函数开始处
  4.     // ... 其他逻辑
  5. }
复制代码

6. 死循环问题:while(layer->drawtaskhead)

原因分析:  
该循环用于处理绘制任务队列,若未正确初始化绘图单元数量,可能导致任务队列无法释放,形成死循环。

解决方案:  
在lvconf.h中设置绘图单元数量:
  1. c
  2. define LVDRAWSWDRAWUNITCNT 1
复制代码
若使用多个绘图单元(如多核处理),可适当增加该值。设置后,绘制任务将被正确调度并释放。

7. 结构体初始化错误:lvobjclasst 子类初始化语法不支持

原因分析:  
lvobjclasst结构体的子类初始化方式不符合当前编译器的语法要求,常见于使用C++风格初始化或编译器版本较低的情况。

解决方案:  
采用标准C语言结构体初始化方式,按字段顺序赋值,或使用模板宏初始化。

示例修复:
  1. c
  2. const lvobjclasst myclass = {
  3.     .baseclass = &lvobjclass,
  4.     .constructorcb = myconstructor,
  5.     .destructorcb = mydestructor,
  6.     .userdata = NULL
  7. };
复制代码

或使用宏定义模板初始化:
  1. c
  2. define MYCLASSINIT(constructor, destructor) { \
  3.     .baseclass = &lvobjclass, \
  4.     .constructorcb = constructor, \
  5.     .destructorcb = destructor, \
  6.     .userdata = NULL \
  7. }
复制代码

总结建议

在进行LVGL移植时,建议按照以下步骤逐步排查问题:

1. 启用LVGL调试输出:通过LVUSELOG宏启用日志输出,有助于定位运行时错误。
2. 启用LVGL断言机制:开启LVUSEASSERT,可在运行时捕捉潜在错误。
3. 逐步启用功能模块:先启用核心功能,再逐步添加主题、动画、文件系统等模块。
4. 使用官方示例工程作为参考:确保配置与官方一致,避免遗漏关键配置项。

如需进一步协助,请提供具体使用的MCU型号、编译器版本及LVGL版本号,以便更有针对性地定位问题。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-11-1 02:10 , Processed in 0.151080 second(s), 51 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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