为什么我们需要uCos?带你透彻理解RTOS

2023-05-16

与uCos见面还是大学的时候,老师让我为毕业设计选一个课题,要求有关嵌入式实时操作系统,于是开始在网上搜索,顺理成章的就发现了uCos,于是开始了uCos之路,但后来由于硬件平台的问题,毕设没有用uCos,而用了另外一个不开源的。

 

毕业后,自己做的项目用到过RTX51,uCos,Linux,当做linux下的项目时,研究过一阵子linux的源码,后来又一天,闲来无事再去看uCos的源码时,突然发现uCos里的一些原理,对于理解和构建一个操作系统这这么的经典和透彻!


今天就给大家来整理一下uCos里的一些原理,相信对于更透彻的理解RTOS定会有好处,如果你确实没什么收获,就当是打发时间吧!

首先,第一个要解决的问题是,为什么我们需要uCos?就像最开始学C编程时,老师告诉我们,指针很重要,那时你肯定有一个大的疑问,指针到底有什么好?心里一直犯嘀咕着:不用指针不一样把程序编出来了?  现在想想看c语言没了指针,是不是寸步难行呢。回到正题,我们到底为什么需要uCos?

 

一般的简单的嵌入式设备的编程思路是下面这样的:

main

{

    {处理事务1};

    {处理事务2};

    {处理事务3};

        .......

    {处理事务N};

}

isr_server

{

    {处理中断};

}


这是最一般的思路,对于简单的系统当然是够用了,但这样的系统实时性是很差的,比如“事务1”如果是一个用户输入的检测,当用户输入时,如果程序正在处理事务1下面的那些事务,那么这次用户输入将失效,用户的体验是“这个按键不灵敏,这个机器很慢”,而我们如果把事务放到中断里去处理,虽然改善了实时性但会导致另外一个问题,有可能会引发中断丢失,这个后果有时候比“慢一点”更加严重和恶劣!又比如事务2是一个只需要1s钟处理一次的任务,那么显然事务2会白白浪费CPU的时间。

      

这时,我们可能需要改进我们的编程思路,一般我们会尝试采用“时间片”的方式。这时候编程会变成下面的方式:

main

{

      {事务1的时间片到了则处理事务1};

      {事务2的时间片到了则处理事务2};

               .......

      {事务N的时间片到了则处理事务N};

}

time_isr_server

{

       {判断每个事务的时间片是否到来,并进行标记};

}

isr_server

{

      {处理中断};

}


我们可以看到,这种改进后的思路,使得事务的执行时间得到控制,事务只在自己的时间片到来后,才会去执行,但我们发现,这种方式仍然不能彻底解决“实时性”的问题,因为某个事务的时间片到来后,也不能立即就执行,她必须等到当前事务的时间片用完,并且后面的事务时间片没到来,她才有机会获得“执行时间”。

        

这时候我们需要继续改进思路,为了使得某个事务的时间片到来后能立即执行,我们需要在时钟中断里判断完时间片后,改变程序的返回位置,让程序不返回到刚刚被打断的位置,而从最新获得了时间片的事务处开始执行,这样就彻底解决了事务的实时问题。

       

我们在这个思路上,进行改进,我们需要在每次进入时钟中断前,保存CPU的当前状态和当前事务用到的一些数据,然后我们进入时钟中断进行时间片处理,若发现有新的更紧急的事务的时间片到来了,则我们改变中断的返回的地址,并在CPU中恢复这个更紧急的事务的现场,然后返回中断开始执行这个更紧急的事务。

      

上面的这段话有些不好读,事实上,这是因为要实现这个过程是有些复杂和麻烦的,这时候我们就需要找一个操作系统(OS)帮我们做这些事了,如果你能自己用代码实现这个过程,事实上你就在自己写操作系统了,其实从这里也可也看出,操作系统的原理其实并不那么神秘,只是一些细节你很难做好。uCos就是这样一个操作系统,她能帮你完成这些事情,而且是很优雅的帮你完成!

      

到这里,我们终于知道了为什么我们需要uCos了。事实上,uCos的用处远不止帮你完成这个“事务时间片的处理”,她还能帮你处理各种超时,进行内存管理,完成任务间的通信等,有了她,程序的层次也更加清晰,给系统添加功能也更方便,这一切在大型项目中越发的明显!

     

我们知道了uCos能给我们提供这么多的便利,那么我们就开始使用uCos吧!


转载自:微信公众号 嵌入式ARM



请继续收看下篇:uCos的多任务实现   |   uCos的内存管理
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我们需要uCos?带你透彻理解RTOS 的相关文章

