现成轮子OSAL操作系统抽象层的移植

2024-05-18 18:18

本文主要是介绍现成轮子OSAL操作系统抽象层的移植,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简单介绍一下Z-STACK中的OSAL,值得一看的现成轮子;

什么是 OSAL?

今天同学忽然问我有没有搞过OSAL,忽然间一头雾水,于是在搜索引擎上找到了答案,发现这是一个十分实用的东西。

OSAL(operating system abstraction layer),操作系统抽象层,是一种以实现多任务为核心的系统资源管理机制,实现了类似RTOS的某些功能,但并不能称之为真正意义上的RTOS,因为其本身还不支持任务的挂起,任务的抢占等等功能。

但是这种机制,实现的代码十分精简,占用资源也非常少,对于资源十分紧张的嵌入式平台,也可以完成比较复杂的逻辑功能。

TI CC2530ZIGBEE协议栈Z-STACK中可以找到OSAL的身影,可以在官网上搜索z-stack下载相关的源码,其中就包含了OSAL实现的源码;

移除掉一些无关功能的代码之后,剩下OSAL的源码总共约1100多行代码,全部由C语言实现,资源占用约为

  • RAM:512Byte

  • ROM:2KB

理论上可以移植到绝大多数的芯片平台上。

源码安装

目前官网上最新的版本,下载安装到本地;

TI官网下载的z-stack

安装完成之后,可以到安装目录下,找到相应的源码,不过这里基本上是zigbee的协议栈,所以OSAL相关的部分在下图所示的路径中;

目录结构

进入到osal路径下的文件结构如下图所示;

这个OSAL操作系统抽象层用于保护协议栈软件组件不受程序硬件细节的影响,减少程序的耦合性,提高可移植性复用性。它可以独立于程序环境,并且提供了以下功能。

  1. 任务注册、初始化、启动;

  2. 任务间的消息交换;

  3. 任务同步;

  4. 中断处理;

  5. 计时器;

  6. 内存分配;

Linux 上OSAL的移植

可以尝试把OSAL的框架移植到单片机上,进行测试,这里是GitHubfork的一个仓库OSAL ,已经具体的移植方法,可以在Linux平台上进行测试,

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的移植

如果直接使用ti官方的代码改动会相对比较大,这里直接在github上找到一份移植到stm32的工程,直接fork了一份改成HAL库,可以参考一下stm32-osal, 克隆代码之后,直接复制osal文件夹到CubeIDE工程目录下,然后对工程文件列表进行刷新,可以看到如下图所示;

下面是作者基于tiosal的移植说明:

  1. 完成OSAL\hal\timer.c文件,为系统提供时钟;

  2. 修改OSAL\include\type.h文件中的全局中断开关函数(可以为空),添加芯片对应的头文件,根据需要修改数据类型重定义,根据芯片字长修改halDataAlign_t类型;

  3. 根据需要修改OSAL\osal\osal_memory.h文件中的内存池大小定义,文件中osalMemHdr_t类型需要确保长度为16bit或以上,非8位单片机需要设定内存池的字节对齐;

  4. 添加任务函数中的任务优先级数值大的任务则优先级高;

  5. 根据需要修改OSAL\include\osal_memory.h文件中的OSALMEM_METRICS定义,有效则开启内存统计功能;

关键点

总体来说,因为站在巨人的肩膀上,整体的代码需要修改的部分已经很少了。首先这个机制是根据时间片轮询调度的,所以会对每个任务分配一个ID以及一个任务专属的定时器,同时,使用一个链表管理每个任务的定时器,同样的,每个定时器会更加任务ID来进行匹配,所以,需要在hal增加对定时器更新的函数;如下所示;

因为使用CubeMX修改配置,重新生成代码后会覆盖原文件stm32f1xx_it.c,所以,重新生成的时候,注意添加osal_update_timers(),如果对其他内容感兴趣的话,可以参考一下源码;

测试代码

使用串口3进行任务测试,定义了两个任务,先贴出其中的一部分,详细的可以全部的工程代码;

int osal_main(void)
{    HAL_DISABLE_INTERRUPTS();osal_init_system();osal_add_Task(Serial_Task_Init,Serial_Task_EventProcess, 1);osal_add_Task(Serial_Task_02_Init,Serial_Task_02_EventProcess, 2);osal_Task_init();osal_mem_kick();HAL_ENABLE_INTERRUPTS(); //"hello task 01\r\n";osal_start_reload_timer( Serial_TaskID, PRINTF_STR, 100);//"hello task 02\r\n";osal_start_reload_timer( Serial_Task_02_ID, PRINTF_STR_TASK_02, 500);osal_start_system();
}

