Заполните массив с индексом n данными m раз без битовых полей - PullRequest
2 голосов
/ 08 мая 2019

Я пытаюсь отправить максимум 8 байтов данных.Первые 4 байта всегда одинаковы и включают определенные команды и адрес.Последние 4 байта должны быть переменными.

Пока я использую этот подход.К сожалению, в этом случае мне сказали не использовать циклы for.

// Construct data
local_transmit_buffer[0] = EEPROM_CMD_WREN;
local_transmit_buffer[1] = EEPROM_CMD_WRITE;
local_transmit_buffer[2] = High(MSQ_Buffer.address);
local_transmit_buffer[3] = Low(MSQ_Buffer.address);

uint_fast8_t i = 0;
for(i = 0; i < MSQ_Buffer.byte_lenght || i < 4; i++){ // assign data
    local_transmit_buffer[i + 4] = MSQ_Buffer.dataPointer[i];
} 

Вот некоторый тестовый код, который я пытаюсь решить:

#include <stdio.h>

__UINT_FAST8_TYPE__ local_transmit_buffer[8];
__UINT_FAST8_TYPE__ MSQ_Buffer_data[8];


void print_local(){
for (int i = 0; i < 8; i++)
    {
        printf("%d ", local_transmit_buffer[i]);
    }
    printf("\n");
}

void print_msg(){
for (int i = 0; i < 8; i++)
    {
        printf("%d ", MSQ_Buffer_data[i]);
    }
    printf("\n");
}

int main(){
    // assign all local values to 0
    for (int i = 0; i < 8; i++)
    {
        local_transmit_buffer[i] = 0;
    } print_local();

    // assign all msg values to 1
    for (int i = 0; i < 8; i++)
    {
        MSQ_Buffer_data[i] = i + 1;
    } print_msg();

    *(local_transmit_buffer + 3) = (__UINT_FAST32_TYPE__)MSQ_Buffer_data;

    printf("\n");
    print_local();

    return 0;
}

Заполняются первые циклывверх local_transmit_buffer с 0 и MSQ_Buffer с 0,1,2, ... local_transmit_buffer -> 0 0 0 0 0 0 0 0 MSQ_Buffer_data -> 1 2 3 4 5 6 7 8

Теперь я хочуназначьте первые 4 значения MSQ_Buffer_data local_transmit_buffer следующим образом: local_transmit_buffer -> 0 0 0 0 1 2 3 4

Есть ли другой способ решения этой проблемы без использования циклов for или битового поля?

Решено: Я использовал функцию memcpy для решения моей проблемы

// uint_fast8_t i = 0;
// for(i = 0; i < MSQ_Buffer.byte_lenght || i < 4; i++){ // assign data
//     local_transmit_buffer[i + 4] = MSQ_Buffer.dataPointer[i];
// } 

// copy a defined number data from the message to the local buffer to send
memcpy(&local_transmit_buffer[4], &MSQ_Buffer.dataPointer, local_save_data_length);

1 Ответ

4 голосов
/ 08 мая 2019
  • Либо просто разверните цикл вручную, набрав каждую строку, либо просто используйте memcpy. В этом случае нет причин, по которым вам нужны слои абстракции, поэтому я написал бы самый разумный код, который представляет собой просто ручное развертывание (и избавление от icky макросов):

    uint8_t local_transmit_buffer [8];
    ...
    local_transmit_buffer[0] = EEPROM_CMD_WREN;
    local_transmit_buffer[1] = EEPROM_CMD_WRITE;
    local_transmit_buffer[2] = (uint8_t) ((MSQ_Buffer.address >> 8) & 0xFFu);
    local_transmit_buffer[3] = (uint8_t) (MSQ_Buffer.address & 0xFFu);
    local_transmit_buffer[4] = MSQ_Buffer.dataPointer[0];
    local_transmit_buffer[5] = MSQ_Buffer.dataPointer[1];
    local_transmit_buffer[6] = MSQ_Buffer.dataPointer[2];
    local_transmit_buffer[7] = MSQ_Buffer.dataPointer[3];
    
  • Не очевидно, почему вы не можете использовать цикл, хотя это не похоже на фактическое программирование EEPROM (где служебный код может вызвать сбои), а просто на подготовку к нему. Начните сомневаться в таких требованиях.

  • Также обратите внимание, что вы должны не использовать __UINT_FAST8_TYPE__, а uint8_t. Никогда не используйте домашние типы, но всегда stdint.h. Но вы не должны использовать типы fast для буфера ОЗУ, используемого для программирования EEPROM, потому что он никогда не может содержать заполнение. Это ошибка.

...