因为Contiki提供的内置列表不符合我的需求(使用太多内存),我已经实现了我自己的列表版本,该版本已针对我打算如何使用它进行了优化。
在任何时候,将通过多个进程/ protothreads对这些列表中的一个进行操作(即添加/删除元素)。但是,在进程/ 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来创建互斥锁(通过使用pt-sem.h
),因为它必须出现在进程/ protothread块中。这是因为虽然我可以在实际的进程块中创建一个锁(见下文),但这会导致阻塞进程的时间超过必要的时间
PROCESS_THREAD(temp2, ev, data)
{
PROCESS_BEGIN();
// get lock
func1();
// release lock
PROCESS_END();
}
这是非常有问题的,因为从我的列表中添加和删除元素不是原子的;如果在向列表中删除或添加元素时发生中断,则事情将无法正常运行。是否有可能轻松做我想要的事情;即在函数调用中以原子方式添加和删除列表中的元素,而不是在进程/ protothread块中?
答案 0 :(得分:0)
你似乎对protothreads的作用感到困惑。 protothread方法是协作调度的一种形式。当被要求按执行流程产生时,protothread只能在特定点处产生。中断永远不能将执行流程切换到另一个protothread。
所以,有两个不同的选择:
1)如果从protothread和中断处理程序上下文访问列表,则需要在禁用中断的情况下对列表进行所有修改。所以你的锁定/解锁代码分别是禁用/启用中断。
2)如果只能从protothreads访问您的列表,则不需要任何锁定。这是推荐的设计。
事实上,使用protothreads的主要优势是99%的情况下不需要锁定。