OSAL

OSAL操作系统抽象层 背景 我们知道操作系统可以简单的分为内核和上层应用。其中内核是用来管理计算机的各种硬件资源和软件资源,比如内存资源,cpu资源,网络资源,还有各种外设资源等等。而应用程序就是调用计算机的各种资源来完成特定的任务,比如需要申请内存来保存数据,需要申请网卡资源来发送数据等等。当然应用程序需要某个资源时需要向内核发出申请。而内核会向应用程序提供一些接口来申请资源,这些接口称之为系统调用。当然一般应用开发不会直接调用系统调用,因为使用不方便,一般调用的是各种标准库的接口,比如glibc.标准库对系统调用进行了封装, 阅读详情
一、概述 OSAL(Operating System Abstraction Layer),翻译为“操作系统抽象层”,OSAL就是以实现多任务为核心的系统资源管理机制。所以OSAL与标准的操作系统还是有很大的区别的。简单而言,OSAL实现了类似操作系统的某些功能,但并不能称之为真正意义上的操作系统。二、OSAL系统的初始化首先在main()中调用OSAL初始化函数Init_Osal(),在Init_Osal()中通过调用osal_init_system()来进行初始化OSAL,在调用osal_init_system()过程中关闭所有中断。在osal_init_system()中包括了内存、定时器、任务初始化、添加任务和初始化添加的任务等。(分别为函数osal_mem_init();osalTimerInit();osalTaskInit(); osalAddTasks();osalInitTasks();osal_mem_kick();)现在我们先进行OSAL系统任务是如何运行的进行分析。关于任务初始化中主要用到 osalTaskInit(); osalAddTasks();osalInitTasks();这三个函数。osalTaskInit()函数的功能是将任务头指针tasksHead置零,有效任务指针activeTask置零,并且初始化任务ID变量taskIDs 为零。 osalAddTasks()函数的功能是添加所有的任务,所谓的添加任务就是在系统内存空间(此部分关于内存的操作将放到最后进行说明)中申请一段空间用于存储任务的结构变量osalTaskRec,按照链表的形式存储所有的任务结构变量,此结构变量中将存储所有任务所需要的信息。通过调用osalTaskAdd()依次添加每个任务。添加任务有三个作用的参数,他们分别是:pfnInit、pfnEventProcessor和taskPriority(任务初始化函数地址、任务处理函数地址和任务的优先级)而taskID参数则是系统通过osalAddTasks()函数随机给分配的。因此编写初始化任务之前必须先编写任务的相关函数(初始化和处理函数)备注:任务处理函数是负责处理传递给此任务的事件,比较重要,具体将在本文的后面进行分析。osalInitTasks()函数的功能是依次调用所有任务的初始化函数,进行初始化。一般都在任务初始化函数中将系统分配的taskID赋值给任务ID全局变量这样在设置任务时方便使用这个任务ID全局变量来传递参数和识别。三、OSAL系统的运行还是先从mian()函数中来寻找OSAL系统运行的蛛丝马迹,轻易的就能找到osal_start_system();这个函数。分析此函数就能大概明白OSAL系统是如何运行的了,首先是定义一个定时器中断,每隔一定的时间产生一次中断,这里使用的是看门狗定时器中断。(这个定时器中断是很重要的,它相当于OSAL系统的时钟,每隔一定的时间进行一次系统的刷新,而后判断任务和时间是否激活,激活的话转入相应的函数进行处理。)紧接着会看到一个for(;;){},这是一个死循环,可以得出程序将一直在这个循环中运行,这段代码的主要功能是:调用osalNextActiveTask()函数判断是否有事件产生,如果有的话返回系统内存空间中相应任务地址,而后读取事件标识并清该事件标识,最后调用相应任务的处理函数,并传递事件标识号,处理相应的事件。那么系统是如何设置事件标识的呢?一、熟悉单片机的都应该知道中断,既然程序将始终在for(;;){}中循环,唯一的方式就是通过中断,在中断程序中调用函数进行事件标识的设置。上文中已经提到过定时器中断(看门狗定时器)在此中断中调用osal_set_event()传递参数:TaskID和EVENT标识,这样将设置相应任务并且设置任务中的事件标识,在for(;;){}中就能读取到有事件产生。二、上面这种方式比较直接,另一种也是通过中断,但是不是直接调用osal_set_event()来设置任务事件,而是通过定时器这样经过一定的延时后才设置任务事件的。这里涉及到OSAL系统中的定时器,这是软件级的定时器,并非单片机上硬件定时器的概念。但是这个软件定时器也是通过上文提到的定时器中断(看门狗定时器)提供的基本时间来进行定时的。白话点就是:当定时器中断(看门狗定时器)产生时,调用一次软件定时器。即调用osal_update_timers();->osalTimerUpdate( tmr_decr_time )。osalTimerUpdate()函数的主要功能是:通过传递的参数更新OSAL系统时间即osal_systemClock += updateTime;而后判断定时器链表中是否有定时器,有的话按链表的顺序依次判断是否达到定时时间(timeout),达到的话则设置该定时器对应的taskID和event_flag,在for(;;){}中就能读取到有事件产生。达到定时时间的定时器将被从链表中清除,未达到的继续等待。此处还有一个问题没有解释,那就是这些对应于不同的taskID的定时器是在哪里初始化和设定的。现在再分析一下定时器的初始化,在OSAL系统初始化的时候就调用过osalTimerInit();函数对定时器进行初始化了,主要的功能是对几个定时器相关变量进行赋值tmr_count = TICK_TIME; //TICK_TIME=250000 tmr_decr_time = TIMER_DECR_TIME;//TIMER_DECR_TIME=250ms osal_timer_activate( false ); timerActive = false;而后就可以在需要的地方进行定时器的添加了,一般都在中断中调用osal_start_timerEx( );进行添加操作的。例如本人使用的程序中在按键中断中调用osal_start_timerEx( Hal_TaskID, HAL_KEY_XIAODOU_EVENT, 10);函数进行添加定时器的,对于定时器的添加操作过程中关闭所有中断,其中调用了osalAddTimer( );函数进行定时器的添加(添加定时器的代码和添加任务的代码很相似)。也是在系统内存空间中申请一段空间用于存储定时器的结构变量osalTimerRec_t并且按照链表的形式存储所有的定时器结构变量。
osal抽象系统操作层的理解 OSAL(Operating System Abstraction Layer,操作系统抽象层)是一个为不同操作系统提供统一接口的层。其主要目的是简化在不同操作系统平台上的应用程序移植,通常用于嵌入式系统或跨平台软件开发中。OSAL的核心思想是将操作系统相关的操作(如线程管理、内存管理、定时器、I/O等)抽象出来,使得应用程序不需要直接依赖于某个特定的操作系统。通过这样的抽象,开发者可以在多个操作系统之间共享代码,同时避免因不同操作系统的实现差异而需要修改大量代码。 阅读详情

