Contiki 操作系统的一些模块中,中断处理程序需要提供由Contiki 系统的另一模块独立读取的字节,因为中断处理程序可以抢占读取数据代码的任何部分,所以中断处理程序和读取数据的函数必须同步执行,以免出现竞争资源的情况。环形缓存是一种读和写操作相互独立执行而不会出现资源竞争情况的同步机制。
图8-2 环形缓存
环形缓存也被称为循环缓存,如图8-2 所示,它是一种概念上把数据保存在环中的数据结构,存储在缓存中的数据读取顺序和插入顺序一致,也称该数据结构为先进先出(FIFO)缓存。图8-2 是有四个链表项a、b、c 和d 的环形缓存,链表项a是要从缓存中删除的下一个链表项,链表项d是最新插入的链表项,“first”和“last”指针分别指向这两个链表项。
Contiki 操作系统环形缓存库函数实现了把字节存储在数组中的环形缓存处理机制,数组大小是2 的幂,最大值是256 个字节。要求数组大小是2 的幂的原因是,通过使用按位逻辑运算实现在这个环形结构中循环使用“first”指针和“last”指针。同样地,数组大小最大值取256 字节的原因是保持指针是一个8比特位的字节,8比特位字节是可以自动更新的唯一的数据结构,这对确保对环形缓存的写和读操作同步是至关重要的,即使读与写操作可以相互抢占执行。(www.xing528.com)
定义环形缓存库的程序文件ringbuf.c 和ringbuf.h 保存在core/lib 文件夹下,Contiki 系统提供的环形缓存操作API 函数如下,这些函数的实现在程序文件ringbuf.c中。
以上API 函数在ringbuf 数据结构上操作,调用函数ringbuf_init()初始化ringbuf 数据结构。使用环形缓存的模块或应用程序必须为缓存提供内存,作为参数传递给函数ringbuf_init()实现。环形缓存模块仅为管理环形缓存提供逻辑结构,使用缓存的模块必须提供缓存所需的内存。API函数提供在环中插入元素、删除元素和检索元素的函数,如函数ringbuf_put()和函数ringbuf_get(),这两个函数插入和检索字节。如果环形缓存中没有可用的字节,ringbuf_get()函数返回一个表示错误的值-1。ringbuf_size()函数返回缓存中可用的字节数,函数ringbuf_elements()返回当前环中元素的个数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。