应用——Linux FrameBuffer图形显示与多线程消息系统项目

Linux FrameBuffer图形显示与多线程消息系统项目

一、项目概述

本项目是一个基于Linux FrameBuffer的图形显示系统,集成了多线程通信机制和物联网MQTT通信功能。项目主要用于嵌入式设备的图形界面显示,支持基本图形绘制、位图显示、中文字符显示等功能。

二、核心模块分析

1. FrameBuffer图形显示模块 (framebuffer.c / framebuffer.h)

1.1 核心数据结构
复制代码
// 全局显存指针和屏幕信息
void *pmem;  // 显存映射指针
struct fb_var_screeninfo vinf;  // 屏幕参数信息
1.2 主要功能函数

1.2.1 FrameBuffer初始化

复制代码
int init_fb(char *devname)
  • 打开FrameBuffer设备文件(通常为/dev/fb0

  • 获取屏幕分辨率、位深度等信息

  • 建立显存与用户空间的映射关系

  • 返回文件描述符供后续操作使用

1.2.2 像素点绘制

复制代码
void draw_point(int x, int y, unsigned int col)
  • 支持RGB888(32位)和RGB565(16位)两种格式

  • 自动根据屏幕位深度选择像素格式

1.2.3 基本图形绘制

  • draw_clear(): 清屏

  • draw_h_line(): 水平线

  • draw_s_line(): 垂直线

  • draw_rectangle(): 矩形

  • draw_x_line(): 任意直线(支持斜率计算)

  • draw_circle(): 圆形(使用三角函数计算)

1.2.4 图像和文字显示

  • draw_bmp(): 显示BMP格式图片

  • draw_word(): 显示点阵文字

  • draw_utf8(): 显示UTF-8编码的字符

  • draw_utf8_str(): 显示UTF-8字符串

2. UTF-8字库处理模块 (utf.c / utf.h)

2.1 数据结构
复制代码
typedef struct {
    char path[256];              // 字库文件路径
    unsigned width;              // 字模宽度
    unsigned height;             // 字模高度
    unsigned zimo_size;          // 每个字字模字节数
    unsigned char* g_ziku_data;  // 字库文件缓存区
} UTF8_INFO;
2.2 核心功能
  • 编码转换: UTF-8 ↔ Unicode

  • 字库加载: 读取字库文件到内存

  • 字模获取: 根据Unicode编码获取对应的点阵数据

3. 多线程邮件系统 (mailbox.c / mailbox.h)

3.1 核心数据结构
复制代码
// 邮件系统
typedef struct mail_box_system {
    pthread_mutex_t mutex;      // 保护邮件系统
    struct list_head head;      // 线程节点链表头
} MBS;

// 线程节点
typedef struct thread_node {
    pthread_t tid;              // 线程ID
    char name[256];             // 线程名称(唯一)
    LinkQue* lq;                // 线程对应的消息队列
    th_fun th;                  // 线程函数
    struct list_head node;      // 链表节点
} LIST_DATA;

// 邮件数据结构
typedef struct mail_data {
    pthread_t id_of_sender;     // 发送者线程ID
    char name_of_sender[256];   // 发送者名称
    pthread_t id_of_recver;     // 接收者线程ID
    char name_of_recver[256];   // 接收者名称
    char data[256];             // 消息内容
} MAIL_DATA;
3.2 工作流程
复制代码
线程注册 → 创建消息队列 → 线程间发送消息 → 线程接收消息 → 系统销毁

4. 链表队列 (linkque.c / linkque.h)

实现了一个线程安全的链表队列,用于存储邮件数据:

  • CreateLinkQue(): 创建队列

  • EnterLinkQue(): 入队

  • QuitLinkQue(): 出队

  • GetHeadLinkQue(): 获取队首元素

5. Linux内核链表实现 (list.h)

从Linux内核移植的双向链表实现,包含:

  • 基本链表操作(增、删、改、查)

  • 哈希链表支持

  • 各种遍历宏定义

三、主要应用程序

1. 图形显示示例 (main_xianshi.c)

复制代码
// 示例代码流程
1. 初始化UTF-8字库
2. 初始化FrameBuffer
3. 绘制基本图形(点、线、矩形、圆形)
4. 显示BMP图片
5. 显示中文文字
6. 清理资源

2. 多线程通信示例 (main_xiancheng.c)

复制代码
// 线程设计
- show_th: 显示线程,接收并打印消息
- sock_th: 网络线程,模拟网络通信
- data_th: 数据生成线程,产生随机数据并发送给其他线程

3. 物联网云平台通信 (main_yunpingtai.c)

复制代码
// 功能特点
- 使用Paho MQTT客户端库
- 连接中国移动OneNET物联网平台
- 支持设备属性上报
- 支持消息订阅/发布

四、编译和运行说明

4.1 依赖库

复制代码
# 需要安装的开发库
sudo apt-get install libpaho-mqtt-dev

4.2 编译命令

复制代码
# 编译图形显示示例
gcc -o xianshi main_xianshi.c framebuffer.c utf.c -lm -lpthread

# 编译多线程示例
gcc -o xiancheng main_xiancheng.c mailbox.c linkque.c -lpthread

# 编译云平台示例
gcc -o yunpingtai main_yunpingtai.c -lpaho-mqtt3c -lpthread

4.3 运行要求

  1. 需要Linux系统支持FrameBuffer

  2. 需要root权限访问/dev/fb0

  3. 字库文件需要放置在正确路径

  4. OneNET平台需要正确配置设备信息

五、关键技术点

5.1 FrameBuffer编程技巧

  • 内存映射 : 使用mmap()将显存映射到用户空间

  • 双缓冲: 可以使用虚拟分辨率实现简单的双缓冲

  • 像素格式: 支持多种像素格式的自动适配

5.2 多线程同步

  • 互斥锁: 保护共享数据结构

  • 消息队列: 实现线程间异步通信

  • 条件变量: 线程等待/唤醒机制

5.3 编码处理

  • UTF-8解析: 处理多字节字符编码

  • 字库管理: 高效加载和查找字模数据

  • 跨平台兼容: 考虑字节序问题

六、应用场景

  1. 嵌入式GUI开发: 适用于无X Window的嵌入式系统

  2. 物联网设备显示: 与MQTT结合实现远程监控显示

  3. 多任务系统: 线程间通信模型可用于复杂的多任务协调

  4. 教育演示: 学习Linux底层图形编程和线程编程

七、扩展建议

  1. 性能优化:

    • 添加双缓冲机制减少闪烁

    • 优化图形绘制算法

    • 实现脏矩形更新

  2. 功能增强:

    • 添加触摸屏支持

    • 支持更多图片格式

    • 实现窗口管理系统

  3. 代码改进:

    • 增加错误处理机制

    • 添加配置文件和日志系统

    • 实现模块化设计

八、注意事项

  1. 权限问题: FrameBuffer设备需要root权限

  2. 资源释放: 确保正确释放内存映射和文件描述符

  3. 线程安全: 在多线程环境中注意数据同步

  4. 编码兼容: 确保字库文件与使用的字符编码匹配

这个项目展示了如何在Linux环境下进行底层图形编程和并发编程,适合用于嵌入式系统开发、物联网设备开发等场景。代码结构清晰,模块化程度高,便于学习和扩展。

相关推荐
嘿嘿潶黑黑9 小时前
关于QButtonGroup 在Qt5和Qt6之间的差异
开发语言·qt
Eloudy9 小时前
矩阵张量积(Kronecker积)的代数性质与定理
算法·量子计算
hqwest9 小时前
码上通QT实战09--监控页面01-区域划分
开发语言·qt·layout·qss·qt 布局
Caitlin_lee_9 小时前
计算机网络期末复习SCAU-第六章
运维·服务器·计算机网络
深圳市恒讯科技9 小时前
如何从损坏的Windows或Linux VPS中恢复文件
linux·运维·windows
武汉唯众智创9 小时前
新一代智慧建筑运维管理实训基地的构建与实践
运维·智慧楼宇·智慧建筑·智能楼宇·智能建筑·智慧建筑运维管理·建筑智能
我的golang之路果然有问题9 小时前
Docker 之常用操作(实习中的)
java·运维·笔记·docker·容器·eureka
gravity_w9 小时前
vscode配置SSH远程服务器
服务器·经验分享·vscode·ssh
neo_will_mvp9 小时前
通过commit创建镜像
linux·运维·服务器