创建或修改目录:/www/wwwroot/104.219.215.234/data 失败!
深爱激情网 RTOS的基本办法与线程基础常识 - 女优明星

深爱激情网 RTOS的基本办法与线程基础常识

发布日期:2024-11-01 11:57    点击次数:57

1 RTOS办法及线程的引入深爱激情网

本文援用地址:https://www.eepw.com.cn/article/202210/439154.htm

1.1 RTOS的办法

用东谈主来类比单片机按次和RTOS:

姆妈要一边给小孩喂饭,一边加班跟共事一样,何如办?

关于单线条的东谈主,不可分神,不可同期作念事,她只可这么作念:

给小孩喂一口饭

瞄一眼电脑,有信息就去回报

再总结给小孩喂一口饭

如若小孩吃这口饭太慢,他回报共事的信息也就慢了,被共事催,你半天齐不回报我?

如若回报共事的信息要写一大堆,小孩就饿的大哭起来

关于眼明手快的东谈主,她不错一心多用,她这么作念:

左手拿勺子,给小孩喂饭

右手敲键盘,规复共事

两不邋遢,小孩“合计”姆妈在专心喂饭,共事合计“她在专心聊天”

然而脑子只消一个啊,天然说一心多用,然而谁随机同期斟酌两件事?

仅仅她响应快,上一秒钟在斟酌夹哪个菜给小孩,下一秒钟斟酌给共事回报什么信息

这种作念法,在软件开荒上,即是使用操作系统, 在单片机里叫作念使用RTOS

RTOS的道理是:Real Time Operating System,即及时操作系统,但使用Windows,咱们频频遇到按次卡死、停顿的气象,普通糊口中,这是不错隐忍的,然而在电梯系统中,你按住开门键时如若莫得即刻响应,即使常识慢个一秒钟,也会夹住东谈主,在专用的电子成就中,及时性很迫切

1.2 按次浅知道例:

//经典单片机按次

void main()

{

 

    while(1)

    {

 

        喂一口饭();

        回一条音讯();

 

    }

 

 

}

 

//RTOS按次

int a;

喂饭() 栈A

{

    int b=2;

    int c;

    c = a+b;==>1.b+2,2,c=new val

    --------------------------->切换

    while(1)

    {

        喂一口饭();

    

 

    }

 

 

}

 

复书息() 栈B

{

    int b;

    while(1)

    {

        回一个音讯();

 

 

 

    }

 

}

 

void main()

{

    create_task(喂饭);

    create_task(复书息);

    start_scheduler();

    while(1)

    {

        sleep();

 

    }

 

}

 1.2 漠视问题

什么叫线程?回答这个问题之前,先思思何如切换线程?何如保存线程?

线程是函数吗?函数需要保存吗?函数在Flash上,不会被龙套,无需保存

函数里用到的全局变量,全局变量需要保存吗?全局变量在内存上,还能保存到那里去?全局变量无需保存

函数里用到了局部变量,局部变量需要保存吗?局部变量在栈里面,亦然在内存里,只消幸免栈被龙套即可,局部变量无需保存

运算的中间值需要保存吗?中间值保存在那里?在CPU寄存器里,另一个线程也要用到CPU寄存器,是以CPU寄存器需要保存

保存在那里?保存在线程的栈里面

霸凌 拳交

何如交融CPU寄存器,何如交融栈?

2.1 ARM架构及汇编

ARM芯片属于精简辅导集蓄意机(RISC:Reduced Instruction Set Computor),它所用的辅导相比浅薄,有如下性格:

1、对内存只消读、写辅导

2、 关于数据的运算是在CPU里面收场

3、 使用RISC辅导的CPU复杂度小小数,易于联想

关于比如a= a+b这么的算式,需要经过底下四个武艺才不错收场:

细看这几个武艺,有些疑问:

1、读a,那么a的值读出来后保存在CPU那里?

2、读b,那么b的值齐出来之后保存在那里?

3、a+b的遵守又保存在那里?

这些问题齐波及到ARM贬责器的里面,浅薄抽象如下,咱们先忽略多样CPU风光,用户风光等。 

CPU运行时,先去取辅导,再扩充辅导

1)把内存a的值读入CPU寄存器R0

