Witam,
Coś w moim kodzie powoduje, że po jakims czasie mój ARM się wiesza. W programie wykorzystuję między inny rzutowanie z tablicy unsigned char na short, int i float oraz na operację odwrotną z zmiennych typu shortm int i float tworzę tablicę unsigned char. I tu właśnie mam pytanie, bo nie jestem pewiem czy robię to poprawnie. Oto kod, którego używam na AT91SAM256EK oraz AT91SAM9260.
a tu operacje odwrotne
Zastanawia mnie kwestia wyrównania struktury w której jest tablica unsigned charów, którą przekazuję do tych funkcji. Oto struktura:
Po rozparsowaniu przychodzącej ramki danych, obliczeniu CRC na przechodze w kodzie do wyciągania różnego typu danych z tablicy MBRxBuffer.
Co o tym myślicie?
Coś w moim kodzie powoduje, że po jakims czasie mój ARM się wiesza. W programie wykorzystuję między inny rzutowanie z tablicy unsigned char na short, int i float oraz na operację odwrotną z zmiennych typu shortm int i float tworzę tablicę unsigned char. I tu właśnie mam pytanie, bo nie jestem pewiem czy robię to poprawnie. Oto kod, którego używam na AT91SAM256EK oraz AT91SAM9260.
short ConvertToLSBShort(unsigned char * a_array, int a_StartIndex)
{
unsigned char frame[2] = {a_array[a_StartIndex], a_array[1 + a_StartIndex]};
return ((short*)frame)[0];
}
int ConvertToLSBInt(unsigned char * a_array, int a_StartIndex)
{
unsigned char frame[4] = {a_array[a_StartIndex], a_array[1 + a_StartIndex], a_array[2 + a_StartIndex], a_array[3 + a_StartIndex]};
return ((int*)frame)[0];
}
float ConvertToLSBSingle(unsigned char * a_array, int a_StartIndex)
{
unsigned char frame[4] = {a_array[a_StartIndex], a_array[1 + a_StartIndex], a_array[2 + a_StartIndex], a_array[3 + a_StartIndex]};
return ((float*)frame)[0];
} a tu operacje odwrotne
int PutShortIntoLSBArray(unsigned char * a_array, int a_StartIndex, short value)
{
unsigned char tempArray[2];
((short*)tempArray)[0] = value;
a_array[a_StartIndex] = tempArray[0];
a_array[++a_StartIndex] = tempArray[1];
return ++a_StartIndex;
}
int PutIntIntoLSBArray(unsigned char * a_array, int a_StartIndex, int value)
{
unsigned char tempArray[4];
((int*)tempArray)[0] = value;
a_array[a_StartIndex] = tempArray[0];
a_array[++a_StartIndex] = tempArray[1];
a_array[++a_StartIndex] = tempArray[2];
a_array[++a_StartIndex] = tempArray[3];
return ++a_StartIndex;
}
int PutSingleIntoLSBArray(unsigned char * a_array, int a_StartIndex, float value)
{
unsigned char tempArray[4];
((float*)tempArray)[0] = value;
a_array[a_StartIndex] = tempArray[0];
a_array[++a_StartIndex] = tempArray[1];
a_array[++a_StartIndex] = tempArray[2];
a_array[++a_StartIndex] = tempArray[3];
return ++a_StartIndex;
}Zastanawia mnie kwestia wyrównania struktury w której jest tablica unsigned charów, którą przekazuję do tych funkcji. Oto struktura:
typedef struct
{
unsigned char MBRxBuffer[MB_MAX_FRAME_SIZE];
unsigned char MBTxBuffer[MB_MAX_FRAME_SIZE];
unsigned char MBCmdBuffer[MB_MAX_FRAME_SIZE];
volatile int MBRxBufferLenght;
volatile int IsMBFrameReady;
}MbVbFrame;Po rozparsowaniu przychodzącej ramki danych, obliczeniu CRC na przechodze w kodzie do wyciągania różnego typu danych z tablicy MBRxBuffer.
Co o tym myślicie?