创建或修改目录:/www/wwwroot/104.219.215.234/data 失败!
发布日期:2024-11-01 11:57 点击次数:57
1 RTOS办法及线程的引入深爱激情网
本文援用地址:https://www.eepw.com.cn/article/202210/439154.htm1.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深爱激情网