因为 Contiki 提供的内置列表不符合我的需求(使用太多内存),所以我已经实现了我自己的列表版本,该版本已经针对我打算如何使用它进行了优化。
在任何时候,都会有一个列表被多个进程/原型线程操作(即添加/删除元素)。但是,添加/删除不会发生在进程/protothread 块中,而是在通过进程/protothread 发起的一系列函数调用调用的函数中调用。
例如,
void funct2()
{
// add or remove element from shared list
}
void func1()
{
// some stuff
func2();
// more stuff
}
PROCESS_THREAD(temp1, ev, data)
{
PROCESS_BEGIN();
func1();
PROCESS_END();
}
PROCESS_THREAD(temp2, ev, data)
{
PROCESS_BEGIN();
func1();
PROCESS_END();
}
结果,我不能使用 Contiki 的内置机制来创建互斥锁(通过 using pt-sem.h
),因为它必须出现在进程/原型线程块中。这是因为虽然我可以在实际的进程块中创建一个锁(见下文),但这将导致阻塞进程比必要的时间长得多
PROCESS_THREAD(temp2, ev, data)
{
PROCESS_BEGIN();
// get lock
func1();
// release lock
PROCESS_END();
}
这是非常有问题的,因为从我的列表中添加和删除元素不是原子的;如果在向列表中删除或添加元素时发生中断,事情将无法正常运行。是否可以轻松地做我想做的事;即从函数调用中的列表中原子地添加和删除元素,而不是在进程/原型线程块中?