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

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

3天内不再提示

单片机裸机和RTOS多线程的区别

jf_BxU6dNQb 来源:混说Linux 2023-04-04 14:08 次阅读

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

裸机系统

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

1. 轮询系统

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

intmain(void)
{
/*硬件相关初始化*/
HardWareInit();

/*无限循环*/
for(;;){
/*处理事情1*/
DoSomething1();

/*处理事情2*/
DoSomething2();

/*处理事情3*/
DoSomething3();
}
}

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

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

2. 前后台系统

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

intflag1=0;
intflag2=0;
intflag3=0;

intmain(void)
{
/*硬件相关初始化*/
HardWareInit();

/*无限循环*/
for(;;){
if(flag1){
/*处理事情1*/
DoSomething1();
}

if(flag2){
/*处理事情2*/
DoSomething2();
}

if(flag3){
/*处理事情3*/
DoSomething3();
}
}
}

voidISR1(void)
{
/*置位标志位*/
flag1=1;
/*如果事件处理时间很短,则在中断里面处理
如果事件处理时间比较长,在回到后台处理*/
DoSomething1();
}

voidISR2(void)
{
/*置位标志位*/
flag2=2;

/*如果事件处理时间很短,则在中断里面处理
如果事件处理时间比较长,在回到后台处理*/
DoSomething2();
}

voidISR3(void)
{
/*置位标志位*/
flag3=1;
/*如果事件处理时间很短,则在中断里面处理
如果事件处理时间比较长,在回到后台处理*/
DoSomething3();
}

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

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

RTOS多线程

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

当一个紧急的事件在中断被标记之后,如果事件对应的线程的优先级足够高,就会立马得到响应。相比前后台系统,多线程系统的实时性又被提高了。

多线程系统大概的伪代码具体见代码清单所示:

intflag1=0;
intflag2=0;
intflag3=0;

intmain(void)
{
/*硬件相关初始化*/
HardWareInit();

/*OS初始化*/
RTOSInit();

/*OS启动,开始多线程调度,不再返回*/
RTOSStart();
}

voidISR1(void)
{
/*置位标志位*/
flag1=1;
}

voidISR2(void)
{
/*置位标志位*/
flag2=2;
}

voidISR3(void)
{
/*置位标志位*/
flag3=1;
}

voidDoSomething1(void)
{
/*无限循环,不能返回*/
for(;;){
/*线程实体*/
if(flag1){

}
}
}

voidDoSomething2(void)
{
/*无限循环,不能返回*/
for(;;){
/*线程实体*/
if(flag2){

}
}
}

voidDoSomething3(void)
{
/*无限循环,不能返回*/
for(;;){
/*线程实体*/
if(flag3){

}
}
}

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

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

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

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

230907e0-d2a2-11ed-bfe3-dac502259ad0.jpg

审核编辑:汤梓红

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

    关注

    6001

    文章

    43973

    浏览量

    620835
  • 操作系统
    +关注

    关注

    37

    文章

    6284

    浏览量

    121877
  • 多线程
    +关注

    关注

    0

    文章

    271

    浏览量

    19724
  • RTOS
    +关注

    关注

    20

    文章

    776

    浏览量

    118796
  • 裸机
    +关注

    关注

    0

    文章

    37

    浏览量

    6154

原文标题:单片机裸机 vs RTOS多线程

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

收藏 人收藏

    评论

    相关推荐

    如何学习RTOS

    RT-Thread即可获得完整的电子版。为什么要学习RTOS当我们进入嵌入式这个领域的时候,往往首先接触的都是单片机编程,单片机编程又首选51单片机来入门。这里面说的
    发表于 11-22 13:45

    51单片机多线程实现

    51单片机多线程实现,给STC89C52RC单片机移植RTX-Tiny操作系统,简单到爆,B格拉满了,好吧?
    发表于 07-14 06:43

    多线程和多进程的区别

    6.你的数据库一会又500个连接数,一会有10个,你分析一下情况7.udp和tcp的区别8.多线程和多进程的区别9.有一台web服务器,你选择用多线程还是多进程,...
    发表于 07-19 07:21

    基于51单片机多线程操作系统 精选资料分享

    我知道,在51单片机上运行一个操作系统,大多数情况下并不实用。但51单片机广为人知。所以我认为,用它来逐步的实现一个多线程操作系统,使得读者以更多的精力思考操作系统的设计,弱化芯片本身的概念。此处
    发表于 07-20 07:55

    基于linux的单片机开发和裸机开发的区别

    1.基于linux的单片机开发和裸机开发的区别\qquad单片机裸机开发和基于linux的单片机
    发表于 11-19 08:21

    单片机和嵌入式有何区别

    为小家电,终端设备。嵌入式片上资源丰富,价格高,应用领域广泛,基本可以适用于任何领域。开发模式单片机一般都是裸机开发,程序规模较小,只有在比较高端的芯片上才会使用RTOS嵌入式开发一...
    发表于 11-23 07:18

    请问单片机怎么实现真正的多线程?

    单片机怎么实现真正的多线程?​
    发表于 10-18 06:45

    利用多线程思想实现单片机系统的伪并行处理

    介绍和分析了一种原用于计算机高级语言的编程思想---多线程编程,向单片机控制系统的移植。利用多线程的编程思想进行单片机的复杂控制,可以应用到一些对系统控制有苛刻
    发表于 08-07 09:09 40次下载

    时分多线程技术在单片机中的应用

    本文就时分多线程技术在单片机中的应用进行了介绍。该方法为构建低成本、高效、便于维护的单片机系统提供了良好的体系框架结构和设计思想。
    发表于 06-09 10:24 2905次阅读
    时分<b class='flag-5'>多线程</b>技术在<b class='flag-5'>单片机</b>中的应用

    多线程好还是单线程好?单线程多线程区别 优缺点分析

    摘要:如今单线程多线程已经得到普遍运用,那么到底多线程好还是单线程好呢?单线程多线程
    发表于 12-08 09:33 8w次阅读

    RTOS多线程访问同一硬件(如UART)的方法

    RTOS多线程(任务)访问同一硬件(如UART)的方法
    的头像 发表于 03-12 11:28 4997次阅读

    裸机多线程系统的区别

    编辑整理:ZhengN 素材来源:RT-Thread书籍 很多初学者都是从裸机开始学起,不能明白裸机和操作系统的区别。甚至有不少人认为用中断就能代替多任务处理,你认同吗? 裸机系统
    的头像 发表于 09-03 15:47 2122次阅读
    <b class='flag-5'>裸机</b>和<b class='flag-5'>多线程</b>系统的<b class='flag-5'>区别</b>

    Arduino AVR单片机通过threadhandler库跑多线程

    Arduino AVR单片机通过threadhandler库跑多线程
    发表于 11-14 21:06 8次下载
    Arduino AVR<b class='flag-5'>单片机</b>通过threadhandler库跑<b class='flag-5'>多线程</b>

    通过多线程来实现ADC采集功能和OLED显示功能

    RTOS编程和裸机编程最大的区别就是RTOS可实现多线程管理,这是RTOS的最大优势。既然跑了操
    的头像 发表于 11-20 09:30 5375次阅读
    通过<b class='flag-5'>多线程</b>来实现ADC采集功能和OLED显示功能

    RTOS多线程必须要MMU才行?

    的作用。 但是,并不是所有操作系统都需要MMU才行,我们嵌入式中很多常用的RTOS(实时操作系统)没有MMU一样可以实现多线程。 只是RTOS实现的多线程相对大型操作系统要简单一点,其
    的头像 发表于 10-11 18:56 1846次阅读