【SE】接口标准化
本文概述了主要接口标准化组织及其制定的标准规范。POSIX由IEEE和The Open Group制定,确保应用软件在操作系统间的可移植性;Khronos Group维护OpenVG和Vulkan/OpenGL标准,实现图形应用在GPU间的兼容;AUTOSAR联盟制定汽车软件标准,促进供应商间组件互换;OCI联盟规范容器接口,保障应用在容器运行时中的可移植性。文章重点介绍了POSIX认证流程、Op
目录
1、概述
接口标准化一直软件平台在追求的目标。接口标准规范由哪些组织来确立呢?
|
标准范例 |
制定组织 |
解决的核心问题 |
所在的抽象层级 |
举例 |
|---|---|---|---|---|
|
POSIX |
IEEE / The Open Group |
应用软件在不同操作系统间的可移植性 |
应用 <--> 操作系统 |
|
|
CMSIS |
ARM |
嵌入式软件在不同ARM芯片间的可复用性 |
中间件/OS <--> 芯片硬件 |
|
|
SQL |
ISO / IEC |
应用在不同数据库间的可移植性 |
应用 <--> 数据服务 |
SQLite(嵌入式常用),OceanBase,PostgreSQL, MySQL |
|
Vulkan/OpenGL |
Khronos Group |
图形应用在不同GPU间的可移植性 |
应用 <--> 图形硬件 |
|
|
AUTOSAR |
AUTOSAR联盟 |
汽车软件组件在不同供应商间的可互换性 |
汽车应用 <--> 汽车硬件 |
|
|
OCI |
OCI联盟 |
容器在不同运行时间的可移植性 |
应用交付 <--> 容器运行时 |
如Docker |

