https://gitee.com/kerndev/VirtualLCD
嵌入式系统研制期间,模拟平台的价值非常关键。一个功能齐全的虚拟系统能显著增强工作效能。我们需要仔细研究运用模拟平台的缘由,并且明确怎样才能最大程度利用它的好处。
开发痛点分析
嵌入式系统编程的主要困难在于硬件关联度高。常规编程模式下,每次代码变更都要下载到设备中验证,此步骤一般耗时五到十分钟或更久。一旦出现界面异常,排错工作会变得异常复杂,往往需要反复下载才能找到症结所在。
模拟器工作原理
模拟器借助在电脑上重现设备状况,让程序创作者能迅速检查程序。关键部分有主程序文件、库文件和电脑上的开发项目。这种做法让调试过程只需十秒到三十秒,工作效能比原先强十倍到三十倍。
VirtSTM32工程 → PC调试 → 移植到真实硬件
基础开发流程
1. 绘制函数封装
跟实际硬件制造一样,起初必须打包基本的绘图函数。这些函数涵盖画点、画直线、画矩形等基本图形动作,为之后的工作打下根基。
2. 字符显示功能
// 画点函数 - 所有绘制的基础
void LCD_DrawPoint(int x, int y, PIXEL color) {
PIXEL *mem;
mem = GET_FRAMEBUFFER(x, y);
*mem = color;
}
// 画水平线 - 界面框架必备
void LCD_DrawHLine(int x1, int y1, int x2, PIXEL color) {
PIXEL *mem;
mem = GET_FRAMEBUFFER(x1, y1);
for(; x1 < x2; x1++) {
*mem++ = color;
}
}
// 画垂直线 - 分割线神器
void LCD_DrawVLine(int x1, int y1, int y2, PIXEL color) {
PIXEL *mem;
mem = GET_FRAMEBUFFER(x1, y1);
for(; y1 < y2; y1++) {
*mem = color;
mem -= LCD_WIDTH;
}
}
基础绘制功能完成后,要实现字符显示功能,这包含字库的载入和文字的渲染,是界面开发的重要步骤。
3. 测试程序创建
// 显示单个字符
void LCD_ShowChar(int x, int y, int num, int size, int mode) {
int temp, t1, t;
int y0 = y;
int csize = (size/8 + ((size%8) ? 1 : 0)) * (size/2);
num = num - ' '; // 获取字符偏移值
for(t = 0; t < csize; t++) {
if(size == 12) temp = ascii_1206[num][t]; // 12号字体
else if(size == 16) temp = ascii_1608[num][t]; // 16号字体
else if(size == 24) temp = ascii_2412[num][t]; // 24号字体
else return;
for(t1 = 0; t1 < 8; t1++) {
if(temp & 0x80) LCD_DrawPoint(x, y, FRONT_COLOR);
else if(mode == 0) LCD_DrawPoint(x, y, BACK_COLOR);
temp <<= 1;
y++;
if(y >= LCD_HEIGHT) return;
if((y - y0) == size) {
y = y0;
x++;
if(x >= LCD_WIDTH) return;
break;
}
}
}
}
// 显示字符串
void LCD_ShowString(int x, int y, int width, int height, int size, char* p) {
int x0 = x;
width += x;
height += y;
while((*p <= '~') && (*p >= ' ')) {
if(x >= width) { x = x0; y += size; }
if(y >= height) break;
LCD_ShowChar(x, y, *p, size, 0);
x += size / 2;
p++;
}
}
基础作用达成之后,能够着手制作检测应用。执行时会出现虚拟设备界面,即时呈现外观形态,利于创造者进行审视和修正。
高级功能支持
模拟器能够实现基础功能,也能兼容众多图形界面架构。这让程序员得以在仿真系统中验证整体视觉呈现,涵盖按钮、选项卡等构造精巧的组件。
int main(void) {
// 初始化LCD模拟器
LCD_Init();
printf("VirtLCD演示开始!\n");
// 绘制界面元素
LCD_DrawHLine(10, 10, 350, WHITE);
LCD_ShowString(10, 30, LCD_WIDTH, LCD_HEIGHT, 12, "欢迎使用VirtLCD!");
LCD_ShowString(10, 50, LCD_WIDTH, LCD_HEIGHT, 16, "多种字体大小支持");
LCD_ShowString(10, 70, LCD_WIDTH, LCD_HEIGHT, 24, "界面开发神器");
LCD_DrawHLine(10, 110, 350, WHITE);
while(1); // 保持显示
return 0;
}
效率对比
跟常规的开发流程对比,借助模拟器能把一次调试所需的时间从五到十分钟压缩成十到三十秒,成效非常明显,开发进程的周转速率因此大幅加快,得益于这种立即可见的响应模式。
实用技巧
在环境布置上,应当采用官方提供的开发平台,同时务必保证相关支持库的连接无误。特别需要留意的是,必须预备好文字字体资源,这对于文字的呈现效果具有决定性作用。
移植注意事项
1. 保持API接口与真实硬件一致
2. 注意颜色格式的转换
// LVGL集成示例
void lv_port_disp_init(void) {
// 初始化VirtLCD
LCD_Init();
// 注册LVGL显示驱动
lv_disp_drv_init(&disp_drv);
disp_drv.flush_cb = disp_flush;
disp_drv.buffer = &disp_buf;
lv_disp_drv_register(&disp_drv);
}
3. 确保坐标系统映射正确
调试建议
模拟器具备诸多调试用途,诸如逐条运行、中途暂停等。灵活运用这些用途,能够迅速找出症结所在。
编写代码 → 编译 → 烧录 → 观察效果 → 修改代码 → 重复...
适用场景分析
模拟平台很适宜初始构建和功效核实,然而针对硬件独特性能的查验还得在现实条件里进行。工程师要依据实际状况挑选对应的验证途径。
总结与建议
编写代码 → 编译运行 → 实时观察 → 快速修改 → 即时生效
作为一款开放源代码的应用,LCD模拟器虽然功能上不及商业性质程序完备,然而对于嵌入式系统的构建者来说,其作用非常关键。它的主要好处体现在:
1. 大幅提升开发效率
2. 降低硬件依赖
3. 提供灵活的调试环境
对于常常遭遇硬件调试难题的程序员,极力推荐他们选用仿真工具,这种工具可以化解开发中的困境,并且有助于提升项目的整体工作感受。
版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;
工作时间:8:00-18:00
客服电话
0755-88186625
电子邮件
admin@lanyu.com
扫码二维码
获取最新动态