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

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

3天内不再提示

裸机和多线程系统的区别

strongerHuang 来源:ZhengN 作者:ZhengN 2020-09-03 15:47 次阅读

编辑整理:ZhengN

素材来源:RT-Thread书籍

很多初学者都是从裸机开始学起,不能明白裸机和操作系统的区别。甚至有不少人认为用中断就能代替多任务处理,你认同吗?

裸机系统

裸机系统通常分成轮询系统和前后台系统。

1、轮询系统

轮询系统即是在裸机编程的时候,先初始化好相关的硬件,然后让主程序在一个死循环里面不断循环,顺序地做各种事情,大概的伪代码具体如代码清单 1-1所示:

int main(void) { /* 硬件相关初始化 */ HardWareInit(); /* 无限循环 */ for (;;) { /* 处理事情 1 */ DoSomething1(); /* 处理事情 2 */ DoSomethingg2(); /* 处理事情 3 */ DoSomethingg3(); } }

轮询系统是一种非常简单的软件结构,通常只适用于那些只需要顺序执行代码且不需要外部事件来驱动的就能完成的事情。在代码清单 1-1 中,如果只是实现 LED 翻转,串口输出,液晶显示等这些操作,那么使用轮询系统将会非常完美。但是,如果加入了按键操作等需要检测外部信号的事件,用来interwetten与威廉的赔率体系 紧急报警,那么整个系统的实时响应能力就不会那么好了。

假设DoSomethingg3 是按键扫描,当外部按键被按下,相当于一个警报,这个时候,需要立马响 应 , 并 做 紧 急 处 理 , 而 这 个 时 候 程 序 刚 好 执 行 到 DoSomethingg1 , 要 命 的 是DoSomethingg1 需要执行的时间比较久,久到按键释放之后都没有执行完毕,那么当执行到 DoSomethingg3 的时候就会丢失掉一次事件。足见,轮询系统只适合顺序执行的功能代码,当有外部事件驱动时,实时性就会降低。

2、前后台系统

相比轮询系统,前后台系统是在轮询系统的基础上加入了中断。外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成,中断在这里我们称为前台, main 函数里面的无限循环我们称为后台,大概的伪代码见代码清单 1-2所示:

int flag1 = 0; int flag2 = 0; int flag3 = 0; int main(void) { /* 硬件相关初始化 */ HardWareInit(); /* 无限循环 */ for (;;) { if (flag1) { /* 处理事情 1 */ DoSomething1(); } if (flag2) { /* 处理事情 2 */ DoSomethingg2(); } if (flag3) { /* 处理事情 3 */ DoSomethingg3(); } } } void ISR1(void) { /* 置位标志位 */ flag1 = 1; /* 如果事件处理时间很短,则在中断里面处理 如果事件处理时间比较长,在回到后台处理 */ DoSomething1(); } void ISR2(void) { /* 置位标志位 */ flag2 = 2; /* 如果事件处理时间很短,则在中断里面处理 如果事件处理时间比较长,在回到后台处理 */ DoSomething2(); } void ISR3(void) { /* 置位标志位 */ flag3 = 1; /* 如果事件处理时间很短,则在中断里面处理 如果事件处理时间比较长,在回到后台处理 */ DoSomething3(); }

在顺序执行后台程序的时候,如果有中断来临,那么中断会打断后台程序的正常执行流,转而去执行中断服务程序,在中断服务程序里面标记事件,如果事件要处理的事情很简短,则可在中断服务程序里面处理,如果事件要处理的事情比较多,则返回到后台程序里面处理。

虽然事件的响应和处理是分开了,但是事件的处理还是在后台里面顺序执行的,但相比轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,这可以大大的提高程序的实时响应能力。在大多数的中小型项目中,前后台系统运用的好,堪称有操作系统的效果。

多线程系统

相比前后台系统,多线程系统的事件响应也是在中断中完成的,但是事件的处理是在线程中完成的。在多线程系统中,线程跟中断一样,也具有优先级,优先级高的线程会被优先执行。

当一个紧急的事件在中断被标记之后,如果事件对应的线程的优先级足够高,就会立马得到响应。相比前后台系统,多线程系统的实时性又被提高了。多线程系统大概的伪代码具体见代码清单 1-3所示:

int flag1 = 0; int flag2 = 0; int flag3 = 0; int main(void) { /* 硬件相关初始化 */ HardWareInit(); /* OS 初始化 */ RTOSInit(); /* OS 启动,开始多线程调度,不再返回 */ RTOSStart(); } void ISR1(void) { /* 置位标志位 */ flag1 = 1; } void ISR2(void) { /* 置位标志位 */ flag2 = 2; } void ISR3(void) { /* 置位标志位 */ flag3 = 1; } void DoSomething1(void) { /* 无限循环,不能返回 */ for (;;) { /* 线程实体 */ if (flag1) { } } } void DoSomething2(void) { /* 无限循环,不能返回 */ for (;;) { /* 线程实体 */ if (flag2) { } } } void DoSomething3(void) { /* 无限循环,不能返回 */ for (;;) { /* 线程实体 */ if (flag3) { } } }

相比前后台系统中后台顺序执行的程序主体,在多线程系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称之为线程。

每个线程都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理。加入操作系统后,我们在编程的时候不需要精心地去设计程序的执行流,不用担心每个功能模块之间是否存在干扰。

加入了操作系统,我们的编程反而变得简单了。整个系统随之带来的额外开销就是操作系统占据的那一丁点的 FLASH 和 RAM。现如今,单片机的 FLASH 和 RAM 是越来越大,完全足以抵挡 RTOS 那点开销。