对于嵌入式开发我们常接触的标准接口如下:
2、POSIX
IEEE:专注于电气与电子工程领域的标准化,主导技术规范制定 。
The Open Group:作为开放系统互操作性联盟,推动跨平台解决方案的标准化 。
POSIX认证流程:产品需通过The Open Group测试套件验证后,由IEEE颁发商标许可 。
参考手册:https://pubs.opengroup.org/onlinepubs/9699919799/nframe.html
POSIX Headers
Format of Entries
<aio.h>
<arpa/inet.h>
<assert.h>
<complex.h>
<cpio.h>
<ctype.h>
<dirent.h>
<dlfcn.h>
<errno.h>
<fcntl.h>
<fenv.h>
<float.h>
<fmtmsg.h>
<fnmatch.h>
<ftw.h>
<glob.h>
<grp.h>
<iconv.h>
<inttypes.h>
<iso646.h>
<langinfo.h>
<libgen.h>
<limits.h>
<locale.h>
<math.h>
<monetary.h>
<mqueue.h>
<ndbm.h>
<net/if.h>
<netdb.h>
<netinet/in.h>
<netinet/tcp.h>
<nl_types.h>
<poll.h>
<pthread.h>
<pwd.h>
<regex.h>
<sched.h>
<search.h>
<semaphore.h>
<setjmp.h>
<signal.h>
<spawn.h>
<stdarg.h>
<stdbool.h>
<stddef.h>
<stdint.h>
<stdio.h>
<stdlib.h>
<string.h>
<strings.h>
<stropts.h>
<sys/ipc.h>
<sys/mman.h>
<sys/msg.h>
<sys/resource.h>
<sys/select.h>
<sys/sem.h>
<sys/shm.h>
<sys/socket.h>
<sys/stat.h>
<sys/statvfs.h>
<sys/time.h>
<sys/times.h>
<sys/types.h>
<sys/uio.h>
<sys/un.h>
<sys/utsname.h>
<sys/wait.h>
<syslog.h>
<tar.h>
<termios.h>
<tgmath.h>
<time.h>
<trace.h>
<ulimit.h>
<unistd.h>
<utime.h>
<utmpx.h>
<wchar.h>
<wctype.h>
<wordexp.h>
2.1、常用接口
//pthread.h
//线程管理
pthread_t pthread_self(void);
pthread_create()
pthread_once()
pthread_detach()
pthread_join()
pthread_cancel()
pthread_exit()
pthread_kill()
//锁管理
pthread_mutex_init()
pthread_mutex_lock()
pthread_mutex_unlock()
//信号
pthread_cond_init(pthread_cond_t *cv, const pthread_condattr_t *a)
//等信号,相当于freertos中的ulTaskNotifyTake
pthread_cond_wait(pthread_cond_t *cv, pthread_mutex_t *external_mutex) //死等信号
/* 等不到信号,超时也会就绪。*/
pthread_cond_timedwait(pthread_cond_t *cv, pthread_mutex_t *external_mutex, const struct timespec *t)
//线程间信号,相当于freertos中的xTaskNotifyGive
pthread_cond_signal(pthread_cond_t *cv)
pthread_cond_broadcast(pthread_cond_t *cv)
//\stdio\fopen.c
fopen()
2.2、线程操作接口对比
|
接口 |
谁调用 |
做什么 |
是否阻塞 |
资源是否回收 |
是否危险 |
备注 |
|---|---|---|---|---|---|---|
|
pthread_once |
任意线程 |
保证函数只执行一次 |
✅(首次) |
❌ |
✅ 安全 |
初始化用 |
|
pthread_exit |
线程自己 |
主动结束当前线程 |
❌ |
❌(需 join/detach) |
✅ 安全 |
最推荐 |
|
pthread_cancel |
其他线程 |
请求目标线程退出 |
❌ |
❌ |
⚠️ 高风险 |
依赖取消点 |
|
pthread_join |
其他线程 |
等待线程结束并回收 |
✅ |
✅ |
✅ 安全 |
只能一次 |
|
pthread_detach |
任意线程 |
标记线程自动回收 |
❌ |
✅(结束时) |
✅ 安全 |
不能再 join |
|
pthread_kill |
其他线程 |
向线程发信号 |
❌ |
❌ |
⚠️ 易误用 |
不是杀线程 |
2.3、示例:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
pthread_mutex_t mutex;
pthread_cond_t cond;
int count = 0;
void* thread_func(void* arg) {
int is_wait = 0;
pthread_mutex_lock(&mutex);
count++;
if (count == 5) {
//printf("[%d]本线程不等待,条件满足唤醒其他线程,然后直接返回\n", count);
pthread_cond_broadcast(&cond);
} else {
is_wait = 1;
printf("本线程条件不满足,即将进入线程等待\n");
pthread_cond_wait(&cond, &mutex);
}
if (is_wait) {
printf("本线程曾经等待过,现在被唤醒了,继续执行\n");
} else {
printf("本线程不等待,条件满足唤醒了其他线程后,直接返回\n");
}
pthread_mutex_unlock(&mutex);
// 线程继续执行其他操作
return NULL;
}
int main() {
pthread_t threads[5];
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);
for (int i = 0; i < 5; i++) {
pthread_create(&threads[i], NULL, thread_func, NULL);
}
//sleep(5);
// 等待所有线程结束
for (int i = 0; i < 5; i++) {
pthread_join(threads[i], NULL);
}
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
输出:
[1]本线程条件不满足,即将进入线程等待
[2]本线程条件不满足,即将进入线程等待
[3]本线程条件不满足,即将进入线程等待
[4]本线程条件不满足,即将进入线程等待
本线程不等待,条件满足直接返回
本线程曾经等待过,现在被唤醒了,继续执行
本线程曾经等待过,现在被唤醒了,继续执行
本线程曾经等待过,现在被唤醒了,继续执行
本线程曾经等待过,现在被唤醒了,继续执行
3、OpenVG
OpenVG是由Khronos Group维护的硬件加速的2D矢量图形API。专为渲染路径、文字、地图等可无限缩放而不失真的图形设计。
Khronos Group: 一个成立于2000年的非盈利性、会员制的行业联盟。其核心使命是创建开放的、免版税的跨平台API标准,这些标准主要用于图形处理、并行计算、视觉和机器学习、增强与虚拟现实(AR/VR) 等多媒体领域。您可以将其理解为一个由行业巨头们组成的“标准制定俱乐部”,目的是共同解决关键技术领域的互操作性和碎片化问题。