下面是运行结果:

结语

如果不使用RTOS,那么OSAL也是不错的选择,不过还需要对其源码需要进一步的理解,这样在出现问题的时候,才可以对症下药。

附件

该工程基于CubeIDE 1.3
百度网盘:https://pan.baidu.com/s/1zXkEp7jNoO-ODqMtU5YxBA)
提取码:ncry

Github:https://github.com/hotsauce1861/osal.git

长按下图二维码关注,独自前进,走得快;结伴而行,走得远;在这里除了肝出来的文章,还有一步一个脚印学习的点点滴滴;


这篇关于现成轮子OSAL操作系统抽象层的移植的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/995639

相关文章

Linux操作系统 初识

在认识操作系统之前,我们首先来了解一下计算机的发展: 计算机的发展 世界上第一台计算机名叫埃尼阿克,诞生在1945年2月14日,用于军事用途。 后来因为计算机的优势和潜力巨大,计算机开始飞速发展,并产生了一个当时一直有效的定律:摩尔定律--当价格不变时,集成电路上可容纳的元器件的数目,约每隔18-24个月便会增加一倍,性能也将提升一倍。 那么相应的,计算机就会变得越来越快,越来越小型化。

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

工厂方法模式和抽象工厂模式的区别

区别  工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。    一个抽象工厂类,可以派生出多个具体工厂类。    每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。    一个抽象工厂类,可以派生出多个具体工厂类。    每个具体工厂类可以创建多个具体产品类的实例。    区别: 工厂方法模式只有一个抽象产品类

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(4)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)-CSDN博客  这节就是真正的存储数据了   理清一下思路: 1.存储路径并检查 //2进制文件类存储private static string Data_Binary_Pa

1、简述linux操作系统启动流程

1、简述linux操作系统启动流程 启动第一步--加载BIOS 当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。这是因为BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。开机时将ROM中的指令映射到RAM的低地址空间,CPU读取到这些指令,硬件的健康状况进行检查,按照BIOS中设置的启

RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

目录 概述 1 RT-Thread 1.1 RT-Thread的版本  1.2 认识Nano版本 2 STM32F446U上移植RT-Thread  2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet  2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码  2.2.3.

操作系统是怎么为不同的程序分配所需的内存空间的

操作系统为不同的程序分配内存空间的过程涉及多个关键步骤,确保每个程序都有其所需的内存资源,同时避免程序之间的冲突。以下是操作系统如何为程序分配内存空间的详细过程: 1. 内存管理的基础概念 虚拟内存:现代操作系统使用虚拟内存机制来为程序提供隔离的内存空间。每个程序运行在其独立的虚拟地址空间中,这使得程序间的内存互不干扰。物理内存:实际的 RAM(随机存取存储器),由操作系统和硬件共同管理。虚拟

Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(3)

本文仅作笔记学习和分享,不用做任何商业用途 本文包括但不限于unity官方手册,unity唐老狮等教程知识,如有不足还请斧正​​ Unity数据持久化 之 一个通过2进制读取Excel并存储的轮子(2) (*****生成数据结构类的方式特别有趣****)-CSDN博客 做完了数据结构类,该做一个存储类了,也就是生成一个字典类(只是声明)  实现和上一节的数据结构类的方式大同小异,所

操作系统安全保护

操作系统安全概述 概念:满足安全策略要求,具有响应安全机制及安全功符合特定安全标准,在一定约束条件下 能抵御常见网络安全威胁,保障自身安全运行及资源安全 安全等级:根据安全功能和安全保障要求分为 用户自主保护级  系统审计保护级 安全标记保护级 结构化保护级 访问验证保护级 操作系统作用: 负责计算系统的资源管理、支撑和控制各种应用程序运行,为用户提供计算机系统管理接口 是构成网络信息

Linux操作系统命令集(一)

最近开了操作系统的课,弄着虚拟机的linux系统命令学学 文件和目录操作命令: ls:列出目录内容 示例:ls -l 以长格式列出目录内容cd:切换目录 示例:cd /home/user 切换到 /home/user 目录mkdir:创建目录 示例:mkdir new_directory 创建名为 new_directory 的目录rmdir:删除空目录touch:创建空文件或更新文件的时间戳