markosik20 napisał: nenpa8lo napisał: Jeżeli do 'adres' przypisujesz sztywne 0x2 to może być błąd kompilatora, już kiedyś się spotkałem z bykiem IAR gdzie 1<<16 robiło mi na 32bit zmiennej unsigned liczbę ujemną ( o zgrozo ).
No nie przesadzajmy...w takim podstawowym przypisaniu błąd? W jaki sposób autor sprawdza wartość tego bajtu? Jeżeli nic dalej nie jest "robione" z tą zmienną to włączona optymalizacja może po prostu zignorować to przypisanie.
Oto kawalek:
//********************************************************************************
//* Name : ReadData
//* Purpose : Read Data from S1D13781 memory
//* IN :
//* adr / UINT32 /
//*
//* OUT :
//* data / UINR16 /
//********************************************************************************
uint16_t S1D13781_ReadData( uint32_t adr)
{
UCHAR data;
CTRL_PORT ClrBit ( PC );
CTRL_PORT ClrBit ( CS );
S1D13781_WriteByte( adr ); // first byte of address
S1D13781_WriteByte( 0x08 ); // second byte of address
S1D13781_WriteByte( 0x06 ); // third byte of address
CTRL_PORT SetBit ( PC );
data = S1D13781_ReadByte();
CTRL_PORT SetBit ( CS );
return data;
}
narazie reszta adresu jest ustawiona na sztywno, ale docelowo ma byc rozbita.
Zreszta, tak jak napisalem wyzej, nawet kiedy skieruje to prosto na port, to tez nic tam nie wychodzi.
sam nic nie deklarowalem, ale nawet z [unsigned long int] jest to samo.
0x02 przypisywalem na sztywno ( w ramach testu )
Dodano po 8 [minuty]:
rpal napisał: kolego sposobów jest bez liku ale moim zdaniem najprostszy to zastosowanie unii dla przykładu
union {
unsigned long int duza_liczba;
unsigned char bajty[4];
} wyciagnij;
masz już zadeklarowaną tablicę wewnątrz unii i gdzie tak sama liczba typu long int jak i 4 elementy jej tablicy zajmują ten sam obszar pamięci z tą różnicą że można się do nich odwoływac na różne sposoby. Jeśli użyjesz następującego odwołania wewnątrz programu
to liczba long int przyjmie wartosc 256 i podobnie będzie na innych elementach tablic oraz "szprzężonej" z nią liczby long int. Jest też odwrotnie bo jeśli przywołasz coś takiego
wyciagnij.duza_liczba = 257;
to element tablicy wyciagnij.bajty[0] oraz wyciagnij.bajty[1] przyjmą wartosc 1 i w ten sposob najprosciej możesz wyłuskiwac poszczególne bajty składające się na daną liczbę (w tym przypadku 4 bajty) bez żadnych przesunięć bitów czy operacji logiczny. Proste i przyjemne. Zapuść symulator i zobaczysz jakie cuda się dzieją na poszczególnych bitach twojej dużej liczby kiedy to zmieniasz elementy tablicy


to wyglada zachecajaco. Ze tez o tym nie pomyslalem

I chyba mozna zaoszczedzic duzo cykli ( zamiast shitftowania ). Sprawdze to jutro rano w pracy.