|
特性维度 |
OpenGL ES |
OpenVG |
|---|---|---|
|
核心绘制单元 |
几何图元:点、线、三角形。所有复杂物体都由三角形网格构成。 |
路径:由直线段、二次/三次贝塞尔曲线构成的矢量轮廓。 |
|
着色/填充方式 |
纹理映射 和 片段着色器。通过将位图(纹理)贴到几何体上来表现细节。 |
笔画 和 填充。用纯色、线性渐变、径向渐变或图像模式来填充路径内部或勾勒路径轮廓。 |
|
坐标系统与变换 |
完整的 3D 变换。使用 4x4 矩阵进行模型视图变换、投影变换。需要处理深度和透视。 |
2D 变换。使用 3x3 矩阵进行平移、旋转、缩放和剪切。本质是二维平面操作。 |
|
渲染管线 |
可编程管线。开发者编写顶点着色器和片段着色器,完全控制几何体变换和像素颜色计算。 |
固定功能管线。API 预先定义了路径的填充和笔画规则,开发者只需设置参数(如颜色、线宽),无法自定义着色逻辑。 |
|
抗锯齿 |
通常由开发者在使用时选择开启多重采样,或在片段着色器中自行实现。 |
原生、高质量的抗锯齿是核心设计目标。API 在填充路径时自动计算像素覆盖率,生成平滑的边缘。 |
|
典型接口对比 |
|
|
4、SQLite
SQLite 是一个嵌入式关系型数据库管理系统。它的核心特点在于它是一个自包含的、无服务器的、零配置的、事务性的 SQL 数据库引擎。“嵌入式”意味着它不是一个独立的进程,而是直接链接到您的应用程序中,成为应用程序的一部分。这与 MySQL、PostgreSQL 等需要单独安装、运行和管理的“客户端-服务器”型数据库有本质区别。
SQLite 虽然小巧,但功能相当强大,支持大部分 SQL92 标准。
标准的 SQL 语法:支持绝大多数核心 SQL 语句,如 SELECT, INSERT, UPDATE, DELETE, CREATE TABLE, DROP TABLE, JOIN, INDEX, TRANSACTION等。
数据类型:支持 NULL, INTEGER, REAL, TEXT, BLOB等动态类型(Manifest Typing)。
触发器:支持在特定的数据库操作(INSERT/UPDATE/DELETE)前后自动执行自定义逻辑。
视图:可以创建虚拟表(视图)来简化复杂查询。
外键约束:支持关系完整性(需要运行时开启)。
部分索引:可以只为满足特定条件的行创建索引,提高效率并节省空间。
|
特性 |
SQLite(嵌入式) |
MySQL/PostgreSQL(客户端-服务器) |
|---|---|---|
|
架构 |
库形式,嵌入应用 |
独立服务器进程 |
|
数据库形式 |
单个磁盘文件 |
多个文件组成的复杂目录结构 |
|
部署 |
零配置,复制文件即可 |
需要安装、配置、管理 |
|
并发 |
读并发优秀,写并发差 |
为高并发读写设计 |
|
网络访问 |
需通过应用层间接实现 |
原生支持网络协议 |
|
适用场景 |
嵌入式、移动端、桌面端、小网站 |
中大型、高并发Web应用 |
简单来说,SQLite 不是一个用来替代 MySQL 或 PostgreSQL 的数据库,而是一个用于替代 fopen()(直接操作文件)的数据库。 当你需要比文件系统更高效、更可靠的结构化数据存储时,SQLite 是一个非常完美的选择。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)