Guix text_button 设置文字,报错 0x30

需求 需要设置 text_button 上面显示的文字的时候,报错 "GX_SYSTEM_MEMORY_ERROR : (0x30) 未定义内存分配器或内存分配失败。" 解决 分析 debug 仔细追查,发现 _gx_text_button_text_set_ext 这个函数里面会判断有没有设置 private text copy, 如果设置了,那么再检查有没有开启 _gx_system_memory_allocator, 如果没有,那么就会报错 0x30 了。 解决方法 有两种解决方法: 无 private text copy + 无 gx_system_memory_allocator_set(memory_allocate, memory_free), 会直接使用传入进去的字符串参数,只要传入进去的不是局部变量,就没有必要勾选 private text copy. 有 private text copy + 有 gx_system_memory_allocator_set(memory_allocate, memory_free), 也可以,会多复制一份数据。 参考 第 4 章 - GUIX 服务说明 {ThreadX全家桶} GUIX sample 错误–>gx_prompt_text_set_ext大坑,必须正确指定有效字符串长度才可以使用

<span title='2023-11-30 16:32:00 +0800 CST'>2023-11-30</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;56 words&nbsp;·&nbsp;RamLife

Guix 是否使用显存方案选择

需求 使用 guix,是否需要显存? 显存需要多大? 解决 是否需要显存? gui 显示一般就是两种方式,直驱或者显存刷新。 直驱 直驱的意思是,程序中界面需要变化时,直接向显示设备中对应的区域写入新的数据。 好处是: 不需要显存,那里变化改那里。适合于 RAM 小的情况。 坏处是: 因为没有显存,所以在更新时经历这样的过程: 1. 先清除相关区域; 绘制背景; 3. 绘制前景. 这种多步骤的实现方式,加上小容量 RAM 一般 使用的是接口屏本身的速度限制,很容易会造成整体时间过长,人眼看上去容易有闪烁和撕裂的情况。也就是闪屏的情况。 显存 显存的意思是,程序中界面需要变化时,把需要更新的数据先更新到显存中,然后 gui 会一次把最终结果写入到屏幕。 好处是: 这种情况下屏幕更新需要的时间很短,只有直驱的 1/3,显示稳定,没有闪烁的情况。 坏处是: 需要 RAM 足够大,能够容纳整个屏幕,这样才能作为显示缓冲来工作。 总结 如果 RAM 够大,推荐显存方式,不闪屏,体验好。如果 RAM 小,屏幕小,用户对于显示效果不敏感,就可以使用直驱方案。 显存容量计算 显存占用的 RAM 计算方式: 屏幕长 * 屏幕宽 * 单个像素点字节数。 比如: 320 * 240 的屏幕,使用 16bit 位宽的像素,那么显存大小就是 320 * 240 * 16 / 8 = 153.6 kB. 并且使用 gui + 显存的方案,一般会搭配 DAM2D 来加快数据传输,包括新数据写入显存,以及显存通过 fmc 更新到屏幕。...

<span title='2023-11-17 16:32:00 +0800 CST'>2023-11-17</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;90 words&nbsp;·&nbsp;RamLife

Guix 移植

需求 使用 stm32cubeide 移植 guix 到 stm32u575 上面。 解决 简单界面设计 下载 guix studio 按照例子做个最简单界面 导出 resource 和 specification 源码 下载 guix studio 对应版本源码 把源码中的 common 整个文件夹放到工程中 把源码中的 port 中相应架构的 gx_port.h 放到工程中 开启 GX_INCLUDE_USER_DEFINE_FILE, 把 guix studio 的例子中的 gx_user.h 复制到工程中。 板级相关 在 port 文件夹中新增 gx_display_driver_rgb565_stm32u575 相关源文件和头文件。 在文件中新增: UINT GuixDriverSetupRgb565(GX_DISPLAY *display) { LcdInit(); _gx_display_driver_565rgb_setup(display, (VOID*)GUIX_SCREEN_HANDLE, GuixBufferToggleRgb565); display -> gx_display_driver_horizontal_line_draw = GuixHorizontalLineDirectDrawRgb565; display -> gx_display_driver_vertical_line_draw = GuixVerticalLineDirectDrawRgb565; display -> gx_display_driver_pixel_write = GuixPixelDirectWriteRgb565; display -> gx_display_driver_pixel_blend = GuixPixelDirectBlendRgb565; // display -> gx_display_driver_buffer_toggle = stm324xg_16bpp_buffer_toggle; display -> gx_display_handle = GUIX_SCREEN_HANDLE; return(GX_SUCCESS); } 新增上面相关的这些画点和线的函数。 线程 新增线程函数, 其中设置都是和 guix studio 导出的文件相关的。 GX_WINDOW *pScreen; GX_WINDOW_ROOT *root; void GuixMainEntry(ULONG thread_input) { (void)thread_input; gx_system_initialize(); // gx_system_memory_allocator_set(memory_allocate, memory_free); gx_studio_display_configure(PRIMARY, GuixDriverSetupRgb565, LANGUAGE_ENGLISH, PRIMARY_THEME_1, &root); gx_studio_named_widget_create((char *)"Button_Screen", (GX_WIDGET *)root, (GX_WIDGET **)&pScreen); gx_widget_show(root); gx_system_start(); while (1) { tx_thread_sleep(20); } } 把线程函数添加到启动线程中即可。 参考 {ThreadX全家桶} ThreadX GUIX直驱方案搞定,任何显示屏,低资源的MCU都可以跑了,不再需要画布,附工程下载 {ThreadX全家桶} 第3版emWin教程和ThreadX GUIX教程开工,双管齐下,GUIX更新至第30章,emWin更新至第57章(2022-04-04)

<span title='2023-11-16 16:32:00 +0800 CST'>2023-11-16</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;134 words&nbsp;·&nbsp;RamLife