Задача о читателях и писателях. esp32

мне нужно обычно пару-тройку цифр из прерывания прочитать/записать в фоновой программе. Сам уход в прер будет гораздо дольше этих нескольких команд, когда прерывания будут запрещены.

Ну то есть это эдакий РТОС вручную.

BTW сайт только через ВПН открывается сейчас у меня, в Мск.

1 лайк

судя по лайку, поставленному последнему сообщению, ты все-таки дочитал до конца и понял, что ВСЁ что ты написал я отметил.

А я уже подумал, что мы, хоть и не живем в РФ, но все равно будем играть в любимую русскую игру: “Спор с воображаемым оппонентом”. :wink:
Я написал ТОЛЬКО о том, что объект пишется и читается без разрыва. А уж какой он давности - там же у меня и написано, что для компилятора это “андефайнед бихейвор”.
Для всего остального у программиста есть “межушный ганглий”, который можно использовать не только при еде.

В этом вашем pthread слишком нагорожено. У меня всего один семафор бинарный а у них вона чо:

/** pthread rw_mutex FreeRTOS wrapper */
typedef struct {
    /**
     *
     */
    pthread_cond_t cv;

    pthread_mutex_t resource_mutex;

    /**
     * Number of current readers holding this lock, negative number means waiting readers
     */
    int8_t active_readers;

    uint8_t active_writers;
    uint8_t waiting_writers;

} esp_pthread_rwlock_t;


Да и сам reader lock:

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock)
{
    esp_pthread_rwlock_t *esp_rwlock;
    int res;

    res = checkrw_lock(rwlock);
    if (res != 0) {
        return res;
    }

    esp_rwlock = (esp_pthread_rwlock_t *)*rwlock;
    res = pthread_mutex_lock(&esp_rwlock->resource_mutex);
    if (res != 0) {
        return res;
    }

    if (esp_rwlock->active_writers == 0) {
        esp_rwlock->active_readers++;
    } else {
        while (true) {
            pthread_cond_wait(&esp_rwlock->cv, &esp_rwlock->resource_mutex);
            if (esp_rwlock->active_writers == 0 && esp_rwlock->waiting_writers == 0) {
                esp_rwlock->active_readers++;
                break;
            }
        }
    }

    pthread_mutex_unlock(&esp_rwlock->resource_mutex);
}

Тяжеловесненько. У нас - лучше :slight_smile: