一、临界段保护
临界段指的是一段执行中不能被中断的代码段,这个临界段最常出现的就是对全局变量的操作,这里简单记录一下原因,比如两个线程均会操作同一个全局变量,假如当一个线程操作该全局变量的过程中发生系统调度,另一个线程得以执行,这个线程执行的过程中也要操作这个全局变量,这样也就是说该全局变量的值在第二个进程执行后发生了变化,与第一个线程执行时预计得到的值已经不一样了,当第一个线程再次被调度后,继续对全局变量操作就很可能会出问题了,所以说对这个全局变量的操作代码段就是临界段代码段,那么临界段保护,顾名思义就是保护临界段代码段执行过程中不被打断,除了举例说明中的发生系统调度,另外一个会影响到临界段的就是中断,因为中断也是随时发生的,但系统调度的产生本质上也是发生了中断才会发生,所以问题就统一了,要实现临界段保护只要在执行临界段代码之前将中断关闭,临界段代码执行完毕后打开中断就可以了,我们用到的MCU都会有关闭中断的指令,但是是不是简单的每次执行临界段代码关闭中断执行完毕后开启中断呢?并不是这样,实际情况要稍复杂一些,那就是要考虑
临界段的嵌套。怎样解决这个问题呢,办法就是进入临界段代码之前,保存当前中断状态(开启or关闭)然后关闭中断,退出临界段代码后,不是直接开启中断,而是将中断寄存器的状态恢复成进入临界段之前的状态,这样,如果进入临界段之前中断就是关闭的,那退出临界段之后恢复中断状态,就仍然是关闭状态,这样就解决了临界段嵌套的问题(当然临界段有几层嵌套就需要几个变量保存中断状态)。中断的开启和关闭代码是汇编语言实现的,代码就没必要贴了。
二、对象
书中这样说明:在RT-Thread中,所有的数据结构都称之为对象。这个其实自己有点疑惑就是这个“数据结构”,而且目前自己也不太理解RT-Therad中为什么用“对象”这个词,如果这个“对象”是来源于向对象程序语言中的“对象”的话,按照我自己的理解,在面向对象程序语言中“对象是类的实例化”,而“类”可以理解为一种数据类型(因为有的书中就是从C语言的结构体过渡到类的,类不过是引入了函数的结构体,所以书中的解释“所有的数据结构称之为对象”,那这个数据结构是指的构造类型,还是构造类型定义出的实际变量呢?。。。不过书中又有对象数据类型,这样说的话,对象还是可以不严谨的理解为构造类型了,那我理解这里的对象不过是引入的一个名词罢了)
三、容器
书中说容器本质上就是一个数组,所以这就没什么难理解的了,而且从字面意义也能差不多猜出来,但是书中有这样一段文字,在rtt中,每当用户创建一个对象,如线程(这个地方也是上面我疑惑的“数据结构”,按照理解线程是一个函数,也就是一段程序代码,这个也可以称为数据结构。。。),就会将这个对象放到一个叫做容器的地方,
,那这样的话“对象”就是一个实实在在占用内存空间的东西了,好吧,知识有限,脑袋有点折腾不过来了,先留个标记,知道有这么回事,像书中所说:目前,我们只需要知道所有创建的对象都会被放到容器中即可。后面再慢慢理解吧
此内容由EEWORLD论坛网友dong2213dong原创,如需转载或用于商业用途需征得作者同意并注明出处
本帖最后由 dong2213dong 于 2019-5-8 17:31 编辑