资讯详情

资讯详情

BSY-OS 实时操作系统

BSY_OS操作系统---之系统简介BSY_OS操作系统是我自己开发的一款单片机实时操作系统偷个懒同样是用我公司名称“贝斯源”命名 是一个超轻量级的的实时操作系统它主要用于嵌入式系统。对单片机要求低系统内核占用约3K flash在Mega48Pa 4K flash 、512K RAM的芯片在8M的工作频率下可以飞速运行经测试可以跑一个简单的LED任务系统占用小便于学习和移植同时可以简化编程思维和降低程序间耦合性简单易用容易理解半天就能上手。现在给大家开源出去供大家学习和使用也欢迎各位高手再此基础上进行功能扩展欢迎前来交流张工---邮箱yc_bsy126.com Github账号: https://github.com/YCBSY-zyz/BSY-OS /Giteehttps://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偏差是怎么来的就是任务优先级低或上一个任务还没执行完中断优先执行带来的。 //同样也不需要在通过forwhile之类的用延时来达到目的更不要用delay_ms这样的延时 //这里举例只是为了说明在本系统下所有任务在时间处理上是具备天然优势的是自带定时的 }运行态BSY_OS实时操作系统只有三个任务态休眠态---就绪态---运行态。休眠态---就是任务运行结束后到等待下一次运行时的休眠时间就是等待运行就绪态---就是任务到了可以运行的时间加入运行队列等待调度器按优先级调用运行态---就是任务正在运行当中使用场景BSY-OS操作系统 可广泛应用于嵌入式领域如物联网设备、智能家居、智能穿戴设备、汽车电子等。其轻量级和可配置的特点使其非常适合资源受限的环境。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →