0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

裸机与RTOS的理解和并发带来的问题

Q4MP_gh_c472c21 来源:最后一个bug 作者:bug菌 2021-06-13 15:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1

裸机与RTOS的理解

首先这里只针对单核CPU架构的芯片展开讨论,大部分是MCU吧,而多核CPU的讨论相对比较复杂,暂不涉及~玩RTOS的朋友都知道,裸机与OS的最大区别就是实现多任务的并发,其实你说裸机就不能实现任务的并发吗 ? 这个需要看所站的角度吧,只是说RTOS并发的粒度可以更加细,因为你把裸机的任务拆分成多块运行,其实也是一种并发方式。从宏观上虽然RTOS的每个任务都是在并发执行,其实微观上还是一条一条指令在顺序执行着。

而对于目前主流的RTOS,如UCOS或者FreeRTOS,所实现的都是多任务,更多的是一种多线程的并发执行而非多进程,所以对应到Linux平台上称他们为thread

2

并发带来的问题

并发的好处就是能够在更细的粒度来尽可能的提高CPU的利用率,这里不能说使用了多线程就一定能提高,这与你所设计的任务划分和处理有着直接的关系,只能说多线程相比裸机更有这个能力。

而任何事物都有其利弊,多个任务在没有同步处理的情况下,任务之间是无序运行的,无序也就意味着状态的多样性和复杂度。

当然bug菌这里所说的无序是一个相对的过程,比如对于CPU而言,它就是顺序的去执行一条一条的指令,所以在这个层面它是有序的、确定的。

而我们把过程放大,比如执行一条C语言语句,一般它是由多条汇编指令组成,对于目前的抢占式内核,在一段时间内其多个任务就有可能指令交替执行,当这些指令都去操作同一块内存,那么内存的最终结果由于顺序不同而不同,最终难以确定。

状态的不确定就有可能造成异常行为,也就是大家经常遇到的:“怎么跑着跑着就有问题,还没啥规律~”,“这段代码怎么看也没问题呀~”

所以对比看来RTOS确实会带来编程上的难度~

3

临界区

既然有难度,我们就要解决,把不确定性部分通过一些手段来变得确定,而造成这些不确定因素的动力是什么呢?是中断~

bug菌一直觉得,其实对于裸机而言,如果把中断服务函数看成一个更高优先级的抢占式任务,其实裸机主任务与中断任务就形成了一种两任务的并发,所以中断与任务之间也是有共享问题需要类似处理的。

为了解决这些不确定因素,我们只需要在这段代码区域限制中断的发生即可,这一段区域就是临界区,说得直白点 : 关中断与开中断。

1ENTER_CRITICAL();//进入临界区23//临界区代码45EXIT_CRITICAL();//退出临界区

4

临界区嵌套

临界区的使用没啥可说的,但是在你的代码中怎么加临界区确实一门技巧,可是说很多3~5年的工程师也并不一定处理得好,本文暂不展开,后面bug菌整理以后再分享给大家,今天只聊聊临界区嵌套使用的问题,毕竟很多朋友在这里掉过坑~

参考伪代码:

1/********************************************* 2 * Function: Fuction1 3 * Description:功能函数

4 * Author: bug菌 5 ********************************************/ 6void Fuction1(void)7{ 8 ENTER_CRITICAL();//进入临界区 910 //do something~1112 EXIT_CRITICAL();//退出临界区

13} 14/********************************************* 15 * Function: Fuction2 16 * Description: 功能函数 17 * Author: bug菌 18 ********************************************/19void Fuction2(void) 20{ 21 ENTER_CRITICAL();//进入临界区2223... 24 Fuction1(); 2526. 27 //do something~2829 EXIT_CRITICAL();//退出临界区30}

这种临界区的使用是很多朋友常犯的错误,当然这里的临界区操作仅仅只是开关中断,许多自己公司写的,或者裁剪的都是这种简约开关中断版本,所以当调用Function1函数以后,后面的代码就不在临界区内了,此时就有可能会存在共享问题。

当然目前的开源OS都会提供一种把相关嵌套标记保存在局部变量中的处理方式,如下代码所示:

1//来源于ucos源码 2#define OS_ENTER_CRITICAL() (cpu_sr = OSCPUSaveSR()) 3#define OS_EXIT_CRITICAL()

(OSCPURestoreSR(cpu_sr)) 4 5/*********************************************6 * Function: Fuction1 7 * Description:功能函数 8 * Author: bug菌 9 ********************************************/10void Fuction1(void) 11{ 12 int cpu_sr; 1314 OS_ENTER_CRITICAL();//进入临界区

1516 //do something~1718 OS_EXIT_CRITICAL();//退出临界区

19} 2021/********************************************* 22 * Function: Fuction2 23 * Description: 功能函数 24 * Author: bug菌

25 ********************************************/26void Fuction2(void) 27{ 28 int cpu_sr; 2930 OS_ENTER_CRITICAL();//进入临界区3132 Fuction1(void); 3334 OS_EXIT_CRITICAL();//退出临界区

3536}

为了更好的理解,我写了一下下面的伪代码,供大家参数~

1//中断寄存器register原本是1, 向register写0关中断,向register写1开中断 2 3void Fuction2(void) 4{ 5 int cpu_sr1 = 0; 6 7 cpu_sr1 = register; 8 register = 0;

//register == 0;

cpu_sr1 == 1; 910 void Fuction1(void) 11 { 12 int cpu_sr1 = 0; 1314 cpu_sr2 = register; 15 register = 0; //register == 0;cpu_sr2 == 0;

161718 register = cpu_sr2; 19 cpu_sr2 = 0;//register == 0;

cpu_sr2 == 0;20 } 2122 register = cpu_sr1; 23 cpu_sr1 = 0;//register == 1;cpu_sr1 == 0;2425}

不同的OS可能具体实现有所差异,大体上都一样~

原文标题:同事在RTOS“临界区嵌套使用”栽了跟头~

文章出处:【微信公众号:嵌入式ARM】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11223

    浏览量

    223016
  • RTOS
    +关注

    关注

    25

    文章

    863

    浏览量

    122623
  • 裸机程序
    +关注

    关注

    0

    文章

    5

    浏览量

    7141

原文标题:同事在RTOS"临界区嵌套使用"栽了跟头~

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    裸机前后台的系统

    裸机系统中,所有的操作都是在一个无限的大循环里面实现,支持中断检测。外部中断紧急事件在中断里面标记或者响应,中断服务称为前台,main 函数里面的while(1)无限循环称为后台,按顺序处理业务
    发表于 12-08 07:34

    请问rtos效率能有裸机的多少啊?

    rtos效率能有裸机的多少啊?
    发表于 12-05 07:37

    学习RTOS的意义?

    对于嵌入式软件工程师,学习RTOS非常有必要。 1. 项目需要 随着产品要实现的功能越来越多,单纯的裸机系统已经不能完美地解决问题,反而会使编程变得更加复杂,如果想降低编程的难度,就必须引入
    发表于 11-27 08:16

    RTOS 必学概念:任务、信号量、队列一次搞懂

    如果你刚接触RTOS(实时操作系统),很可能会有这样的困惑:“RTOS裸机程序到底有什么区别?”“任务是线程吗?为什么要分任务?”“信号量和互斥锁有什么区别,不都是同步手段吗?”“队列是不是就是一
    的头像 发表于 11-17 10:53 209次阅读
    <b class='flag-5'>RTOS</b> 必学概念:任务、信号量、队列一次搞懂

    深度技术解析nRF Connect SDK裸机选项方案

    设计,例如需要连接功能的直接数据交换应用(如医疗设备、运动可穿戴设备、追踪器或信标等场景),此类应用毋须使用RTOS或高级功能。 裸机选项已集成至nRF Connect for VS Code开发环境
    发表于 10-31 23:11

    深度技术解析低功耗蓝牙厂商nordic的nRF Connect SDK裸机选项方案

    RTOS方面。 由于裸机选项的开发与基于Zephyr RTOS的开发在核心机制上高度一致,当用户认为RTOS能为新应用或开发流程带来额外价值
    发表于 10-29 21:17

    请问编译纯rtos到底是选择Linux+rtos的sdk编译only rtos还是直接使用rtos sdk?

    编译纯rtos到底是选择Linux+rtos的sdk编译only rtos还是直接使用rtos sdk?
    发表于 07-11 07:22

    【STM32单片机学习进阶路线】FreeRTOS嵌入式开发指南:从入门到智能循迹避障小车项目实战(含文档代码)

    STM32的学习路径一般是先掌握裸机开发,再进阶学习RTOS。简单的功能可通过裸机实现,而复杂产品则需借助RTOS来完成。随着RTOS应用场
    的头像 发表于 05-29 11:46 912次阅读
    【STM32单片机学习进阶路线】FreeRTOS嵌入式开发指南:从入门到智能循迹避障小车项目实战(含文档代码)

    STM32裸机及FreeRTOS项目分享:U575智能手表+F103智能循迹避障小车(附全套教程/代码)

    初学者学STM32时,有一个好的学习路线是非常重要的,推荐"裸机开发--裸机项目--RTOS开发--RTOS项目"这个体系化路线,从基础技能到项目实战一步步进阶,能让学习更有
    的头像 发表于 05-27 17:09 1191次阅读
    STM32<b class='flag-5'>裸机</b>及FreeRTOS项目分享:U575智能手表+F103智能循迹避障小车(附全套教程/代码)

    详解RTOS中的Hook函数

    Hook函数是RTOS中的一个关键特性,通过该函数,用户可以增强对任务管理的控制,定义系统行为。
    的头像 发表于 03-24 16:14 845次阅读

    DeepSeek企业级部署RakSmart裸机云环境准备指南

    RakSmart裸机云环境中部署DeepSeek的企业级环境准备指南,内容涵盖关键步骤和注意事项,主机推荐小编为您整理发布DeepSeek企业级RakSmart裸机云部署指南。
    的头像 发表于 03-24 10:07 759次阅读

    RTOS中的本地存储指针使用

    本地存储指针是RTOS中的一个重要特性,增强了任务管理和数据处理能力。在RTOS上下文中,本地存储是指存储在本地的特定任务或对象的数据。通常与任务本地存储(Task Local Storage,TLS)有关,其中数据存储在任务控制块(TCB)中,允许每个任务具有私有的、特
    的头像 发表于 02-28 16:33 1176次阅读
    <b class='flag-5'>RTOS</b>中的本地存储指针使用

    美国裸机云服务器是什么详细介绍

    美国裸机云服务器是一种高性能的计算资源,在云计算领域逐渐受到企业和开发者的青睐。主机推荐小编为您整理发布美国裸机云服务器的详细介绍,希望对您了解美国裸机云服务器是什么有帮助。
    的头像 发表于 02-07 15:56 627次阅读

    “国产双系统”出炉!复旦微FMQL20SM非对称AMP:Linux + 裸机

    Linux + RTOS/裸机,但需一个主核心来控制整个系统以及其它从核心。每个处理器核心相互隔离,拥有属于自己的内存,既可各自独立运行不同的任务,又可多个核心之间进行核间通信。 图 1 FMQL20SM AMP异构多核框架示意图 “非对称 AMP” 对工业的重大意义 更
    的头像 发表于 01-24 13:46 1190次阅读
    “国产双系统”出炉!复旦微FMQL20SM非对称AMP:Linux + <b class='flag-5'>裸机</b>

    RZ T2H PCIe裸机程序开发和Linux下的配置介绍

    瑞萨电子最新推出RZ/T2H工业专用MPU,单芯片提供强大应用处理性能,多协议工业网络及高达9轴高精度实时控制,支持Linux,RTOS及baremetal操作。除了强大CPU性能和9轴控制外设外
    的头像 发表于 12-18 11:14 2510次阅读
    RZ T2H PCIe<b class='flag-5'>裸机</b>程序开发和Linux下的配置介绍