Поскольку встроенный список, предоставленный Contiki, не соответствует моим потребностям (использует слишком много памяти), я реализовал свою собственную версию списка, которая была оптимизирована под то, как я собираюсь ее использовать.
На любомоднажды будет один из этих списков, который будет обрабатываться (т.е. добавлять / удалять элементы) несколькими процессами / протопотоками.Однако добавления / удаления не происходят в блоке процесса / протопотока, а вместо этого вызываются в функции, которая вызывается через серию вызовов функций, инициированных процессом / протопотоком.
Например,
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
), поскольку он должен появляться в блоке процесса / протопотока.Это потому, что хотя я мог бы создать блокировку внутри фактического блока процесса (см. Ниже), это приведет к блокировке процессов гораздо дольше, чем необходимо
PROCESS_THREAD(temp2, ev, data)
{
PROCESS_BEGIN();
// get lock
func1();
// release lock
PROCESS_END();
}
Это очень проблематично, так как добавление и удаление элементов измой список не атомарный;если при удалении или добавлении элемента в список происходит прерывание, то все будет работать неправильно.Можно ли легко делать то, что я хочу;а именно атомарно добавлять и удалять элементы из списка в вызове функции, а не в блоке процесса / протопотока?