www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Pointerji v C
Pojdi na stran 1, 2  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Tor Nov 01, 2005 8:26 pm    Naslov sporočila:  Pointerji v C Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Tor Nov 01, 2005 9:05 pm    Naslov sporočila:   Odgovori s citatom

Funkcija CRC16 zahteva kot prvi parameter kazalec na tip char (pointer na 1 byte), ti pa podas kazalec na strukturo, deklarirano zgoraj, ki ni tipa char ? Konec koncev se vsak podatek lahko obravnava kot byte (ali karkoli drugega), tako da nekaj najbrz res deluje, vprasanje pa je, ali je to res to kar bi ti rad (odvisno od tega, kako so v tvoji arhitekturi razporejeni posamezni bajti znotraj longa in koliko je long dolg).
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Tor Nov 01, 2005 9:12 pm    Naslov sporočila:   Odgovori s citatom

Če veš kaj si mislil s tem narediti, ti svetujem naslednje:
Ustvari nov pointer tipa char in mu priredi naslov tvojega pointerja Data.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Tor Nov 01, 2005 9:18 pm    Naslov sporočila:   Odgovori s citatom

So polja tipa long sploh nujna v tem primeru ? Domnevam namrec, da PICi nimajo ukazov za delo z 32-bitnimi integerji Rolling Eyes
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70829.94

PrispevekObjavljeno: Tor Nov 01, 2005 9:35 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Tor Nov 01, 2005 10:09 pm    Naslov sporočila:   Odgovori s citatom

Mare, struktura v zgornjem primeru je velika (dolga) 32 bajtov. Tvoj primer je dolg samo 8 bajtov, zato bi bil izracun CRC s tisto vrednostjo dolzine (32) nepricakovan (odvisno od tega, kaj je v RAMu za tisto strukturo), pa se ostala koda bi morda delala narobe, ce se zanasa na dolzino 32 bajtov.

Torej ali

Koda:
unsigned char A[4*4];
unsigned char B[4*4];


ali pa recimo

Koda:

unsigned char A1[4];
unsigned char A2[4];
unsigned char A3[4];
unsigned char A4[4];
unsigned char B1[4];
unsigned char B2[4];
unsigned char B3[4];
unsigned char B4[4];


(drugo je grdo - oboje je v bistvu grdo, a ne vemo prav nic o programu oz. o tem zakaj je sploh potrebna taka cudna razdelitev)

Najmanj grdo bi seveda bilo

Koda:
unsigned char TData[32];


namesto tistega skropucala zgoraj, je pa seveda to treba upostevati v preostanku kode. Tako bo prevajalnik zagotovo naredil najmanj "svinjarije".
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Tor Nov 01, 2005 11:21 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Tor Nov 01, 2005 11:32 pm    Naslov sporočila:   Odgovori s citatom

No, jaz bi na tvojem mestu modificiral funkcijo CRC16. Spremeni prvi parameter v njeni deklaraciji v pointer na tisto tvojo strukturo, v telesu funkcije pa dodaj se eno spremenljivko, ki bio pointer na uchar (unsigned char * kazalec) in takoj po klicu funkcije spremenljivki kazalec pripisi vrednost prvega parametra, torej pointerja na strukturo.

Druga (najbrz slabsa) moznost je, da strukturo deklariras kot polje uchar-ov in sam premetavas podatke (ko imas carry pac stejes naprej v naslednji spremenljivki - vsi mikroprocesorji/MCUji imajo carry flag ravno zato), kar pa je bolj glomazno - zdaj to pocne prevajalnik namesto tebe in ti skrije "grdo" delo ... bolj ali manj optimalno.

Se eno vprasanje, ker ne vemo prakticno nicesar o tvoji aplikaciji: morda bi bilo bolj ucinkovito, da bi namesto CRC kode in retransmita uporabljal Hammingovo kodiranje ("ECC"). Tako se ti napake prvega reda odpravljajo same, ob napakah drugega reda pa sele zahtevas retransmit. Pri CRC bos retransmit zahteval ob napaki prvega reda, ce ti jo bo funkcija seveda odkrila (obstaja moznost, da je ne bo, kar sicer velja za vsako tako preverjanje). Koliko napak pa pricakujes pri tvojih prenosih ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Sre Nov 02, 2005 8:07 am    Naslov sporočila:   Odgovori s citatom

Kaj pa če ustvariš union za tvojo strukturo?

Iz PICmicro MCU C®
An introduction to programming
The Microchip PIC in CCS C
By Nigel Gardner