随机推荐

  • 蓝牙协议栈

    蓝牙协议栈 蓝牙技术规范的目的是使符合该规范的各种应用之间能够实现互操作 互操作的远端设备需要使用相同的协议栈 xff0c 不同的应用需要不同的协议栈 但是 xff0c 所有的应用都要使用蓝牙技术规范中的数据链路层和物理层 完整的蓝牙协议栈
  • vscode 结合git基础操作之代码冲突解决

    在branch demo 1上面提交一个var d 61 xxx xff0c 假设不是我提交的 既然不是我提交的 xff0c 我在本地的代码并没有git pull 把最新的代码拉下来 xff0c 我就写了一个var f 61 xxx xff
  • Nextcloud使用手册

    1 用户登陆 访问地址 xff1a http 127 0 0 1 8080 管理员用户名 xff1a admin 密码 xff1a 2 面板介绍 边就是分享的链接 收藏 地址 xff0c 中间就是我们上传的图片 文档 程序等了 xff0c
  • 布谷鸟算法(cuckoo_search)可能会遇到的问题

    1 布谷鸟算法是先进行在pa的判断 xff0c 然后决定是进行Levy飞行还是做出相应毁坏蛋的行为 xff0c 再所有的粒子一起输出 2 布谷鸟算法里面的gamma函数在有的地方可能不能使用 xff0c 比如S Function xff0c
  • protues仿真常见问题解决方案

    目录 1 如何确定自己的仿真版本 2 仿真软件破解 3 仿真工程格式 4 未加载HEX文件 5 缺失元件模型 6 低版本无法打开高版本问题 7 仿真结果异常问题 8 仿真图打开失败 9 仿真运行过程中闪退 10 缺失 SDF文件 仿真出问题
  • 第20章 USART—串口通讯—零死角玩转STM32-F429系列

    第20章 USART 串口通讯 全套 200 集视频教程和 1000 页 PDF 教程请到秉火论坛下载 xff1a www firebbs cn 野火视频教程优酷观看网址 xff1a http i youku com firege 本章参考
  • UC/OS-II 源码下载【资源】

    目录 1 前序 2 官网下载源代码 3 STM32F1示例代码 1 前序 你是不是也在学习ucos相关知识 xff0c 想要去网上下载源码 xff0c 但是又不知道去哪里下载 xff0c 网上冲浪大半天也没找到源码 xff0c 结果键盘无故
  • 文件系统编译进内核

    1 利用busybox制作根文件目录 需要有init 和 linuxrc 2 makemenuconfig 在general setup 中设置 initial ram filesystem and RAM disk 后指定文件系统源文件路
  • 零基础制作平衡小车【连载】13---平衡小车代码讲解(附源码)

    前言 今天聊一聊代码 xff0c 只有直立功能的代码 代码总体思路 给定一个目标值 xff0c 单片机通过IIC和mpu6050通信 xff0c 得知数据后 xff0c 根据角度环计算出一个PWM值给电机驱动器 xff0c 从而控制单机转动
  • NRF51822---开发板介绍(连载1)

    无线遥控器项目先放一放吧 xff0c 要学习的东西太多了 xff0c 一开始以为很简单 xff0c 结果坑越挖越深 还保持采用NRF51822的方案做手柄 xff0c 在做之前先把51822这个骨头啃下来 我又重新开了一个专题 xff0c
  • nrf51822+rfx2401c系统板(开源原理图、PCB)

    快过年了 xff0c 没啥东西可送的 xff0c 就把刚做的射频板子开源了吧 原理图 3D图 板子还有点毛病 xff0c 不过问题不大 把PCB隔断 xff0c 飞根线就行了 xff0c 等你拿到手就能看到了 下图中画黑色圈的两个过孔把信号
  • 无名小哥对无名飞控中的问题回答总结

    文章目录 IIR二阶数字低通陀螺仪数据噪声传感器矫正姿态解算惯性导航控制滤波性能系统响应巴特沃斯滤波器的截止频率如何取累计漂移姿态估计精度误差大控制周期时间保证传感器数据不丢帧 IIR二阶数字低通 对于IIR而言 xff0c 阶次越高 xf
  • Vue反向代理服务器

    在项目中创建 vue config js 文件 module exports 61 devServer proxy 39 api 39 target 39 http localhost 3000 39 pathRewrite 39 api
  • putty连接centos7 Network error:connection timed out

    首先说明一下 xff0c centos7系统下的开机服务不再在 etc inittab的管理之下了 xff0c centos7使用systemd模块管理系统的服务 xff0c 所有的服务文件都改为 etc systemd system的 s
  • ESP32_使用天猫精灵利用巴法云控灯例程测试

    1 说明 虽然官方例程写的是ESP8266 xff0c 但是改一下就能直接用到ESP32的 xff0c 参考这个链接 xff1a esp8266接入天猫精灵教程 xff0c 附开源app控制 巴法开放论坛 xff0c 整个过程非常非常简单
  • 附录A 进阶游戏编程书籍总结与推荐

    章节导读 很多游戏编程书籍都有一个通病 xff0c 一本书写完 xff0c 读者看完之后 xff0c 不知道下一步该如何前进 这里的附录就是让大家看完这本书后 xff0c 知道自己接下来可以学习什么 xff0c 如何进一步提升自己 为学习思
  • 最受欢迎的菜品

    7 2 最受欢迎的菜品 20分 某自助餐厅要求餐厅的客人在就餐后进行投票 xff0c 选出一款最喜爱的菜品 xff0c 每日营业结束后进行投票统计 xff0c 选出投票数最多的菜品为最受欢迎的菜品 请编写一个程序帮助餐厅快速完成这个统计工作
  • 利用grafana&prometheus 快速配置k8s监控面板 & 主机监控面板

    系列文章目录 1 使用helm快速安装 grafana amp prometheus 2 利用grafana amp prometheus 快速配置 k8s amp 主机监控 3 grafana amp prometheus 快速配置报警规
  • 使用idea创建一个简单的servlet项目

    在创建一个简易的项目之前首先需要在idea配置好tomcat的环境 xff08 1 xff09 点击add configuration xff08 2 xff09 点击 xff0b 号 xff08 3 xff09 选择好你的tomcat版本
  • 为什么我们需要uCos?带你透彻理解RTOS

    与uCos见面还是大学的时候 xff0c 老师让我为毕业设计选一个课题 xff0c 要求有关嵌入式实时操作系统 xff0c 于是开始在网上搜索 xff0c 顺理成章的就发现了uCos xff0c 于是开始了uCos之路 xff0c 但后来由