轮询、前后台和多线程系统软件模型区别:

以上是关于裸机系统与多线程系统的笔记,摘抄于《RT-Thread内核实现与应用开发实践指南》一书。

原文标题:裸机系统与多线程系统的区别

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

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

    关注

    0

    文章

    278

    浏览量

    19948
  • 裸机
    +关注

    关注

    0

    文章

    39

    浏览量

    6375

原文标题:裸机系统与多线程系统的区别

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

收藏 人收藏

    评论

    相关推荐

    socket 多线程编程实现方法

    在现代网络编程中,多线程威廉希尔官方网站 被广泛应用于提高服务器的并发处理能力。Socket编程是网络通信的基础,而将多线程威廉希尔官方网站 应用于Socket编程,可以显著提升服务器的性能。 多线程编程的基本概念 多线
    的头像 发表于 11-12 14:16 358次阅读

    Python中多线程和多进程的区别

    Python作为一种高级编程语言,提供了多种并发编程的方式,其中多线程与多进程是最常见的两种方式之一。在本文中,我们将探讨Python中多线程与多进程的概念、区别以及如何使用线程池与进
    的头像 发表于 10-23 11:48 399次阅读
    Python中<b class='flag-5'>多线程</b>和多进程的<b class='flag-5'>区别</b>

    CPU线程和程序线程区别

    CPU的线程与程序的线程在概念、作用、实现方式以及性能影响等方面存在显著差异。以下是对两者区别的详细阐述,旨在深入探讨这一威廉希尔官方网站 话题。
    的头像 发表于 09-02 11:18 995次阅读

    ESP32会不会有多线程问题,需要加锁吗?

    ESP32会不会有多线程问题,需要加锁吗
    发表于 07-19 08:05

    多线程设计模式到对 CompletableFuture 的应用

    最近在开发 延保服务 频道页时,为了提高查询效率,使用到了多线程威廉希尔官方网站 。为了对多线程方案设计有更加充分的了解,在业余时间读完了《图解 Java 多线程设计模式》这本书,觉得收获良多。本篇文章将介绍其中
    的头像 发表于 06-26 14:18 355次阅读
    从<b class='flag-5'>多线程</b>设计模式到对 CompletableFuture 的应用

    bootloader开多线程做引导程序,跳app初始化后直接进hardfualt,为什么?

    如标题,想做一个远程升级的项目,bootloader引导区域和app都是开多线程跑的,就是自己写了个小的任务调度器,没什么功能主要是想让程序快速的响应,延时不会对其他程序造成堵塞,程序测试
    发表于 04-18 06:07

    鸿蒙OS开发实例:【ArkTS类库多线程CPU密集型任务TaskPool】

    CPU密集型任务是指需要占用系统资源处理大量计算能力的任务,需要长时间运行,这段时间会阻塞线程其它事件的处理,不适宜放在主线程进行。例如图像处理、视频编码、数据分析等。 基于多线程
    的头像 发表于 04-01 22:25 840次阅读
    鸿蒙OS开发实例:【ArkTS类库<b class='flag-5'>多线程</b>CPU密集型任务TaskPool】

    鸿蒙APP开发:【ArkTS类库多线程】TaskPool和Worker的对比

    TaskPool(任务池)和Worker的作用是为应用程序提供一个多线程的运行环境,用于处理耗时的计算任务或其他密集型任务。可以有效地避免这些任务阻塞主线程,从而最大化系统的利用率,降低整体资源消耗,并提高
    的头像 发表于 03-26 22:09 649次阅读
    鸿蒙APP开发:【ArkTS类库<b class='flag-5'>多线程</b>】TaskPool和Worker的对比

    java实现多线程的几种方式

    Java实现多线程的几种方式 多线程是指程序中包含了两个或以上的线程,每个线程都可以并行执行不同的任务或操作。Java中的多线程可以提高程序
    的头像 发表于 03-14 16:55 701次阅读

    AT socket可以多线程调用吗?

    请问AT socket 可以多线程调用吗? 有互锁机制吗,还是要自己做互锁。
    发表于 03-01 08:22

    linux多线程编程实例

    linux线程
    的头像 发表于 02-15 21:16 468次阅读
    linux<b class='flag-5'>多线程</b>编程实例

    线程是什么的基本单位 进程与线程的本质区别

    线程是操作系统中处理器调度的基本单位,它代表着独立的执行流。在一个进程中,可以包含多个线程,这些线程共享相同的进程资源,如内存空间、文件描述符等。 进程是操作
    的头像 发表于 02-02 16:30 928次阅读

    几点RTOS相比裸机的优势分享

    相比前后台系统中后台顺序执行的程序主体,在多线程系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称之为线程
    发表于 01-24 18:21 818次阅读
    几点RTOS相比<b class='flag-5'>裸机</b>的优势分享

    mcu线程和进程的区别是什么

    MCU线程和进程是嵌入式系统中常见的并行执行的概念,它们之间有许多区别,包括线程与进程的定义、资源管理、通信机制、执行方式等等。下面将详细介绍MCU
    的头像 发表于 01-04 10:45 747次阅读

    报名启动|OpenHarmony源码转换器—多线程特性转换赛题

    点击蓝字 ╳ 关注我们 开源项目 OpenHarmony 是每个人的 OpenHarmony 原文标题:报名启动|OpenHarmony源码转换器—多线程特性转换赛题 文章出处:【微信公众号:OpenAtom OpenHarmony】欢迎添加关注!文章转载请注明出处。
    的头像 发表于 12-29 16:15 711次阅读
    报名启动|OpenHarmony源码转换器—<b class='flag-5'>多线程</b>特性转换赛题