2015-01-23 8 views
0

У меня возникла такая проблема с использованием uint8_t как массив, который передается моей передающей функции. В момент перехода от основной функции к передаче он меняет размер на 4 элемента. То же самое с массивом, который я создаю внутри своей передаточной функции, хотя я вручную создаю другой массив для отправки моих значений с переданной длиной из основной функции. Я понимаю, это из-за выравнивания данных и заполнения на моем процессоре. Есть ли способ решить эту проблему? Или я печатаю это неправильно.Raspberry PI uint8_t alignment

#include <stdint.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <getopt.h> 
#include <fcntl.h> 
#include <sys/ioctl.h> 
#include <linux/types.h> 
#include <linux/spi/spidev.h> 

#define ARRAY_SIZE(a) (sizeof(a)/sizeof(uint8_t)) 

static const char *device = "/dev/spidev0.0"; 
static uint8_t mode; 
static uint8_t bits = 8; 
static uint32_t speed = 1000000; 
static uint16_t delay; 


static void transfer(int fd, const uint8_t *pass, size_t arsize) 
{ 
int ret,i,k; 
printf(" rozmiar tabpass=%d ", arsize); 
uint8_t *rx = (uint8_t*) malloc(arsize * sizeof(uint8_t)); 
//this is where I create rx with arsize lenght 
uint8_t *tx = (uint8_t*) malloc(arsize * sizeof(uint8_t)); 
for (i = 0; i < arsize; i++){ 
    *(rx + i) = 0; 
    *(tx + i) = *(pass + i); 
} 
for (k = 0; k < (sizeof (pass)/sizeof (pass[0])); k++) { 
    printf(" a%X\n ", pass[k]); 
//here I check length of passed array 
} 
for (k = 0; k < (sizeof (tx)/sizeof (tx[0])); k++) { 
    printf(" b%X\n ", tx[k]); 
// I check length of newly created array, should be equal to array size 
} 
printf(" rozmiar tabtx=%d ", ARRAY_SIZE(tx)); 
struct spi_ioc_transfer tr = { 
    .tx_buf = (unsigned long)tx, 
    .rx_buf = (unsigned long)rx, 
    .len = arsize, 
    .delay_usecs = delay, 
    .speed_hz = speed, 
    .bits_per_word = bits, 
    .cs_change = 0, 
}; 

ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); 
printf(" rozmiar tabrx=%d ", ARRAY_SIZE(rx)); 
//here it prints size of array equals 4 
for (ret = 0; ret < arsize; ret++) { 
    if (!(ret % 6)) 
     puts(""); 

    printf("%d. %.2X ", ret, rx[ret]); 

} 
puts(""); 
tr.cs_change = 1; 
} 

int main(int argc, char *argv[]) 
{ 
int ret = 0; 
int fd; 

fd = open(device, O_RDWR); 

/* 
* spi mode 
*/ 
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); 

ret = ioctl(fd, SPI_IOC_RD_MODE, &mode); 

/* 
* bits per word 
*/ 
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); 

ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits); 

/* 
* max speed hz 
*/ 
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); 

ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); 

printf("spi mode: %d\n", mode); 
printf("bits per word: %d\n", bits); 
printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000); 

uint8_t tx1[] = { 
    0x0, 0x1b, 0xa5 
}; 
transfer(fd, tx1, ARRAY_SIZE(tx1)); 

uint8_t tx2[] = { 
    0x0, 0x33, 0x30 
}; 
printf(" %d. ", ARRAY_SIZE(tx2)); 
transfer(fd, tx2, ARRAY_SIZE(tx2)); 

uint8_t tx3[] = { 
    0x0, 0x52, 0x90 
}; 
transfer(fd, tx3, ARRAY_SIZE(tx3)); 

uint8_t tx4[] = { 
    0x80, 0x60 
}; 
printf(" %d. ", ARRAY_SIZE(tx4)); 
transfer(fd, tx4, ARRAY_SIZE(tx4)); 

close(fd); 

return ret; 
} 

ответ

1

Для оператора sizeof дать фактический размер массива, вам необходимо:

  1. Выделяют массив статически
  2. Обратитесь к массиву в пределах своей декларации

Например:

void func() 
{ 
    int arr[10]; 
    int total_size = sizeof(arr); 
    int num_of_elements = sizeof(arr)/sizeof(*arr); 
    ... 
} 

Примером, когда массив не выделяется статически:

void func() 
{ 
    int* arr = malloc(sizeof(int)*10); 
    int total_size = sizeof(arr); // will give you the size of 'int*' 
    ... 
} 

Примером, когда массив не входит в сферу его декларации:

void func(int arr[]) // same as 'int* arr' 
{ 
    int total_size = sizeof(arr); // will give you the size of 'int*' 
    ... 
} 
+1

Я хотел бы добавить, что для почти всех практических целей, массив как параметр функции является альтернативным синтаксисом для вызова его указателем. В этой статье объясняется одно различие: http://stackoverflow.com/questions/5573310/difference-between-passing-array-and-array-pointer-into-function-in-c –

+0

@BrianMcFarland: Да, наверное, я должен добавить что массив переходит в указатель при передаче функции. –

+0

@mafso: Да, спасибо за исправление! –