Взаимное исключение внутри функции Contiki - PullRequest
0 голосов
/ 28 мая 2018

Поскольку встроенный список, предоставленный 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();
}

Это очень проблематично, так как добавление и удаление элементов измой список не атомарный;если при удалении или добавлении элемента в список происходит прерывание, то все будет работать неправильно.Можно ли легко делать то, что я хочу;а именно атомарно добавлять и удалять элементы из списка в вызове функции, а не в блоке процесса / протопотока?

1 Ответ

0 голосов
/ 29 мая 2018

Вы, похоже, не понимаете, что делают протопотоки.Прототипный подход - это форма кооперативного планирования.Протопоток может выдавать только в определенных точках, когда его запрашивает поток выполнения.Прерывание никогда не может переключить поток выполнения на другую протопоток.

Итак, есть две различные опции:

1) Если ваш список доступен как из протопотока, так и из контекстов обработчика прерываний, вам нужносделать все изменения в списке с отключенными прерываниями.Таким образом, ваш код блокировки / разблокировки, соответственно, запрещает / разрешает прерывания.

2) Если ваш список доступен только из протопотоков, вам не нужна блокировка.Это рекомендуемый дизайн.

Действительно, основное преимущество при использовании протопотоков заключается в том, что в 99% случаев блокировки не нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...