相关推荐

ST17H66 低功耗蓝牙SOC开发(3)—— OSAL系统简介

介绍ST17H66 SDK使用的OSAL系统。

WHMTBYY的博客 5004

【事件驱动框架OSAL】一.事件和任务管理

OSAL事件驱动框架:事件和任务管理简述

qq_34142812的博客 3847

OSAL之消息管理

转载请注明出处,尊重原创;本文基于蓝牙1.3.2版本总述: 消息处理机制流程 OSAL中实现对消息管理的功能实现是在osal.c 与 osal.h 文件中,对于操作系统来说,不可缺少的就是任务之间信息的传递,消息包括:信号量,互斥量,消息邮箱、消息队列等。在OSAL中仅仅实现了消息队列的功能,系统可以发送或接收消息,并对消息进行管理。背景知

Vincent 5455

基于OSAL的嵌入式裸机事件驱动框架——消息队列osal_msg

参考B站up主消息队列消息分为hdr和bdy,把消息的头dhr和内容bdy做了一个分离的设计dhr包括指向下一个消息的指针next,len在创建消息的时候使用,dest_id即目标任务,将消息和任务进行绑定。bdy是消息的主体,包括数据data,还有事件id。(注:这里的event_id和任务里的event_id 是不一样的,在任务中有个属性是事件集,表示对应于这个认为的事件集合,有16位,即一个任务最多可以对应16个事件,当有事件触发时,会将事件集对应位置1,通过按位或的方式。

rerrick_rose的博客 1111

OSAL 之功耗管理

尊重原创,转载请注明: 基于蓝牙4.0,协议栈版本是1.3.2 在OSAL中的OSAL_PwrMgr.c与OSAL_PwrMgr.h两个文件实现对功耗的控制。 首先是功耗管理的结构体定义 typedef struct { uint16 pwrmgr_task_state; //是否进入节能模式 uint16 pwrmgr_next_timeout; //记录软件定时器中下

Vincent 3226

OSAL之任务管理

转载请注明出处,尊重原创总论OSAL每个任务最多只能支持16个事件处理,对于一些运算能力不强,内存空间不大的处理器最适合不过了。OSAL实际上不是一个真正意义上的操作系统,在加上它最多只能处理16个事件,所以OSAL没有像其他操作系统一样有复杂的任务调度算法,每个任务都是有序轮流执行。OSAL的任务管理代码主要在OSAL.c中。1、定义任务事件处理函数的格式最常用的任务函数格式是:有几个参数以及返回

Vincent 3075

STM32 OSAL操作系统抽象层的移植

OSAL(operating system abstraction layer),操作系统抽象层,是一种以实现多任务为核心的系统资源管理机制,实现了类似RTOS的某些功能,但并不能称之为真正意义上的RTOS,因为其本身还不支持任务的挂起,任务的抢占等等功能,但是这种机制,实现的代码十分精简,占用资源也非常少,对于资源十分紧张的嵌入式平台,也可以完成比较复杂的逻辑功能。

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 1万+

OSAL任务调度

OSAL的main函数在zmain.c文件中定义,(本文以TI官方例程GenericApp为例)原型如下: int main( void ) {   osal_int_disable( INTS_ALL );   HAL_BOARD_INIT();   zmain_vdd_check();   InitBoard( OB_COLD );   HalDriverInit();   o

u011710598的专栏 2835

BLE协议栈学习2——OSAL

对OSAL进行简介,同时完成4个OSAL有关的实验

江苏学蠡信息科技有限公司是一家国家高新技术企业,与众多高校深入开展产学研合作,有一支以硕博士为主导的研发和服务团队,获得自主知识产权十余项。围绕中国高等教育人工智能及物联网专业发展规划,创新性的推出人工智能类、物联网类、嵌入式类三大学科教学产品与培训服务。 1630

OSAL之回调定时器相关分析

本文基于协议栈1.3.2阐述,请尊重原创总论:OSAL提供一种可以带回调函数功能的定时器,它的实现主要在Osal_ctimer.c与Osal_cbtimer.h两个文件中。回调定时器的是在OSAL的软件定时器基础上注册一个回调函数,当定时器时间到的时候,会执行事先注册的回调函数。相比与事件定时器的比较是:回调定时器用一个任务来处理所有回调定时器的相关事件,每个任务可以处理15个回调定时器的事件,事件

Vincent 3898

OSAL之时间管理,软件定时器链表管理

读源码写作,尊重原创;本博文根据蓝牙4.0, 协议族版本是1.3.2 本博文分两大块。一部分是时间管理,另一部分是软件定时器管理。OSAL的时钟实现在OSAL_CockBLE.c与OSAL_Clock.h两个文件中。OSAL支持完整的UTC(世界统一时间),以2000年1月1日00:00:00为时间起点,可以精确到年、月、日、时、分、秒的时间值。背景知识// number of seconds s

Vincent 4892

基于OSAL的嵌入式裸机事件驱动框架——内存管理osal_memory

如果使用外部RAM,theHeap被定义为一个指向外部RAM起始地址的指针. 反之则定义一个静态数组_theHeap,数组的大小为,halDataAlign_t类型。静态数组意味着其生命周期从程序开始一直持续到程序结束,且其存储空间在静态存储区,而不是在栈上。这使得_theHeap可以在整个程序运行期间保持其值。: 这是一个GCC编译器的扩展属性,用于指定变量的对齐方式。在这种情况下,_theHeap数组将被对齐到32字节的边界。这意味着_theHeap的起始地址将是32的倍数。

rerrick_rose的博客 1181

OSAL操作系统实验学习笔记04

相信接触了OSAL操作系统之后对它的任务资源分配机制还是很模糊,我细看了很多遍也还是略知一二,现在分享一篇我觉得写得特别好的文章。 深入浅出Z-Stack OSAL多任务资源分配机制 一 概述   OSAL (Operating System Abstraction Layer),翻译为“操作系统抽象层”。如何理解这个复杂的名词呢?表面上看它是作为操作系统存在的,可是为什么又加上“抽象层”呢?

Mr_White01的博客 2372

OSAL移植到STM8

    最近需要用STM8S105做驱动控制器,涉及到使用485与上位机通讯,上位机的蓝牙模块中使用CC2541。这是个新产品,没有可借鉴的代码,涉及到的协议解算和逻辑结构又比较多,规划了一下架构并尝试写了几行代码,发现在编程幼稚园中学的状态机式编程实在难以胜任,于是打算上一个操作系统。 考虑到ucos代码量比较大,不适用于这种小片子,一时难以抉择。忽然想到已经在BLE上耕耘了大半年了,使用...

BlairFee的博客 3753

OSAL操作系统

这份文档写的很详细,代码注释很详细,适用于初学者。

CF鼠标宏防封指南:手把手教你调校罗技G HUB压枪脚本的延迟与随机数

本文详细解析了如何通过罗技G HUB的Lua脚本功能调校鼠标宏,实现拟真操作体验。重点介绍了随机数应用、动态后坐力补偿和智能操作序列等高级技术,帮助玩家在不违反游戏规则的前提下提升操作精度。

weixin_26841957的博客 332
上一篇: Android service概述
下一篇: Windows路径探究
计算机与认知
博客等级 码龄14年 31粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值