Member 13142768 Ответов: 2

Как скопировать содержимое буфера в другой буфер, который определен в структуре


Я создал буфер...

char buffer[8]= " mindflow";

и я попытался скопировать содержимое этого буфера в другой буфер buffer_p. count, который определен во вложенной структуре....

/* Функция обратного вызова DMA для обработки событий Product для передачи P в U. */
пустота
CyFxSlFifoPtoUDmaCallback (
CyU3PDmaChannel *chHandle,
CyU3PDmaCbType_t тип,
CyU3PDmaCBInput_t * вход

)
{
Статус CyU3PReturnStatus_t = CY_U3P_SUCCESS;

if (type == CY_U3P_DMA_CB_PROD_EVENT)
{
/* Это уведомление о событии производства для центрального процессора. Это уведомление является
* получено при получении каждого буфера. Буфер не будет отправлен
* выход, если он явно не зафиксирован. Вызов не будет выполнен, если там
* это сброс шины / отключение usb или если есть какая-либо ошибка приложения. */
char buffer[9]= " поток разума";

status = CyU3PDmaChannelCommitBuffer (chHandle, input - >buffer_p. count, 0);

if (status != CY_U3P_SUCCESS)
{
CyU3PDebugPrint (4, "CyU3PDmaChannelCommitBuffer failed, код ошибки = %d\n", статус);
}

/ * Увеличьте счетчик. */
glDMATxCount++;
}
}

Что я уже пробовал:

/* DMA callback function to handle the produce events for P to U transfers. */
void
CyFxSlFifoPtoUDmaCallback (
        CyU3PDmaChannel   *chHandle,
        CyU3PDmaCbType_t  type,
        CyU3PDmaCBInput_t *input

        )
{
    CyU3PReturnStatus_t status = CY_U3P_SUCCESS;

    if (type == CY_U3P_DMA_CB_PROD_EVENT)
    {
        /* This is a produce event notification to the CPU. This notification is 
         * received upon reception of every buffer. The buffer will not be sent
         * out unless it is explicitly committed. The call shall fail if there
         * is a bus reset / usb disconnect or if there is any application error. */
    	char buffer[9]= "MIND FLOW";

        status = CyU3PDmaChannelCommitBuffer (chHandle, input->buffer_p.count, 0);

        if (status != CY_U3P_SUCCESS)
        {
            CyU3PDebugPrint (4, "CyU3PDmaChannelCommitBuffer failed, Error code = %d\n", status);
        }

        /* Increment the counter. */
        glDMATxCount++;
    }
}

Mohibur Rashid

У вас будут проблемы с этим утверждением
char buffer[9]= " поток разума";
Измените его на
char buffer[10]= " поток разума";

2 Ответов

Рейтинг:
2

CPallini

Вы можете использовать функции memcpy[^] функция для этой цели.

Обратите внимание, что сначала необходимо выделить (возможно, динамическую) память для целевого буфера (а затем освободить динамически выделяемую память).


Рейтинг:
1

Jochen Arndt

Чтобы ответить на это заявление input->buffer_p[.count] должно быть известно и то, сколько байтов должно быть скопировано откуда куда. Обратите внимание, что я поставил .count в скобки, потому что имя указывает, что это значение count/size, а не буфер.

Ладно, я искал его и нашел по адресу: https://github.com/nickdademo/cypress-fx3-sdk-linux/blob/master/firmware/u3p_firmware/inc/cyu3dma.h[^]:

typedef struct CyU3PDmaBuffer_t
{
    uint8_t *buffer;    /**< Pointer to the data buffer. */
    uint16_t count;     /**< Byte count of valid data in buffer. */
    uint16_t size;      /**< Actual size of the buffer in bytes. Should be a multiple of 16. */
    uint16_t status;    /**< Buffer status. This is a four bit data field defined by 
                             CY_U3P_DMA_BUFFER_STATUS_MASK. This holds information like
                             whether the buffer is occupied, whether the buffer holds the
                             end of packet and whether the buffer encountered a DMA error. */
} CyU3PDmaBuffer_t;

/** \brief DMA channel callback input.
    **Description**\n
    This data structure is used to provide event specific information when a DMA callback
    is called. This structure is defined as a union to facilitate future updates to the
    DMA manager.
    **\see
    *\see CyU3PDmaBuffer_t
    *\see CyU3PDmaCallback_t
 */
typedef union CyU3PDmaCBInput_t
{
    CyU3PDmaBuffer_t buffer_p;  /**< Data about the DMA buffer that caused the callback to be called. */
} CyU3PDmaCBInput_t;

В соответствии с этим вы можете скопировать данные в свой буфер с помощью
memcpy(buffer, input->buffer_p.buffer, input->buffer_p.count);
при условии, что ваш буфер достаточно велик (размер >= input->buffer_p.count).

Для копирования данных в input->buffer_p, скопируйте в обратном направлении и установите другие элементы структуры соответственно (count, status) после проверки на достаточный размер.
[Правка: пример]
uint16_t bufSize = sizeof(buffer); // or whatever the actual size is
if (bufSize <= input->buffer_p.size)
{
    input->buffer_p.count = bufSize;
    input->buffer_p.status = theStatus; // 
    memcpy(input->buffer_p.buffer, buffer, bufSize);
}
Но вы должны соответствовать спецификациям SDK
[/РЕДАКТИРОВАТЬ]

Я не уверен, в каком направлении здесь производится обратный вызов. Но вы должны знать, когда делаете такие низкоуровневые вещи.


Member 13142768

здесь я пытаюсь перезвонить с процессора на usb.

Jochen Arndt

Смотрите мой обновленный ответ.
Но вы должны знать, что вы делаете, и соблюдать спецификации SDK.

Member 13142768

Спасибо за ваш ответ. Я видел ваш недавний ответ. Здесь я создал собственный буфер с 8 байтами, я хочу скопировать эти байты в буфер p в u(buffer_P). Но этот буфер объявлен в структурах с другим расположением файла. Я не могу редактировать структуру определенного буфера там, не знаю, как скопировать содержимое буфера.

Здесь я прикрепляю ссылку на файл для вашей справки....

Спасибо...

Jochen Arndt

В чем проблема?
Если у вас есть структура buffer_p, сделайте это, как в моем решении, просто удалив " input - >".

Для копирования данных из одного буфера в другой вам необходимо:
- Указатель на исходный буфер (buffer)
- Указатель на буфер назначения (buffer_p. buffer)
- Количество копируемых байтов (8)
- Убедитесь, что буфер назначения достаточно велик (здесь: buffer_p. size >= 8)
- Тогда позвони memcpy()
- В этом особом случае установите также buffer_p. count, чтобы указать, сколько байтов данных фактически хранится в буфере. Возможно,также потребуется установить статус участника.

Вам не нужно редактировать объявление структуры. Вам просто нужно использовать существующую структуру (input- & gt;buffer_p), как в моем примере кода. Необходимая информация содержится в объявлении структуры, и мое решение основано на этом. Вот почему я разместил его в своем решении, потому что это очень важно в данном случае.

Честно говоря, если вы этого не понимаете, вам не следует использовать такие низкоуровневые материалы SDK (особенно потому, что обычно существует не так много документации, а понимание SDK требует чтения и понимания исходного кода SDK).

Однако может возникнуть еще одна проблема, когда переданный вход - & gt;buffer_p не выделен (buffer member NULL или size member zero). Затем вам, возможно, придется выделить буфер (размер должен быть кратен 16; см. Комментарий к объявлению структуры). Но это должно быть упомянуто где-то в документации SDK или исходном коде.