4.7 OSAL 操作系统抽象层
2026/7/19大约 3 分钟内核组件内核OSAL跨平台兼容
4.7 OSAL 操作系统抽象层
📚 本节导读
学习时长:约 25 分钟
难度级别:⭐⭐⭐☆☆
前置知识:第 4.2 节任务管理、第 4.3 节任务同步与通信
🎯 学习目标
- 理解 OSAL 的设计理念和架构
- 了解各适配层的 API 兼容范围
- 掌握 OSAL 的使用场景和配置方法
一、OSAL 概述
OSAL(Operating System Abstraction Layer,操作系统抽象层) 是 OneOS 提供的多 OS API 兼容层,位于 osal/ 目录。各适配层源码位于 osal/cmsis/、osal/freertos/、osal/posix/、osal/rtthread/、osal/cpp11/。它使基于其他 RTOS API 编写的代码能够在 OneOS 上运行,降低迁移成本。
支持的适配层
| 适配层 | 目录 | 兼容的 API 标准 |
|---|---|---|
| CMSIS-RTOS | cmsis/ | ARM CMSIS-RTOS v1/v2 API |
| FreeRTOS | freertos/ | FreeRTOS 原生 API |
| POSIX | posix/ | POSIX 1003.1b 实时扩展(pthread/mutex/sem) |
| RT-Thread | rtthread/ | RT-Thread 内核 API |
| C++11 | cpp11/ | C++11 std |
二、架构设计
┌───────────────────────────────────────────────┐
│ 应用层 │
│ (可使用 CMSIS / FreeRTOS / POSIX 等 API) │
├───────────────────────────────────────────────┤
│ OSAL 适配层 (osal/) │
│ ┌───────┬──────────┬───────┬────────┬──────┐ │
│ │ CMSIS │ FreeRTOS │ POSIX │RT-Thread│C++11│ │
│ └───┬───┴────┬─────┴───┬───┴────┬───┴──┬───┘ │
│ └────────┴─────────┴────────┴──────┘ │
│ │ │
├────────────────────┼────────────────────────────┤
│ OneOS 内核 API (kernel/) │
│ os_task_create / os_sem_wait / ... │
└────────────────────────────────────────────────┘三、各适配层详解
3.1 CMSIS-RTOS 适配
CMSIS(Cortex Microcontroller Software Interface Standard)是 ARM 定义的标准 RTOS API。
API 映射表(CMSIS → OneOS):
| CMSIS API | OneOS API | 说明 |
|---|---|---|
osThreadNew() | os_task_create() | 创建线程 |
osThreadTerminate() | os_task_destroy() | 终止线程 |
osThreadGetId() | os_task_self() | 获取当前线程 |
osDelay() | os_task_msleep() | 延时 |
osMutexNew() | os_mutex_create() | 创建互斥锁 |
osMutexAcquire() | os_mutex_lock() | 获取互斥锁 |
osMutexRelease() | os_mutex_unlock() | 释放互斥锁 |
osSemaphoreNew() | os_sem_create() | 创建信号量 |
osSemaphoreAcquire() | os_sem_wait() | 获取信号量 |
osSemaphoreRelease() | os_sem_post() | 释放信号量 |
osEventFlagsNew() | os_event_create() | 创建事件 |
osEventFlagsWait() | os_event_recv() | 等待事件 |
osEventFlagsSet() | os_event_send() | 设置事件 |
osMessageQueueNew() | os_mq_create() | 创建消息队列 |
osMessageQueuePut() | os_mq_send() | 发送消息 |
osMessageQueueGet() | os_mq_recv() | 接收消息 |
osTimerNew() | os_timer_create() | 创建定时器 |
osTimerStart() | os_timer_start() | 启动定时器 |
osTimerStop() | os_timer_stop() | 停止定时器 |
#include <cmsis_os.h>
/* CMSIS-RTOS API 在 OneOS 上的使用 */
void cmsis_task(void *arg)
{
osThreadId_t thread_id;
osMutexId_t mutex_id;
osSemaphoreId_t sem_id;
/* 创建线程(映射到 os_task_create) */
const osThreadAttr_t attr = {
.name = "cmsis_thread",
.stack_size = 1024,
.priority = osPriorityNormal,
};
thread_id = osThreadNew(cmsis_task, NULL, &attr);
/* 创建互斥锁(映射到 os_mutex_create) */
mutex_id = osMutexNew(NULL);
/* 创建信号量(映射到 os_sem_create) */
sem_id = osSemaphoreNew(10, 0, NULL);
}3.2 FreeRTOS 适配
#include <FreeRTOS.h>
#include <task.h>
#include <semphr.h>
/* FreeRTOS API 在 OneOS 上的使用 */
void freertos_task(void *arg)
{
/* 创建任务(映射到 os_task_create) */
xTaskCreate(freertos_task, "freertos_task",
1024, NULL, 1, NULL);
/* 创建信号量(映射到 os_sem_create) */
SemaphoreHandle_t sem = xSemaphoreCreateBinary();
xSemaphoreGive(sem);
xSemaphoreTake(sem, portMAX_DELAY);
}3.3 POSIX 适配
API 映射表(POSIX → OneOS):
| POSIX API | OneOS API | 说明 |
|---|---|---|
pthread_create() | os_task_create() | 创建线程 |
pthread_join() | os_task_destroy() | 等待线程结束 |
pthread_mutex_init() | os_mutex_create() | 初始化互斥锁 |
pthread_mutex_lock() | os_mutex_lock() | 加锁 |
pthread_mutex_unlock() | os_mutex_unlock() | 解锁 |
sem_init() | os_sem_create() | 初始化信号量 |
sem_wait() | os_sem_wait() | P 操作 |
sem_post() | os_sem_post() | V 操作 |
mq_open() | os_mq_create() | 创建消息队列 |
mq_send() | os_mq_send() | 发送消息 |
mq_receive() | os_mq_recv() | 接收消息 |
sleep() | os_task_sleep() | 秒级延时 |
usleep() | os_task_msleep() | 微秒级延时 |
#include <pthread.h>
#include <semaphore.h>
/* POSIX API 在 OneOS 上的使用 */
void *posix_thread(void *arg)
{
pthread_mutex_t mutex;
sem_t sem;
/* 创建互斥锁(映射到 os_mutex_create) */
pthread_mutex_init(&mutex, NULL);
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
/* 创建信号量(映射到 os_sem_create) */
sem_init(&sem, 0, 0);
sem_post(&sem);
sem_wait(&sem);
return NULL;
}
void posix_demo(void)
{
pthread_t thread;
pthread_create(&thread, NULL, posix_thread, NULL);
}四、Kconfig 配置
menu "OSAL"
config OS_USING_CMSIS_OSAL
bool "Enable CMSIS-RTOS OSAL"
default n
config OS_USING_FREERTOS_OSAL
bool "Enable FreeRTOS OSAL"
default n
config OS_USING_POSIX_OSAL
bool "Enable POSIX OSAL"
default n
config OS_USING_RTTHREAD_OSAL
bool "Enable RT-Thread OSAL"
default n
config OS_USING_CPP11_OSAL
bool "Enable C++11 Thread OSAL"
default n
endmenu五、使用场景
| 场景 | 推荐适配层 | 说明 |
|---|---|---|
| 复用 ARM CMSIS 代码 | CMSIS-RTOS | 兼容 ARM 标准 API |
| 迁移 FreeRTOS 项目 | FreeRTOS OSAL | 直接使用 FreeRTOS API |
| 移植 Linux 应用 | POSIX | pthread/semaphore 等 POSIX 接口 |
| 复用 RT-Thread 组件 | RT-Thread OSAL | 兼容 RT-Thread 内核 API |
| C++ 面向对象开发 | C++11 OSAL | std |
📝 本节小结
- OSAL 是 OneOS 的多 OS API 兼容层,降低迁移成本
- 支持 CMSIS / FreeRTOS / POSIX / RT-Thread / C++11 五种适配
- 各适配层通过 Kconfig 独立控制,按需启用
- 适合复用已有代码、迁移项目、多平台兼容等场景