韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】

文章目录

  • 韦东山C语言加强课,截图+代码+学习笔记【2000字】【原创】
  • 韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】


韦东山C语言加强课,截图+代码+学习笔记【2000字】【原创】

韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】

韦东山C语言加强课,截图+代码+学习笔记【2000字】【原创】
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】

ARM架构:cpu,RAM,Flash,UART(外设等等)。cpu从RAM=内存中读取数据(当然也可以写入数据),Flash中是操作指令=代码,cpu从flash中读取指令=代码,这里特指的单片机,因为电脑的RAM很大,因此数据与指令都在RAM中,当然技术在进步,这些都不是一成不变,理解即可,指令就是汇编语言=寄存器操作

任务=函数+保存现场(栈)。发生中断时,就会保存打断时瞬间的寄存器时,使得中断完成后,从打断前的瞬间开始执行数据。A函数中嵌套B函数时,发生B函数时,也可以保存A函数中的寄存器。
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第1张图片
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第2张图片
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第3张图片
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第4张图片
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第5张图片
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第6张图片
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第7张图片
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第8张图片
load=LDR=读四个字节,store=STR=写,ADD=加法,Push=写入数据(写入数据的地址由sp指定,写给一个寄存器,并且sp的地址减),sp=栈,LR=返回地址,PC=当前指令地址,pop=读出数据(读给一个寄存器,并且sp的地址也变换一下=地址加)
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第9张图片
程序被打断瞬间,要瞬间保存一些寄存器值,所以我们干脆一次性保存所有寄存器的值,当打断结束恢复时,取出之前保存处的数据继续运行
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第10张图片
A函数中嵌套B函数时,发生B函数时,也可以保存A函数中的寄存器。函数嵌套中,只涉及到R123三个寄存器的使用,但是B函数使用的数据时A函数传入的实参,因此传入B函数的某些寄存器值不需要再保存,因为A函数会传入。

void* 任意任何类型,void* xx代表传入任何参数,创建任务=栈+任务结构体,一个任务并不复杂,它也就是一堆函数,涉及到很多数据保存在栈里面。
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第11张图片
每个任务都有自己的栈,volatile代表不被优化
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第12张图片
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第13张图片
这个创建的任务就是这个add_val函数,反编译之后,我们发现这个任务没有保存lr,而且0x194,刚好就是100个arry整型数组,然后内存长度就是0x190,于是+4就是0x194,lr就是返回地址
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第14张图片
由图可以看出,任务add_val函数中加了一个tem_fun函数,于是此时再反编译可以看出,多了lr寄存器,因为这属于函数嵌套了,当tem函数运行完成之后必须从初始位置开始运行,也就是从返回地址处开始运行,栈的大小取决于局部变量的大小(比如这里的array数组),取决于调用深度(也就是函数嵌套)
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第15张图片
freertos中使用ucheap巨大的数组来当做栈使用
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第16张图片
创建任务时,vtask1是任务的函数地址,第一个NULL是传入的参数,这个参数是任务里面的R0寄存器参数,所以创建任务时你没有看到任务中的函数,也没有看到函数结构体,其实已经这样存储了,高地址是栈底,栈顶向低地址生长。
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第17张图片
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第18张图片
suspend英文意思为挂起,挂起就是不执行,阻塞就是等待执行,它等待一段时间会执行。创建任务时,一共有5个优先级=5个链表,任务1与2优先级是0,任务3优先级是2,很显然,从最高优先级开始往下找,找到任务3开始执行,然后任务1与2轮流执行,那么谁来进行调度呢?谁来进行判断谁的优先级高低以及怎么样让每个任务按优先级进行有序执行呢?
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第19张图片
TICK中断是1ms一次
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第20张图片
下面的是就绪链表,上面的是任务链表
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第21张图片
TICK中断里面,2ms时task3开始休眠,7s时取出,把task从delay链表中取出,放入ready链表中,再进行任务123的调度
在这里插入图片描述

空闲任务,没听懂这里
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第22张图片
启动调度器会创建空闲任务,它的优先级是0,所有任务运行之后才会执行空闲任务
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第23张图片
这里是空闲任务,箭头中的4是四个优先级,1是一个空闲任务,当多出来三个任务123,那么4>1,此时执行退让函数==执行别的任务
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第24张图片
这个现象很有意思了,有学员提出,不抢占,不礼让,轮流执行所有任务优先级都是0,分析代码可知,程序从空闲任务执行到task1之后死循环,无法运行到task2,最低优先级的中断也比最高优先级的任务优先级高
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第25张图片
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第26张图片
TICK中断1ms一次,TICK时钟中断进行任务调度,在链表中,任务执行完会放在最后面
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第27张图片
假如A与B函数共同对全局变量a++,最终结果就是2,这很容易理解。
而在rtos中,创建A函数与B函数任务,两个函数同时读取数据,此时A函数取出a值还没有+1,进行tick中断切换B函数,此时保存现场a的值,切换B函数,B函数+1得到a的值为1,然后再切回A函数,从上一步保存现场时开始运行,于是得到a为1,此时和裸机程序的结果不同了
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第28张图片
多个任务共用一个变量,就会出现上述问题
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第29张图片韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第30张图片
当A函数写,B函数读,这正常不会出现问题,假如又出现了C函数也会写函数,此时就会出现干扰,因为我们加入队列,在A函数读数据时,进行关中断(关掉了tick中断,相当于裸机程序,此时C函数无法干扰A函数了),然后读读取完成后(不像上面a还没有+1就被B函数打断了),关掉中断并不是指所有中断,但是tick中断是一定要关掉的,此时我们实现了互斥访问,我们自己调用API函数接口就可以实现上述队列功能
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第31张图片
在裸机程序中,假如A函数有个flag变量为1,那么B函数判断这个flag变量为1之后,实现某个功能,假如A函数执行一百万次才会让flag为1,那么我们B函数难道还要判断一百万次吗?这做了很多无用功,当然裸机程序你只能这么来实现,别无他法。能不能A函数运行一百万次后直接去通知B函数我flag=1了呢?而不需要B函数自己在那判断一百万次?
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第32张图片
在rtos中,以队列来代替flag的功能
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第33张图片
这种方法太妙了,A函数没有完成,直接休眠B函数,只有A函数完成了,队列中写入数据了,于是唤醒B函数
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第34张图片
上述所说也就是链表操作
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第35张图片
环形缓冲区,写数据就是上述,w=(w+1)%LEN这一句是核心,同理读数据也是一样的道理
韦东山FreeRtos的内部机制,截图+学习笔记【2000字】【原创】_第36张图片
关中断实现互斥,环形缓冲区实现保存数据,链表实现休眠和唤醒(真的是太妙了)

你可能感兴趣的:(学校-UCOS/RTOS学习,学校-32单片机,单片机,经验分享,学习)