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 翻转,串口输出,液晶显示等这些操作,那么使用轮询系统将会非常完美。但是,如果加入了按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么整个系统的实时响应能力就不会那么好了。

假设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

    文章

    279

    浏览量

    21122
  • 裸机
    +关注

    关注

    0

    文章

    42

    浏览量

    6988

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Java并发编程的“基石”——多线程概念初识

    。Java 的内存可见性机制(如 happens-before 原则)能够确保在极端并发下,任何一个调度节点看到的集群状态都是一致且准确的,从根本上杜绝了“脑裂”和资源超卖。 其次是 精妙的多线程协同
    发表于 04-16 18:50

    瑞芯微(EASY EAI)RV1126B 系统操作-线进程操作

    1.多线程介绍进程线程概念是操作系统与普通单片机最大的区别,多任务系统可以将系统资源分块,使得不
    的头像 发表于 04-13 14:14 163次阅读
    瑞芯微(EASY EAI)RV1126B <b class='flag-5'>系统</b>操作-线进程操作

    【瑞萨RA × Zephyr评测】多线程和看门狗

    本文章旨在评估使用 Zephyr RTOS 在 Renesas FPB-RA6E2 开发板上实现多线程调度与硬件看门狗功能的应用。评估内容包括任务调度、看门狗初始化流程、主程序逻辑的详细解析,以及实验现象与数据分析。
    的头像 发表于 01-10 10:23 2650次阅读
    【瑞萨RA × Zephyr评测】<b class='flag-5'>多线程</b>和看门狗

    搞嵌入式的为啥要一定要学习RTOS

    多线程系统 相比前后台系统多线程系统的事件响应也是在中断中完成的,但是事件的处理是在线程
    发表于 01-05 06:42

    解析Linux的进程、线程和协程

    系统资源。线程的引入使得多核处理器得以充分利用,因为多线程程序可以更有效地分配和管理多核心的计算资源。 线程的特点包括: (1)共享性:线程
    发表于 12-22 11:00

    多线程系统

    的优先级足够高,就会立马得到响应。相比其他裸机系统多线程系统的实时性又被提高了。 多线程系统
    发表于 12-08 07:55

    裸机前后台的系统

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

    Linux多线程对比单线程的优势

    在Linux系统中,线程是操作系统能够进行运算调度的最小单位。线程被包含在进程之中,是进程中的实际运行单位。一个进程可以拥有多个线程,这些
    发表于 12-01 06:11

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

    nRF Connect SDK裸机选项是nRF Connect SDK 环境中新增的替代开发路径,支持在nRF54L系列上进行单线程裸机低功耗蓝牙应用开发。该选项专为开发简单低功耗蓝牙应用的开发者
    发表于 10-31 23:11

    rt-thread studio 如何进行多线程编译?

    ,使用的是5800h+32g内存+sn550 ssd,开启16线程编译时cpu的占用率也只能到30%,编译完整个工程需要3分钟 感觉多线程编译设置没有生效,有办法提高编译速度吗 rtthread studio版本是 2.2.9
    发表于 10-11 09:16

    多线程与多处理有何区别

    多处理也称为进程,进程是一个在自己的内存空间中运行的独立程序。
    的头像 发表于 09-16 14:21 675次阅读

    【HZ-T536开发板免费体验】—— linux创建线程

    自己的私有资源。 在linux系统中,线程状态通常反映了当前线程的当前活动和执行阶段。 主要分为: 1。运行转态 2。阻塞转态 3。终止状态 如何区分单线程
    发表于 09-01 21:31

    【RA4E2开发板评测】LED1及LED2轮流点亮并同时亮8秒,体验FreeRTOS多线程

    我们要多线程操作时,就需要用到RTOS(Real-Time Operating System)。FreeRTOS实时操作系统开发里面使用到vTaskDelay函数,它是对CPU的时分复用,系统将这个
    发表于 08-24 17:24

    多线程的安全注意事项

    多线程安全是指多个线程同时访问或修改共享资源时,能够保证程序的正确性和可靠性。 开发者选择TaskPool或Worker进行多线程开发时,在TaskPool和Worker的工作线程中导
    发表于 06-20 07:49

    工控一体机多线程任务调度优化:聚徽分享破解工业复杂流程高效协同密码

    在当今工业 4.0 的浪潮下,工业生产正朝着高度自动化、智能化的方向大步迈进。生产流程日益复杂,众多任务需要同时、高效地协同执行,这对工业控制系统的核心 —— 工控一体机提出了前所未有的挑战。多线程
    的头像 发表于 05-28 14:06 742次阅读