ercircle 发表于 2025-10-20 17:18:21

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

0.lvgl\src\stdlib\builtin\lv_tlsf.c(297): error C116: negative subscript
注释掉下图宏定义


1.EXCEPTION 0021H: PATH OR FILE NOT FOUND   FILE: .\obj\lv_tlsf.obj
排查是c文件中大量 && “xxx”导致,全改为注释解决




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


3.链接阶段CODE区过大




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 子类初始化语法不支持,按属性模板填充
    0,//const lv_obj_class_t * base_class;
    0,//void (*constructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj);
    0,//void (*destructor_cb)(const lv_obj_class_t * class_p, lv_obj_t * obj);
    0,//void (*event_cb)(const lv_obj_class_t * class_p, lv_event_t * e);/**< Widget type specific event function*/

#if LV_USE_OBJ_PROPERTY
    0,//uint32_t prop_index_start;
    0,//uint32_t prop_index_end;
    0,//const lv_property_ops_t * properties;
    0,//uint32_t properties_count;

#if LV_USE_OBJ_PROPERTY_NAME
    0,//const lv_property_name_t * property_names;
    0,//uint32_t names_count;
#endif
#endif
    0,//void * user_data;
    0,//const char * name;
    0,//int32_t width_def;
    0,//int32_t height_def;
   0,//uint32_t editable;            
   0,//uint32_t group_def;            
   0,//uint32_t instance_size;
   0// uint32_t theme_inheritable;
7.大量结构体初始化声明属性字段正则消除
\.(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初始化失败

9.内存池定义,使用far空间要对应finit_mempool及fmalloc等,xdata对应xinit_mempool及xmalloc等

10.style_gen inline语法不支持,批量修改为宏定义

11.编译器识别函数互相调用会自动修剪,使用函数指针避免


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



注:开启my_debug.h中#define USE_SIM_DEBUG宏即可纯软仿真调试




国芯人工智能 发表于 2025-10-20 17:23:00

针对您在LVGL移植过程中遇到的各类问题,以下是详细的分析与解决方案汇总,供参考:

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

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

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

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

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

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

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

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

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

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

解决方案:
在lvconf.h中启用私有API支持:
c
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或更高标准,允许变量在代码中间定义。
检查括号与分号:确保语句结束有分号,括号匹配正确。

示例修复:
c
void myfunc(void) {
    int a = 0; // 正确:变量定义在函数开始处

    // ... 其他逻辑
}

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

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

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

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

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

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

示例修复:
c
const lvobjclasst myclass = {
    .baseclass = &lvobjclass,
    .constructorcb = myconstructor,
    .destructorcb = mydestructor,
    .userdata = NULL
};

或使用宏定义模板初始化:
c
define MYCLASSINIT(constructor, destructor) { \
    .baseclass = &lvobjclass, \
    .constructorcb = constructor, \
    .destructorcb = destructor, \
    .userdata = NULL \
}

总结建议

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

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

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

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

ercircle 发表于 4 天前

一个异常进入draw_scrollbar的问题,坐标系边界极值溢出,宏定义应声明数据类型:



ercircle 发表于 3 天前

obj初始化后异常的style_cnt为2:




进一步分析位域解析正常,这个2应该在lv_obj_remove_style_all中清除。
排查发现LV_PART_ANY | LV_STATE_ANY值异常为0xFFFFFFFF
修改宽于16位枚举类型时只给了后缀L,应和lv_style_selector_t类型一致给UL,相关位操作枚举类型一并修改为UL宏定义:

ercircle 发表于 3 天前

刷图缓冲区头部异常字节问题:

disp->flush_cb调用disp_flush后,传参px_map地址异常改变,使用extern直接调用正常,具体原因待分析暂时这样处理



ercircle 发表于 3 天前

label不刷新问题:

layout_update_core递归函数,第二个child异常为NULL因为child_cnt被修改,此函数关联甚多,先启用全局可重入解决



ercircle 发表于 前天 14:51

*** WARNING L30: MEMORY SPACE OVERLAP
main函数被编译去了奇怪的位置,三字节地址覆盖了TMR0中断的0x8A跳转码
方法1:头文件中添加_m跳转函数扳回正常位置,顺便可解决LCALL 0x0000异常
方法2:(INTVECTOR(0x )偏移中断地址),X,02只能实现长跳转
方法3:Target选项卡中声明两个External ROM,隔离0xFEFxxx和0xFF0000,









隔离:





页: [1]
查看完整版本: LVGL 移植到 STC32G144K246 问题汇总 | 有源码,大家一起来移植