2)把内存b的值读入CPU寄存器R1

3)把R0和R1累计存入R0

4)把R0的值写入内存a

CPU里面寄存器分类

CPU内至少应该稀有据缓冲寄存器,栈指针类寄存器、按次指针类寄存器、按次情景类寄存器过甚他功能寄存器

1、数据缓冲寄存器

    CPU内数目最多的寄存器是数据缓冲寄存器,名字用寄存器英文Register的首字母加数字构成,如R0、R1、R2等,不同的CPU其种类不同。

2、栈指针类寄存器

    在蓄意机编程中有全局变量和局部变量的办法。从存储器的角度来看,对一个具有独建功能的齐备按次来说,全局变量具有固定的地址,每次读写齐是阿谁地址。而在一个子按次中开辟的局部变量则不同,用RAM中的哪个地址是不笃定的,接收“后进先出”的原则使用一段RAM区域,这段区域被称为栈区。它有一个栈底的地址, 是一运行就笃定的,当稀有据进栈或者出栈时,地址就会连气儿变动,否则就放到归并个存储地址中了,CPU需要有个方位保存这个连接变化的地址,这即是栈指针(SP)寄存器。

3、按次指针类寄存器

    蓄意机的按次存储在存储器中,CPU中有个寄存器指引将要扩充的辅导在存储器中的位置,这即是按次指针类寄存器。在好多CPU中,它的名字叫作念按次计数器寄存器(PC),它端庄告诉CPU将要扩充的辅导在存储器的什么方位。

4、按次运业绩态类寄存器

    CPU在进行蓄意流程中,会出现诸如进位、借位遵守为0、溢出等情况,CPU内需要有个方位把他们保存下来,以便下一条辅导蚁合这些情况进行贬责,这类寄存器即是按次情景类寄存器,不同的CPU其称呼不同,有的叫作念瑰丽寄存器,有的叫作念按次情景字寄存器。

5、其他功能寄存器

    不同的CPU中,除了具稀有据缓冲,栈指针、按次指针、按次运业绩态寄存器以外、还有暗示浮点数运算、中断屏蔽等寄存器。

ARM Cortex-M中的寄存器

ARM Cortex-M贬责器的寄存器主要有R0-R15及3个很是功能寄存器,如上图所示,其中R0-R12为通用寄存器,R13为堆栈指针寄存器(SP)、R14是勾通寄存器,R15为按次计数器(PC),很是功能寄存器有预界说的功能,况且必须通过专用的辅导来拜访。

几条汇编辅导

需要掌持的汇编辅导并未几,只消几条。

读内存辅导:LDR,即Load之意

写内存辅导:STR,即Store之意

加减辅导:ADD与SUB

跳转:BL,即Branch And Link 

出栈辅导:POP

入栈辅导:PUSH

汇编并不复杂:

加载/存储辅导

加载辅导LDR:LDR r0,[addrA]道理即是将地址addrA的内容加载到R0中

存储辅导STR:  STR r0,[addrA]道理即是将r0的值存储到地址addrA上

加法运算辅导ADD:ADD r0,r1,r2道理为:r0=r1+r2

减法运算辅导SUB:SUB r0,r1,r2道理为:r0=r1-r2

寄存器入栈/出栈辅导

函数运行的实质

如下是一个浅薄的按次,主函数里调用函数add_val():

void add_val(int *pa,int *pb)

{

    volatile int tmp;

    

    tmp = *pa;

    tmp = tmp + *pb;

    *pa = tmp;

 

}

 

int main(void)

{

 

    int a =1 ;    

    int b = 2;

    add_val(&a,&b);

 

    return 0;

}

 其中调用add_val函数的汇编代码如下:

————————————————

版权声明:本文为CSDN博主「~Old」的原创著作,遵命CC 4.0 BY-SA版权公约,转载请附上原文出处瓦解及本声明。

原文瓦解:https://blog.csdn.net/qq_43460068/article/details/126896489深爱激情网




热点资讯

相关资讯



Powered by 女优明星 @2013-2022 RSS地图 HTML地图

Copyright Powered by站群系统 © 2013-2024

创建或修改目录:/www/wwwroot/104.219.215.234/data 失败!
JzEngine Create File False