8.4 Introduction to Unions
A union is defined as a single memory location that is shared by two or more
variables. The variables that share the memory location may be of different
data types. However, you may only use one variable at a time. A union looks
very much like a structure. The general format of the union is:
union tag-name
{
type element1;
type element2;
.
.
type elementn;
} variable-list;
Again, the tag-name is the name of the union and the variable-list are the
variables that have a union type tag-name. The difference between unions
and structures is that each member of the union shares the same data space.
For example, the following union contains three members: an integer, a
character array, and a double.
union u_type
{
int i;
char c[3];
double d;
} temp;
The way that a union appears in memory is shown below. We will use the
previous example to illustrate a union. The integer uses two bytes, the
character array uses three bytes and the double uses four bytes.
<--------------------------------------------------double--------------------------------------------------->
<---------c[2]----------> <---------c[1]----------> <---------c[0]---------->
<---------------------integer---------------------->
element0 element1 element2 element3
Accessing the members of the union is the same as with structures, you use a
period. The statement temp.i will access the two byte integer member i of
the union temp and temp.d will access the four byte double d. If you are
accessing the union through a pointer, you would use the arrow operator just
like structures.
It is important to note that the size of the union is fixed at complier time to
accommodate the largest member of the union. Assuming that doubles are
four bytes long, the union temp will have a length of four bytes.
103
A good example of using a union is when an 8-bit microcontroller has an
external 12-bit A/D converter connected to a serial port. The microcontroller
reads the A/D in two bytes. So we might set up a union that has two unsigned
chars and a signed short as the members.
union sample
{
unsigned char bytes[2];
signed short word;
}
When you want to read the A/D, you would read two bytes of data from the
A/D and store them in the bytes array. Then, whenever you want to use the
12-bit sample you would use word to access the 12-bit number.
[/i]
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Sre Nov 02, 2005 11:37 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Sre Nov 02, 2005 1:20 pm    Naslov sporočila:   Odgovori s citatom

Kroko je napisal/a:
Bom poskusil z unioni. Sem mislil, da obstaja tip "untyped pointer" v C-ju.


void* ?

Citiram:
Napake, ki jih pričakujem so predvsem posledica nesinhroniziranosti senderja in receiverja. Lahko se na primer zgodi, da začne PC pošiljati preden začne PIC sprejemati kar pomeni, da zgubim nekaj bytov in so vsi podatki zamaknjeni.

Ali bi mi Hammingovo kodiranje pri tem pomagalo? Ali ima kdo že narejeno rutino?


Odvisno od tega, na kaksnem nivoju ga implementiras. Hipoteticen primer, temeljec na opisu, ki si ga dal:

Predpostavka: vlakec podatkov je dolg 8 bajtov (ce je daljsi, je to samo se bolj v prid Hammingovega kodiranja)

Posljes vlakec podatkov PICu, pri cemer je mozno, da bo na zacetku nekaj podatkov (bajtov) odrezanih. Ce uporabis primerjavo CRC (torej izracunano v PCju in poslano in izracunano v PICu iz sprejetih podatkov), potem bo CRC koda v vlakcu podatkov zamaknjena in je ne bos ustrezno prebral, ce nisi tega nekako resil (namesto nje bo tam kaksna druga vrednost).

Alternativa: vlakec podatkov najprej transponiras (predstavljaj si vsak bajt kot matriko dimenzije 1x8, transponirana je pa 8x1). Prvi bajt tvojega novega vlakca podatkov bo torej vsebioval 1. bit iz bajtov 1 do 8., drugi bajt vlakca bo vseboval 2. bit bajtov 1 do 8, itd., zadnjih nekaj bajtov pa bo vsebovalo Hammingove (ECC) kode. Ob prenosu spet pride do zamika in prvi bajt vlakca podatkov je povsem izgubljen. Ob dekodiranju podatkov iz ECC bitov vidis, da je prislo do napake prvega reda na vseh osim bajtih podatkov, ki pa so avtomatsko odpravljene. Ni treba zahtevati retransmita.

Ce bi imel vlakec podatkov se vec bajtov, bi to pomenilo, da bo prvih nekaj bajtov prenosa vsebovalo 1. bit, in bi torej tudi izgubo prvih nekaj zaporednih bajtov prenosa prezivel povsem brez skode (brez retransmita), saj bi slo se vedno samo za napako prvega reda.

Razumeti moras razliko med transponiranimi in netransponiranimi podatki (kdaj je eno boljse in kdaj je drugo boljse in casovno zahtevnost take operacije) in kodiranje na splosno glede na pricakovano stevilo in tip napak, saj lahko uporabis bolj ali manj ucinkovito kodiranje ("ucinkovito" v tem primeru pomeni z vec ali manj ECC biti, ki so v bistvu "odvec" pri dobrem prenosu). Lahko naredis vec slabega kot dobrega z napacno izbiro tipa kodiranja, torej lahko po nepotrebnem zapravljas kup procesorskih ciklov in casa za prenos, pa bos se vedno imel retransmite ob napakah, s pametno uporabo pa se jim lahko izognes ob minimalnem overheadu. Vec o tem v zadnjem odstavku (cisto na dnu).

Koda za to seveda obstaja: z nekaj look-up tabelami je tako enostavna, da ne predstavlja pretirane zahtevnosti za 8-bitne mikrokontrolerje. En primer z izjemno dobro teoreticno razlago o aplikaciji tematike na majhne (sibke) mikrokontrolercke je objavljen v app. notes za Motoroline (Freescale) 68HC908, zelo dobro splosno razlago pa imas tudi tukaj. Druga je sicer krajsa, a tudi nakaze moznost za manj ECC bitov in ima na dnu se tabelo ucinkovitosti glede na stevilo uporabljenih ECC bitov in dolzino bloka na nivoju katerega integriteto preverjas. Najmanj ucinkovito je namrec preverjanje na ravni majhnih "bajtov", recimo 2-bitnih, 3-bitnih, 4-bitnih, itd. Za vecje bloke (dolge recimo 100+ bitov, je overhead bistveno bistveno manjsi.

Za se vec informacij uporabi tudi Google.

Jaz bi na tvojem mestu - ce je le mozno - prilagodil aplikacijo toliko, da do izgube zaradi nesinhroniziranosti ne bi moglo priti. Ali je to mozno ali ne (brezpogojna uporaba prekinitev za sprejem podatkov) pa ves ti sam.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Proteus
Član
Član



Pridružen-a: Sre 15 Jun 2005 10:03
Prispevkov: 1943
Aktiv.: 8.20

PrispevekObjavljeno: Sre Nov 02, 2005 4:06 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
Napake, ki jih pričakujem so predvsem posledica nesinhroniziranosti senderja in receiverja. Lahko se na primer zgodi, da začne PC pošiljati preden začne PIC sprejemati kar pomeni, da zgubim nekaj bytov in so vsi podatki zamaknjeni.

Zakaj pa ne uporabiš strukturiranega prenosa?
Podatkom dodaš glavo in noge in na ta način dobiš telegram.
Podatke sprejemaš preko prekinitve, kjer sproti preverjaš, kdaj prispe novi telegram, ki ga nato ustrezno obdelaš. Struktura telegrama tako lahko zgleda nekaj v stilu:

[start byte]
[št.naprave]
[tip telegrama]
[dolžina podatkov (n)]
[podatek 1]
.
.
[podatek n-1]
[podatek n]
[crc - hi]
[crc - lo]
[stop byte]

Prenos podatkov preko prekinitve ima še to prednost, da se v glavni rutini sploh ne ukvarjaš z njimi. Enostavno so ti na voljo tam, kjer jih rabiš. Dodaš samo še bit s katerim si označil ali so veljavni ali ne.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
NeoTO
Član
Član



Pridružen-a: Pon 28 Mar 2005 19:19
Prispevkov: 2752
Aktiv.: 11.62
Kraj: Trzic

PrispevekObjavljeno: Sre Nov 02, 2005 6:48 pm    Naslov sporočila:   Odgovori s citatom

Prilagam ti svoj programček za paketno prenašanje. Poglej če si lahko kaj pomagaš!


Paketni prenos podatkov.rar
 Opis:

Download
 Ime datoteke:  Paketni prenos podatkov.rar
 Velikost datoteke:  62.23 KB
 Downloadano:  18 krat

Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo MSN Messenger - naslov
.
Neznanec
Neznanec



Pridružen-a: Pet 01 Okt 2004 1:17
Prispevkov: 1
Aktiv.: 0.00

PrispevekObjavljeno: Čet Nov 03, 2005 4:50 pm    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.57

PrispevekObjavljeno: Čet Nov 03, 2005 5:27 pm    Naslov sporočila:   Odgovori s citatom

Na kratko: dodaj & 0xff k TMR1L = timer_setupin, torej

Koda:
TMR1L = (timer_setupinv & 0xff)


pa bo sel warning stran.

Na dolgo: tudi pri zgornjem bajtu bi bilo lepo, ce bi ga omejil na osem bitov (prevajalnik ti omogoca delo z vecjimi podatkovnimi tipi in konstantami, zato bi se lahko zgodilo, da bi dobil warning tudi pri zgornjem delu). Warning je v bistvu se najmanjsi problem, to je samo prevajalnik, ki opozarja na malomarnost - problem bo, ko prevajalnik ne bo pisnil, program pa ne bo deloval po pricakovanjih. Prvi del spremenis takole:

Koda:
TMR1H = ((timer_setupinv >> 8) & 0xff)


Se ena stvar o prevajalnikih: sam sem se na tezji nacin naucil kako pomembno je dodajati oklepaje v makrote, cetudi se ti zdi na prvi pogled nepotreben - o tem bo itak presodil prevajalnik, dodatni oklepaji pa ne pomenijo nic dodatne kode, ampak samo zagotovijo pravilo generiranje kode.
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Microchip PIC Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran 1, 2  Naslednja
Stran 1 od 2

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 492 dni


Powered by phpBB © 2001, 2005 phpBB Group