RP2040 - как синхронизировать взаимодействие процессов, выполняющихся на обоих ядрах?

Dreman

★✩✩✩✩✩✩
25 Апр 2024
15
16
tesanoff.klah.ru
Всем привет.

Кто-то пишет прошивки для rp2040 в Arduino IDE?

Какой там сейчас самый правильный способ синхронизации для доступа из разных ядер (тредов) к общим ресурсам? mutex?
Там мутексы нормально реализованы, или какой-то свой заменитель есть?
 

Dreman

★✩✩✩✩✩✩
25 Апр 2024
15
16
tesanoff.klah.ru
Судя по всему, для моих целей отлично подойдёт класс из "CoreMutex.h":

C++:
class CoreMutex {
public:
    CoreMutex(mutex_t *mutex, uint8_t option = DebugEnable);
    ~CoreMutex();

    operator bool() {
        return _acquired;
    }

private:
    mutex_t *_mutex;
    bool _acquired;
    uint8_t _option;
    BaseType_t _pxHigherPriorityTaskWoken;
};
@azaitov Ещё раз спасибо за подсказку.
 

Dreman

★✩✩✩✩✩✩
25 Апр 2024
15
16
tesanoff.klah.ru
Всем привет.
В общем, опыт программирования под RP2040 показал, что самый правильный способ - это писать под FreeRTOS и для решения задач меж-тредового взаимодействия пользоваться средствами FreeRTOS.
Благо она является частью стандартной поставки "ядра" RP2040.

Очень рекомендую, если кто-то ещё не.
 

bort707

★★★★★★✩
21 Сен 2020
3,419
984
Судя по отзыву, как раз именно "синхронизации" в вашей задаче не требуется, только разделение совместного доступа к общим ресусрсам
 

SlavaZagaynov

★✩✩✩✩✩✩
27 Ноя 2019
246
46
www.youtube.com
@Dreman, я на esp32 примитивно делаю число флаг и проверку типа так...
int add_In_Box_busy = 0;
void x(){
while (add_In_Box_busy == 1){ delay(1); }
add_In_Box_busy = 1;
//балаблабла
add_In_Box_busy = 0;
}
вроде работает
 

Dreman

★✩✩✩✩✩✩
25 Апр 2024
15
16
tesanoff.klah.ru
C++:
extern SemaphoreHandle_t   I2C_mutex;

struct I2cMutex {
    I2cMutex(void){
        xSemaphoreTake(I2C_mutex, portMAX_DELAY);
    }

    ~I2cMutex(void){
        xSemaphoreGive(I2C_mutex);
    }
};

// и там, где нужно обмениваться данными по i2c:
{
    I2cMutex    take;
    
    // и делаем свои дела по I2C
}