[TOC]
## 什么是 OSAL?
今天同学忽然问我有没有搞过`OSAL`,忽然间一头雾水,于是在搜索引擎上找到了答案,发现这是一个十分实用的东西。
**OSAL**(`operating system abstraction layer`),操作系统抽象层,是一种以实现多任务为核心的系统资源管理机制,实现了类似`RTOS`的某些功能,但并不能称之为真正意义上的`RTOS`,因为本身不支持任务的挂起,任务的抢占等等功能,但是这种机制,实现的代码十分精简,占用资源很少,对于资源十分紧张的嵌入式平台,可以完成比较复杂的逻辑功能,是一个十分给力的框架。
**OSAL** 的概念是由`TI`公司在`ZIGBEE`协议栈——`Z-STACK`中引入的,可以在官网上搜索`z-stack`下载相关的源码,其中就包含了`OSAL`机制实现的源码;
## 源码安装
[Z-Stack.3.0.2.exe](https://bbs.eeworld.com.cn/forum.php?mod=attachment&aid=NDQ0MDk1fDhhMDlkZWRiZTFjYjY2MDQ1Yzg1YjY3YzMyMDZhZTNkfDE3MzMyNTM5MTg%3D&request=yes&_f=.exe)目前官网上最新的版本,下载安装到本地;
![]()
安装完成之后,可以到安装目录下,找到相应的源码,不过这里基本上是`zigbee`的协议栈,所以`OSAL`相关的部分在下图所示的路径中;
## OSAL的移植
可以尝试把`OSAL`的框架移植到单片机上,进行测试,这里是`GitHub`上`fork`的一个仓库[OSAL](https://github.com/hotsauce1861/osal.git) ,已经具体的移植方法,可以在`Linux`平台上进行测试,
``` c
void osal_main(void)
{
//系统硬件、外设等初始化
//禁止中断
HAL_DISABLE_INTERRUPTS();
//osal操作系统初始化
osal_init_system();
//添加任务
osal_add_Task(print_task_init, print_task_event_process, 1);
osal_add_Task(statistics_task_init, statistics_task_event_process, 2);
//添加的任务统一进行初始化
osal_Task_init();
osal_mem_kick();
//允许中断
HAL_ENABLE_INTERRUPTS();
//设置初始任务事件,上电就需要自动轮询的任务事件可在此添加
//启动osal系统,不会再返回
osal_start_system();
}
```
后面打算移植到`STM32`,应该也不错,之前也看过不少调度器,感觉都没有`OSAL`给力。