在多个处理核的环境下编程,通常存在多个核会去访问和修改同一个变量资源。假如多个核同一时间去访问该资源,会存在读改写不相一致的情况。比如精确到一条汇编指令:一个核执行读取该变量的读指令另一个核紧接着也进行读取指令(最后才各自进行修改和写指令操作,即使用volatile修饰也不可避免这种情况的发生),这时两个核都读取得到相同的值,通常这样的变量都是一些互斥资源的标志变量(flag),各个核通过轮询这个变量来判断资源是不是可以利用。假如发生上面的情况,这时两个核都会认为资源对自己都是可以利用的,所以两个核都会去访问该资源,这样就会发生错误并导致运行结果不一致,严重的会导致系统的崩溃。
TI的多核DSP似乎没有像“读-改-写”这样原子性操作的指令或宏(找了好久,也许是我没找到),这样,在多核编程下会存在潜在的极大危险(即使上面那种情况的发生概率很低)。在Intel的多核处理器中即使也没有读改写的指令,但IntelCUP却可以通过锁总线来保证“读改写”的原子性,而TI DSP似乎也没有总线锁这样的功能,那么为了避免上面情况的发生我们可以通过什么方式来达到呢?
这时我们可以通过硬件信号量来避免上面的情况发生,TI多核DSP C66x系列提供了硬件信号量,可以让程序员更安全的利用系统资源。硬件信号量在读取时就会进行锁定,返回值是0或1(0表示不可用,1表示可用),并且硬件信号量的应用方式有几种,一种是直接方式、一种是间接方式、另一种是组合方式,组合方式是直接方式和间接方式的组合。直接方式每次都得轮询去读信号量来判断锁是不是已经被释放,而间接方式有FIFO对信号量的访问进行缓存,所以不用每次都进行轮询,当获得锁后会产生中断,也可以通过轮询方式轮询中断标志位来查看是否已获得锁,详情可以看TI的文档。
虽然通过硬件锁的方式能安全的获取关键资源的权限,但是对于一般的标志变量感觉开销有点大,对于一些频繁访问的变量,不知道硬件信号量的效率会怎样,最好是TI的硬件指令支持对数据的读写改原子操作,那样编程起来也比较方便。
本人是DSP的初学者,对于TIDSP有很多东西都没接触过,所有知识很局限,希望有清楚这方面知识的学者能给与指教,谢谢!