Есть ли способ обеспечить атомарность с помощью операции в C? - PullRequest
1 голос
/ 11 декабря 2010

Я хочу, чтобы это утверждение (в теле оператора if) было атомарным:

if(I2C1STATbits.P || cmd_buffer_ptr >= CMD_BUFFER_SIZE - 1)
    cmd_buff_full = 1; // should be atomic

Мой процессор (dsPIC33F) поддерживает установку и очистку атомарного бита. Он также поддерживает атомарную запись для 16-битных регистров и областей памяти; это один цикл. Как я могу быть уверен, что операция будет реализована атомарно - есть ли способ заставить компилятор сделать это? В моем случае я вполне уверен, что он будет компилироваться, чтобы быть атомарным, но я не хочу, чтобы это изменилось в будущем, если я, например, изменю какой-то другой код и он реорганизует вещи, или если я обновлю компилятор. Например, есть ли ключевое слово atomic?

Я работаю с GCC v3.23 - точнее, MPLAB C30, модифицированной версией GCC с закрытым исходным кодом. Я работаю над микроконтроллером, который имеет только прерывания; нет понятия о нитях. Единственная возможная проблема с атомарностью состоит в том, что прерывание может быть инициировано в середине записи в течение двух циклов, если это вообще возможно.

Ответы [ 2 ]

3 голосов
/ 11 декабря 2010

В зависимости от того, какие другие конкурирующие операции вы хотите, чтобы назначение было атомарным, вы можете использовать sig_atomic_t .Строго говоря, это защищает его только от наличия сигналов.На практике это также обеспечивает атомарность в отношении.multi-threeading.

Редактировать : если объект должен гарантировать, что операция сохранения не закодирована в двух инструкциях на ассемблере, необходимо будет использовать встроенную сборку - C не дает никаких гарантийв этом отношении.Если цель состоит в том, чтобы предотвратить вмешательство прерывания в операцию сохранения, альтернативой является отключение прерываний перед сохранением и их последующее включение.

0 голосов
/ 11 декабря 2010

Не в C, но, возможно, в библиотеках, которые поставляются с вашим процессором, есть вызов собственной библиотеки.Например, в Windows есть InterlockedIncrement () и InterlockedDecrement () (в длинных долях inc / dec), которые гарантированно будут атомарными без блокировки.

...