单片机怎么渲染 Markdown?从一个控件到流式引擎
GT-HMI 渲染 Markdown 的两条代码路径:gt_markdown 控件五行代码渲染静态内容,GT-MD 自研流式引擎接 AI 逐段输出,峰值内存与全文长度无关。附最小可跑示例与字库接入说明。
你的设备要上 AI 对话功能,大模型的回答是一段 Markdown——标题、列表、加粗、引用块。你的 MCU 屏要把它排得像个样子,而不是把 # 和 * 原样糊上去。
如果你在用 GT-HMI,这件事有两条代码路径可以走:GUI 工程里用 gt_markdown 控件,或者直接调 GT-MD 流式引擎。这篇把两条路的最小可跑代码都给你,代码全部摘自 GT-HMI-Engine 开源仓库与官方手册,可以照着编。
MCU 渲染 Markdown:左边纯文本原样上屏,右边渲染后结构清晰
路径一:gt_markdown 控件,五行代码
如果你的界面本来就建在 GT-HMI 的控件体系上,Markdown 就是一个普通控件:
// 在屏幕上创建一个 MarkDown 控件
gt_obj_st *md = gt_markdown_create(screen_home);
gt_obj_set_pos_relative(md, screen_home, 31, 28);
gt_obj_set_size(md, 424, 267); // 注意:set_text 必须在 set_size 之后
// 设置文本,立即渲染
const char *text = "## 解题思路\n\n1. **先求判别式**\n2. 代入求根公式\n";
gt_markdown_set_text(md, text, strlen(text));
标题、列表、粗体直接渲染。控件支持大/中/小三级字体配置(对应标题、次级标题、正文),每级独立设置字库和字号:
gt_font_info_st font_large = {
.family = _16_dian_zhen_zhong_wen__ji_chu_, // 字库 ID
.cjk = 0,
.size = 16,
};
gt_markdown_set_font_info_large(md, &font_large);
控件基于成熟的开源 md4c 组件做了嵌入式深度优化,适合静态或整段更新的内容——配置界面、帮助文档、固件内置说明页,都走这条路。
路径二:GT-MD 流式引擎,接 AI 输出
真正的重头戏是 AI 场景:大模型一边生成,屏幕一边排版。GT-MD 是高通自研的流式渲染引擎,纯 C、无 OS 依赖,不绑定任何 GUI 框架——你注入两个回调,它就能在任何帧缓冲上画。
初始化(系统启动时执行一次):
// 字库回调:布局阶段按 Unicode 码点查询字形尺寸
gt_latex_font_register(my_font_get, NULL);
// 绘制回调:渲染阶段自取位图绘制(画线回调用于引用块、分隔线)
gt_latex_render_register(my_draw_glyph, my_draw_hline,
my_draw_line, NULL);
整段渲染(静态文本):
uint16_t w, h;
gt_md_get_size(text, len, &w, &h, 240); // 先取排版尺寸
gt_latex_canvas_t canvas = {
.x = 0, .y = 0,
.fg_color = 0x000000,
.ys = 0, .ye = 0, // 垂直裁剪,滚动时只画可见区
};
gt_md_draw(text, len, &canvas, 240); // 绘制到画布
流式渲染(AI 逐段上屏):
int16_t cur_y = 0;
// AI 每返回一小段就调一次
void on_ai_chunk(const char *chunk, uint16_t len)
{
gt_latex_canvas_t canvas = { .x = 0, .y = cur_y,
.fg_color = 0x000000 };
gt_md_draw_stream(chunk, len, &canvas, 240); // 逐块流式渲染
uint16_t w, h;
gt_md_get_size_stream(chunk, len, &w, &h, 240);
cur_y += h; // 高度累加
}
流式接口逐块处理,峰值内存只与单个 Markdown 块(一个段落、一个列表项)有关,与全文长度无关——这是它能在 KB 级内存的 MCU 上跑长文本的关键。还有一组逐块迭代器 API(gt_md_line_iter_*),y 偏移自动累加,适合更底层的定制。
字库从哪来?
两条路径的字体最终都落到同一套接口上,这也是 GT-HMI 作为字库原厂方案的天然之处:
- 控件路径:
family字段填高通字库 ID(GT-HMI Designer2 工程里可视化配置后自动生成),点阵、矢量、灰度字库随选; - 引擎路径:
gt_latex_font_register注册的回调由你自己实现——用高通字库芯片就按字库 ID 索引取模,用自有字库就在回调里返回你自己字库的字形尺寸与位图。引擎的渲染层完全不介入字库数据,接口是干净的。
标题、正文、注释的字号层级通过字体级别配置(gt_latex_font_level_t)下发,Markdown 排版的质量上限,取决于你给它配的字库质量。
裁剪与体积
GT-MD 的每个语法特性都有独立编译开关(GT_MD_CFG_ENABLE_*):标题、列表、代码块、引用块、粗斜体、删除线、内嵌 LaTeX 公式……用不到的置 0,ROM 不浪费一个字节。列表嵌套深度、单行长度等约束也都是编译期宏,可按目标平台收紧。
小结
静态内容用控件,五行代码;AI 流式输出用 GT-MD,两个回调加一个流式调用。两条路都在 MIT 协议开源的 GT-HMI-Engine 仓库里,完整的 API 参考和错误码说明见官网文档中心《GT-HMI Engine 用户手册》"GT-MD 流式渲染引擎"一章。
高通(GENITOP)始于 1992 年,深耕汉字信息处理与嵌入式 GUI 技术,字库覆盖全球 180+ 国家语言。
完整 API 参考与流式接入指南见《GT-HMI Engine 用户手册》GT-MD 章节。
前往查看