BSY-OS 实时操作系统
BSY_OS操作系统---之系统简介
BSY_OS操作系统是我自己开发的一款单片机实时操作系统,偷个懒同样是用我公司名称“贝斯源”命名, 是一个超轻量级的的实时操作系统,它主要用于嵌入式系统。对单片机要求低(系统内核占用约3K flash,在Mega48Pa 4K flash 、512K RAM的芯片在8M的工作频率下可以飞速运行,经测试可以跑一个简单的LED任务),系统占用小,便于学习和移植;同时可以简化编程思维和降低程序间耦合性,简单易用,容易理解,半天就能上手。现在给大家开源出去,供大家学习和使用,也欢迎各位高手再此基础上进行功能扩展,欢迎前来交流,张工---邮箱:yc_bsy@126.com, Github账号: https://github.com/YCBSY-zyz/BSY-OS /Gitee:https://gitee.com/YCBSY/BSY-OS。
BSY_OS操作系统原理
-
内核架构
BSY_OS的内核采用了微内核架构,这种架构允许内核保持最小化,只提供必要的服务。微内核通常只包含最基本的线程调度。内核源代码只有200行左右。内核系统频率固定为1000Hz,也就是1ms产生一次中断,与其他实时操作系统不同的是,这里不是任务片运行时间,只是中断后内核处理任务状态的,并不运行和调度任务运行。
-
线程管理
在 BSY_OS 中,线程是执行任务的最小单位。线程管理包括线程的创建、调度、删除等。BSY_OS 采用优先级调度方式工作,可以根据线程的优先级来决定执行顺序,最大支持255个线程。
与其他操作系统理念不同的是,本系统不存在抢占式(即优先级高的任务来临会打断任务优先级低的任务),当前任务不执行完不会执行其他任务;“大道至简”,有时候考虑太多会反受其累;抢占式任务名义上是为了实时性要求提出来的,听起来很合理,但是你抢占式运行不需要保护上一个任务的现场吗?不需要载入当前高优先级任务的运行环境吗?准备工作做完了,才能运行这个任务,完成了又要恢复上一个任务的现场,这其中干了很多本不该干的事情,占用了一大堆资源(堆栈内存),影响了执行效率。当你的程序任务较多时,多层的任务嵌套就会严重影响到所谓的实时性,到那个时候实时性还可靠吗?既然这样,那么怎么保障BSY_OS系统的实时性呢?开拓下思路,转变下思维,尽量让每个线程任务执行的快一些,不一样的异曲同工之妙吗!因此,在程序运行中尽量不要使用使用延时,for、while之类的不确定结果的延时;使用状态机的思维去编程,就会提高执行速度,有时候运行任务的时间比那种频繁任务切换都要快,何必非要最求那种华而不实操作。把重要的任务优先级提高了,就会优先执行,保证实时性。实际工程应用中,有些所谓的实时性不像你想的那样重要,差个几十微秒,或几mS,也根本不影响什么。我用过其他的实时操作系统,与我这个系统跑同样的任务,BSY_OS系统有时候实时性反倒更高一些,因为纯粹而高效。
-
任务调度
调度器是 BSY_OS 的核心组件之一,负责决定哪个线程应该被执行。调度策略就是谁的优先级高谁先执行,不存在抢占。在 BSY_OS 调度运行中,调度器每次执行一个任务,执行完了就重新判定当下哪个就绪任务的优先级是最高的就执行哪个任务,这样可以确保高优先级的任务能够及时得到执行。
与其他操作系统不一样的是,每个任务线程都赋予了执行周期,不到时间不会执行,简而言之就是定时运行或定时调度;这就有一个优势,就是比单纯的状态机还要高效,大家都说状态机是裸机中最高效的,在主循环查询状态,根据状态决定这个任务是否去执行,虽然这个周期很短,但是架不住你的状态多啊!一个完整的项目有很多的这样的状态标识,你都要查询一遍;但是BSY_OS系统中任务不就绪,根本不会去调度这个任务,也不会去查询任务状态,因此效率也会更高。
-
内存管理
BSY_OS 操作系统内存占用极少,每个线程占用十几个byte内存,用户可根据自己的线程数多少来申请内存大小(线程数 x 20byte),相对于其他系统可以忽略不计。由于内存只保存每个任务的任务结构体,不会产生内存碎片,没有像其他操作系统一样设立单独的任务栈,不会占用大量内存,因此不会出现频繁的申请内存,释放内存等操作,执行效率更高,系统也更稳定。
-
实时性
BSY_OS被设计为实时操作系统,这意味着它能够确保在规定的时间内完成特定的任务。从上面的介绍就可以看出,内核调度就是基于定时进行任务计时处理,按任务优先级进行调度的,这就可以通过设置任务的优先级满足实时性的要求。因为是定时调度,程序任务对定时器的依赖会降低,除非是非常精确的定时,都将可以放弃使用定时器进行定时操作。依靠定时运行这个特性,会给编程提供很大的帮助,简化编程思维,编程时会省掉很多不必要的设置和操作,节省更多的单片机资源,同时代码更简捷,执行效率会更高,实时性也更好
//咱们就从简单的点亮一个LED开始,任务很简单LED 100MS闪烁一次,也就是快闪 //直接在创建任务时设置本任务执行周期为50MS,那么本任务就会50MS执行一次,一般来讲定时精度能达到1ms //执行任务的函数时下面这样的 //LED 100MS闪烁一次,本任务50MS执行一次,每次LED输出状态翻转一次,任务执行两次完成一次闪烁 uint8_t LedFlag = 0; void LedRun(void *pmt) { if(LedFlag != 0) LED(1); //LED点亮 else LED(0); //LED关闭 LedFlag = ~ledFlag; //状态标识取反 //这里不需要类似这样的延时调度函数,vTaskDelay(50) 进行线程休眠; //而且不需要考虑使用定时器,不需要中断配合,也没有累计误差,但时间偏差会有的,一般小于1MS,偏差是怎么来的,就是任务优先级低,或上一个任务还没执行完,中断优先执行带来的。 //同样也不需要在通过for,while,之类的用延时来达到目的,更不要用delay_ms这样的延时 //这里举例只是为了说明,在本系统下,所有任务在时间处理上是具备天然优势的,是自带定时的 } -
运行态
BSY_OS实时操作系统只有三个任务态,休眠态---就绪态---运行态。
休眠态---就是任务运行结束后到等待下一次运行时的休眠时间,就是等待运行
就绪态---就是任务到了可以运行的时间,加入运行队列,等待调度器按优先级调用
运行态---就是任务正在运行当中
使用场景
BSY-OS操作系统 可广泛应用于嵌入式领域,如物联网设备、智能家居、智能穿戴设备、汽车电子等。其轻量级和可配置的特点使其非常适合资源受限的环境。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐



所有评论(0)