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