大家都知道单片机有中断,
中断产生后在tinyos中就是async 事件,如果你在上层看到async其实这些还是中断服务程序,那么什么可以打断现在中断服务程序呢,yes,还是中断。
中断打断了中断,我们是不是有一些要保护呢,是啊我们要保护一些东西,所以我们用atomic把一些代码封装了,即延迟了中断,让中断打断不了我们当前的操作。这个有好有坏,当我们是时间敏感应用,比如我们是触发采集的,我们的采集就被延迟了,yes,atomic要小啊。不过我目前还是对之理解不够深入。。。。我理解到的程度是,atomic语句中的变量是这个组件内部的变量,我们要时刻注意我们目前组件的变量的含义,如果是在async中用到了,在另一个async中也用到了,显然后来的就会将现在的修改了,sorry。。。等等
我们先来说明tinyos中的sync事件,如果你看底层你会发现越到底层async越多,越到上层sync越多,其实这些sync啊,async啊都是函数调用,sync是task中的函数调用,async是中断服务程序中的函数调用。
一般很多操作都不是很紧急的所以tinyos内核中有了task,我们知道单片机要跑起来必须要依赖于中断,比如CC2420收到数据包的时候是通过FIFOP引脚输出高电平,产生中断告知单片机的,又比如定时器的比较通道的中断标志位被置一了,产生中断告知单片机时间到啦。如果我们是紧急的处理我们就要在中断服务程序中处理,即async中处理;如果我们是不紧急的处理我们就会投递一个任务,延迟处理,所以我们做采集啊,时间同步啊,要考虑用async的定时器中断,而不是用sync形式的定时器中断啊,因为sync的定时器是在task中调用函数告知上层的,yes,被延迟了,而且是无法估计的延迟。
好了说了这么多,其实我最想说的还是atomic。。。。。。。。。。
如果我们在组件的sync函数中用到了一个全局变量,中断到来时显然会打断sync函数的执行,async它照样可以打断,知道了吧,我们在sync中要用一个局部变量来得到这个全局变量的值,我们用atomic封装我们读的过程,这样我们的操作就是正确的。。。。。那么我们用局部变量读这个值会不会该局部变量在中断到来的时候被改写呢,答案是肯定的,不会,不会,因为只有task中才可以有这个局部变量,而中断到来时候执行只能到投递task,并不会执行刚投递的task,怎么改呢,看来中断也不是神哦。。。。
好了我们现在又回到了中断到来时刻,async打断async怎么办呢,async到来显然会改变一些全局变量,这个貌似是一个很严重的问题,
例如,我的task还没有运行到我上一次调用把全局变量赋值给局部变量的时候,中断到来全局变量已经被改写了,这个咋办啊。。。哎。。
中断产生后在tinyos中就是async 事件,如果你在上层看到async其实这些还是中断服务程序,那么什么可以打断现在中断服务程序呢,yes,还是中断。
中断打断了中断,我们是不是有一些要保护呢,是啊我们要保护一些东西,所以我们用atomic把一些代码封装了,即延迟了中断,让中断打断不了我们当前的操作。这个有好有坏,当我们是时间敏感应用,比如我们是触发采集的,我们的采集就被延迟了,yes,atomic要小啊。不过我目前还是对之理解不够深入。。。。我理解到的程度是,atomic语句中的变量是这个组件内部的变量,我们要时刻注意我们目前组件的变量的含义,如果是在async中用到了,在另一个async中也用到了,显然后来的就会将现在的修改了,sorry。。。等等
我们先来说明tinyos中的sync事件,如果你看底层你会发现越到底层async越多,越到上层sync越多,其实这些sync啊,async啊都是函数调用,sync是task中的函数调用,async是中断服务程序中的函数调用。
一般很多操作都不是很紧急的所以tinyos内核中有了task,我们知道单片机要跑起来必须要依赖于中断,比如CC2420收到数据包的时候是通过FIFOP引脚输出高电平,产生中断告知单片机的,又比如定时器的比较通道的中断标志位被置一了,产生中断告知单片机时间到啦。如果我们是紧急的处理我们就要在中断服务程序中处理,即async中处理;如果我们是不紧急的处理我们就会投递一个任务,延迟处理,所以我们做采集啊,时间同步啊,要考虑用async的定时器中断,而不是用sync形式的定时器中断啊,因为sync的定时器是在task中调用函数告知上层的,yes,被延迟了,而且是无法估计的延迟。
好了说了这么多,其实我最想说的还是atomic。。。。。。。。。。
如果我们在组件的sync函数中用到了一个全局变量,中断到来时显然会打断sync函数的执行,async它照样可以打断,知道了吧,我们在sync中要用一个局部变量来得到这个全局变量的值,我们用atomic封装我们读的过程,这样我们的操作就是正确的。。。。。那么我们用局部变量读这个值会不会该局部变量在中断到来的时候被改写呢,答案是肯定的,不会,不会,因为只有task中才可以有这个局部变量,而中断到来时候执行只能到投递task,并不会执行刚投递的task,怎么改呢,看来中断也不是神哦。。。。
好了我们现在又回到了中断到来时刻,async打断async怎么办呢,async到来显然会改变一些全局变量,这个貌似是一个很严重的问题,
例如,我的task还没有运行到我上一次调用把全局变量赋值给局部变量的时候,中断到来全局变量已经被改写了,这个咋办啊。。。哎。。