Передача указателя между функциями - проблемы, вызывающие memcpy - PullRequest
0 голосов
/ 09 июля 2020

У меня есть структура с именем light, и я создаю событие кнопки, которое передает адрес структуры 'light' через параметр void *context;

int button_create(const uint8_t gpio_num, button_config_t config, button_callback_fn callback, void* context)

Когда выполняется обратный вызов, Я могу использовать эту структуру без проблем;

void button_callback(button_event_t event, void* context) {
    light_service_t *light = (light_service_t*) context;
    ESP_LOGW("button_callback", "light pointer %p idx %d", light, light->idx);
}

Но мне нужно использовать функцию esp_event_post, предоставляемую Espressif. Эта функция создает КОПИЮ данных;

        memcpy(event_data_copy, event_data, event_data_size);
#if CONFIG_ESP_EVENT_POST_FROM_ISR
        post.data.ptr = event_data_copy;

Итак, когда я вызываю эту функцию;

void button_callback(button_event_t event, void* context) {
    // esp_event_post sends a pointer to a COPY of the data.        
    esp_event_post(BUTTON_EVENT, event, context, sizeof(void*), 10);
}

В обработчике событий эта строка фактически не возвращает мне оригинал адрес указателя;

    } else if (event_base == BUTTON_EVENT) {
        light_service_t *light = (light_service_t*) event_data;

Итак, как я могу передать адрес указателя как ... 'данные' (??), а затем успешно получить адрес в последнем обратном вызове события?

1 Ответ

0 голосов
/ 09 июля 2020

Хорошо, это работает. Буду признателен за любые мысли по этому поводу.

Сначала я сохраняю адрес как uintptr_t, а затем отправляю адрес этого;

void button_callback(button_event_t event, void* context) {
    // esp_event_post sends a pointer to a COPY of the data.
    uintptr_t shmem = (uintptr_t)context;   
    esp_event_post(BUTTON_EVENT, event, &shmem, sizeof(uintptr_t), 10);
}

Затем в событии приема я конвертирую это обратно к указателю;

    } else if (event_base == BUTTON_EVENT) {
        uintptr_t shmem = *((uintptr_t*)event_data);
        light_service_t *light = (light_service_t *)shmem;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...