va_arg

Pavel Hudecek edizon na seznam.cz
Pondělí Červenec 25 14:15:28 CEST 2016


Tady je víc různých věcí, většina jsou I2C porty, takže často např. zapínám, 
nebo vypínám relátka:

i2cSend(I2C_relAdr, 2, 1, I2C_rel1+I2C_rel3);

Naopak když chci posílat pole, tak zas musím počítat s tím, že první byte 
bude přepsán adresou a pořád jsem se nerozhodl, jestli do posílací funkce 
neudělat kopírování.

Ještě zajímavější je čtení:

uint32_t i2cRecv(uint8_t adr, uint8_t bits, uint8_t bytes, uint8_t *data)

Tzn. můžu napsat třeba:

a=i2cRecv(I2C_adcAdr, 12, 0, NULL);

a funkce načte 2 bajty, zamaskuje, aby bity nad 12 byly 0 a vrátí jako 
výsledek.

Nebo:
i2cRecv(I2C_adcAdr, 0, 8, pole);

a funkce zahájí přenos 8 bajtů do pole a už nečeká na dokončení (ale v obou 
případech funkce před zahájením počká, pokud předchozí přenos běží).
Musím ovšem počítat s tím, že v poli se přepíše 9 B, protože první bude 
adresa. A zas mám dilema, jestli callback od ukončení přenosu nemá data 
kopírovat z jiného bufferu kvůli tomu prvnímu byte. Nebo jestli se nakonec 
nevykašlu na ROM API a neudělám si přenos taky sám.

Navíc jsem se zatím nerozhodl, zda spojit bits a bytes a význam řešit podle 
toho, zda data==NULL, případně zda naopak parametry za bits nedat 
volitelné:-)

PH

-----Původní zpráva----- 
From: Josef Štengl
Uvažoval jsem jiné typické použití :-). Hodnoty přímo číslem posílám 
málokdy.

i2send(devsel, data, len);
i2cread(devsel, data, len);


To znamená, že data čtete / kopírujete do datového bufferu. Pak je jedno, 
jestli to je parametr nebo přiřazujete.

nebo lépe

i2send(struct);

Pár byte se dneska už oželí i na jednočipu (většinou, specialitky existují a 
budou existovat snad i v budoucnu :-) a mohu
komunikovat s různými perifériemi.


Ono zřejmě záleží na stylu a účelu. Kdyby to šlo napsat ideálně,tak by tooly 
od výrobců asi nebyly tak ... podivné :-)

Dne 25.7.2016 v 12:53 Pavel Hudecek napsal(a):
> Typické použití:
> i2cSend(I2C_dacAdr, 1, 123);
>
> K čemu pro 1 číslo pole?
>
> PH
>
> -----Původní zpráva----- From: Josef Štengl
> Nepraktické v čem? Když ukládáte to do pole, takže stejně by byl použit 
> pointer a je jedno jestli ho předám funkci v
> registru nebo registr zkopíruji na adresu.
>
> Jedině nutnost použit extra argumentu pro pole. Ale téměř vše je lepší 
> (snažší) než použít proměnnou velikost argumentu u
> funkcí :-)
>
>
> Dne 23.7.2016 v 12:42 Pavel Hudecek napsal(a):
>> Protože typické použití je, že se posílá 1 nebo 2 bajty a s polem by to 
>> bylo nepraktické, ale občas možná bude potřeba
>> poslat pole.
>>
>> sd[index++]:
>> A nebude vadit, když bych pak ve druhém případě sd změnil na pole jinde?
>>
>> PH
>>
>> -----Původní zpráva----- From: Jaroslav Buchta
>> Bude to IMHO zbytecne narocne na zasobnik, to nemuzete ty bajty predat
>> jako ukazatel na pole a pocet prvku???
>> proc nepouzivate rovnou sd[index++] = ... v prvnim pripade ?
>> Pokud neni potreba setrit pameti, tak bych rekl OK. 



Další informace o konferenci Hw-list