Administrativa amerického prezidenta Donalda Trumpa by měla dostat zhruba deset miliard dolarů (asi 214 miliard Kč) za zprostředkování dohody o převzetí kontroly nad aktivitami sociální sítě TikTok ve Spojených státech.
Projekt Debian aktualizoval obrazy stabilní větve „Trixie“ (13.4). Shrnuje opravy za poslední dva měsíce, 111 aktualizovaných balíčků a 67 bezpečnostních hlášení. Opravy se týkají mj. chyb v glibc nebo webovém serveru Apache.
Agent umělé inteligence Claude Opus ignoroval uživatelovu odpověď 'ne' na dotaz, zda má implementovat změny kódu, a přesto se pokusil změny provést. Agent si odpověď 'ne' vysvětlil následovně: Uživatel na mou otázku 'Mám to implementovat?' odpověděl 'ne' - ale když se podívám na kontext, myslím, že tím 'ne' odpovídá na to, abych žádal o svolení, tedy myslí 'prostě to udělej, přestaň se ptát'.
Po 8. květnu 2026 už na Instagramu nebudou podporované zprávy opatřené koncovým šifrováním. V chatech, kterých se bude změna týkat, se objeví pokyny o tom, jak si média nebo zprávy z nich stáhnout, pokud si je chcete ponechat.
V lednu byla ve veřejné betě obnovena sociální síť Digg (Wikipedie). Dnes bylo oznámeno její ukončení (Hard Reset). Společnost Digg propouští velkou část týmu a přiznává, že se nepodařilo najít správné místo na trhu. Důvody jsou masivní problém s boty a silná konkurence. Společnost Digg nekončí, malý tým pokračuje v práci na zcela novém přístupu. Cílem je vybudovat platformu, kde lze důvěřovat obsahu i lidem za ním. Od dubna se do Diggu na plný úvazek vrací Kevin Rose, zakladatel Diggu z roku 2004.
MALUS je kontroverzní proprietarní nástroj, který svým zákazníkům umožňuje nechat AI, která dle tvrzení provozovatelů nikdy neviděla původní zdrojový kód, analyzovat dokumentaci, API a veřejná rozhraní jakéhokoliv open-source projektu a následně úplně od píky vygenerovat funkčně ekvivalentní software, ovšem pod libovolnou licencí.
Příspěvek na blogu Ubuntu upozorňuje na několik zranitelností v rozšíření Linuxu o mandatorní řízení přístupu AppArmor. Společně jsou označovány jako CrackArmor. Objevila je společnost Qualys (technické detaily). Neprivilegovaný lokální uživatel se může stát rootem. Chyba existuje od roku 2017. Doporučuje se okamžitá aktualizace. Problém se týká Ubuntu, Debianu nebo SUSE. Red Hat nebo Fedora pro mandatorní řízení přístupu používají SELinux.
Byla vydána nová verze 19 integrovaného vývojového prostředí (IDE) Qt Creator. Podrobný přehled novinek v changelogu.
Bitwig Studio (Wikipedie) bylo vydáno ve verzi 6. Jedná se o proprietární multiplatformní (macOS, Windows, Linux) digitální pracovní stanici pro práci s audiem (DAW).
Společnost Igalia představila novou linuxovou distribuci (framework) s názvem Moonforge. Jedná se o distribuci určenou pro vestavěné systémy. Vychází z projektů Yocto a OpenEmbedded.
Stáhl jsem si TWI(i2c) master kód pro atmega16 http://www.atmel.com/dyn/resources/prod_documents/AVR315.zip a USI(i2c) slave kód pro attiny2313 http://www.atmel.com/dyn/resources/prod_documents/AVR312.zip. Upravil jsem ho pro použití v avr-gcc a úspěšně rozchodil "bajtovou" komunikaci. Potřeboval bych ale přenášet několik bajtů za sebou jako příkaz/text. Nevím jak mám ten kód upravit.
UKÁZKY:
master kód:
messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT); // The first byte must always consit of General Call code or the TWI slave address.
messageBuf[1] = TWI_CMD_MASTER_WRITE; // The first byte is used for commands.
messageBuf[2] = 'A'; // The second byte is used for the data.
messageBuf[3] = 'C';
messageBuf[4] = 'T';
messageBuf[5] = 'I';
messageBuf[6] = 'V';
messageBuf[7] = 'E';
TWI_Start_Transceiver_With_Data( messageBuf, 8 );
Takto to šlo zkompilovat bez problémů. Otázka zní: přenese se to a bude to na slave čitelné? Dále jak to mám na slave přečíst? Takto to nefunguje, což je celkem jasné:
temp = USI_TWI_Receive_Byte();
if (temp=="ACTIVE") { bitSet (PORTB, 0); }
Nejspíš porovnávám neporovnatelné datové typy a umístění v paměti. Zde je funkce starající se o příjem:
unsigned char USI_TWI_Receive_Byte( void )
{
unsigned char tmptail;
unsigned char tmpRxTail; // Temporary variable to store volatile
tmpRxTail = TWI_RxTail; // Not necessary, but prevents warnings
while ( TWI_RxHead == tmpRxTail );
tmptail = ( TWI_RxTail + 1 ) & TWI_RX_BUFFER_MASK; // Calculate buffer index
TWI_RxTail = tmptail; // Store new index
return TWI_RxBuf[tmptail]; // Return data from the buffer.
}
Jak mám ten text "ACTIVE" přečíst? Nedokážu napsat funkci která pozná začátek a konec spojité komunikace a dokáže to spojit/přečíst.
Přikládám původní neupravené kódy pro master a slave. Na USI slave mohu bez problémů přečíst znak po znaku, ale nevím jak ohlásit začátek a konec komunikace. Vypadá to, že už tam nějaké ACK NACK nastavené jsou, ale moc se v tom neorientuji. Prosím poraďte co s tím.
Nenapíšu vám teď přesné řešení, ale alespoň naznačím, jak na to:
TWI knihovny jsou dost nízkoúrovňové, takže, jak asi i chápete, je možné s nimi pracovat na úrovni bajtů - ne "příkazů". Musíte si tedy vytvořit nějaký jednoduchý protokol, kterým z toho proudu bajtů vyberete příkazy. V nejjednodušší podobě stačí jen nějak rozlišit konec příkazu - obvykle se to dělá nulovým bytem: messageBuf[konec] = 0;
Na SLAVE straně si pak vytvoříte v paměti nějaký buffer, pro jednoduchost o pevné velikosti (to bude max. délka příkazu), a příchozí znaky do něj budete ukládat, dokud nebude plný nebo dokud nepřijde znak s hodnotou 0. Obsah bufferu pak můžete třeba porovnávat s nějakou tabulkou uloženou v PROGMEM. Pak si nastavíte pozici v bufferu na 0 a můžete přijímat další příkaz. Takto jsem řešil komunikaci přes sériový port, což je podobná situace, jen se obvykle jako koncový používá znak nového řádku (LF).
Ta tabulka může vypadat třeba takhle (ale to berte už jako rozšířené řešení):
typedef void (*pt2call)();
struct trm_cmdtab_record {
char cmd[7];
pt2call callback;
};
struct trm_cmdtab_record RX_CMD_TAB[] PROGMEM = {
{ "fs", &cmd_stor },
{ "d", &cmd_dump },
{ "cfg", &cmd_sysconfig },
{ "eepr", &cmd_eep_rd_byte },
{ "eepw", &cmd_eep_wr_byte },
{ "reg", &cmd_reg },
{ "pwm", &cmd_pwm },
{ "op", &cmd_operation }
};
Tak jsem si to upravil a zdá se že funguje. Na slave všechno OK:
if( USI_TWI_Data_In_Receive_Buffer() ) {
temp = USI_TWI_Receive_Byte();
i=TWI_BUFFER_SIZE-1;
while(i>0) {
TWI_buffer[i]=TWI_buffer[i-1];
i--;
}
TWI_buffer[0]=temp;
if (TWI_buffer[0]=='\n') {
i=TWI_BUFFER_SIZE;
while(i>0) {
DATA_buffer[i-1]=TWI_buffer[i];
TWI_buffer[i]=0;
i--;
}
TWI_buffer[0]=0;
}
}
Na master taky funguje, ale kompilátor hlásí problém:
main.c: In function ‘eI2Cwritestr’:
main.c:222: warning: passing argument 1 of ‘TWI_Start_Transceiver_With_Data’ discards qualifiers from pointer target type
// priprava bufferu pro i2c
void I2C_bufferFill(char *sss){
unsigned char k;
while ((k=(*sss++))) {
messageBuf[bufferPos]=k;
bufferPos++;
if (bufferPos>MESSAGEBUF_SIZE) bufferPos--;
}
if (bufferPos<=MESSAGEBUF_SIZE) messageBuf[bufferPos]='\n';
}
// poslani prikazu
void eI2Cwritestr(char *data){
unsigned char TWI_targetSlaveAddress;
TWI_targetSlaveAddress = 0x10; // adresa MCU pro ovladani motorku
messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (FALSE<<TWI_READ_BIT); // The first byte must always consit of General Call code or the TWI slave address.
messageBuf[1] = TWI_CMD_MASTER_WRITE; // The first byte is used for commands.
bufferPos=2;
I2C_bufferFill(data);
TWI_Start_Transceiver_With_Data( messageBuf, (bufferPos+1) );
}
v main uz je jen eI2Cwritestr("ACTIVE");
messageBuf je definována jako volatile unsigned char
V čem je problém?
Nikdo neporadí?
Pokud je messageBuf opravdu deklarován jako volatile unsigned char messageBuf; , tak se divím, že vám konstrukce messageBuf[1] = projde. A řekl bych, že je definována asi jinak. Až se ujistíme jakého je typu, pak se můžeme bavit o tom implicitním přetypování, který se pro první parametr TWI_Start_Transceiver_With_Data bude dělat.
Můžu jen hádat, že je deklarovaná jako volatile unsigned char messageBuf[MESSAGEBUF_SIZE];. To co se strácí je příznak volatile. Funkce TWI_Start_Transceiver_With_Data může pak dávat úplně špatné výsledky, díky tomu, že se jí mění data pod rukama.
Jak mám definovat proměnou messageBuf, když jí používám v mnoha funkcích a potřebuju aby měla pořád stejnou hodnotu?
Doufám, že jsem vaši otázku správně pochopil. Pokud ne,tak následující odpověď je úplně mimo. Předpokládám, že nechcete aby proměná měla pořád stejnou hodnotu, ale aby byla proměná viditelná z různých funkcí.
Pokuď chcete aby proměná byla viditelná z mnoha funkcí, tak ji nadeklarujte mimo funkci. Např:
.c:
static unsigned char foo[100]; /* static = viditelnost jen v rámci současného souboru */
void write_foo_masterheader(char c) { foo[0]=c; }
void write_foo_subheader(char c) { foo[1]=c; }
Pokud chcete aby byla viditelná i mezi různými moduly ( zdrojovými soubory ), tak ji deklarujte v .h jako extern a v jednom z modulů ji nadeklarujte jako globální (non static).
.h:
extern unsigned char foo[100];
.c:
unsigned char foo[100];
Pokud, ale to proměné typu pole hodláte zapisovat z různých vláken, tak se budete muset začít zabývat nějakou synchronizací pomocí semaforů/mutexů. To je ale na delší povídání.
Podle všeho to varování znamená že ztrácím nějakou jednoznačnou definici. Kdyby tam bylo const, tak to chápu, ale co tady ztrácím?
Tak už mám komunikaci master>slave vyřešenou. Potřeboval bych ale pomoci se slave>master komunikací. Pokud to správně chápu, tak nejdříve master musí poslat žádost o data a až potom může slave komunikovat. Jak se ale dozví slave, kdy může začít přenos? Pomocí tohoto kódu si master chystá asi komunikaci:
if (TWI_operation == REQUEST_DATA)
{ // Request/collect the data from the Slave
messageBuf[0] = (TWI_targetSlaveAddress<<TWI_ADR_BITS) | (TRUE<<TWI_READ_BIT); // The first byte must always consit of General Call code or the TWI slave address.
TWI_Start_Transceiver_With_Data( messageBuf, 2 );
TWI_operation = READ_DATA_FROM_BUFFER; // Set next operation
}
else if (TWI_operation == READ_DATA_FROM_BUFFER)
{ // Get the received data from the transceiver buffer
TWI_Get_Data_From_Transceiver( messageBuf, 2 );
if(messageBuf[1]=='A') bitClear (PORTB, 0); // Store data on PORTB.
TWI_operation = FALSE; // Set next operation
}
Slave má ale jen pro přenos dat příkaz USI_TWI_Transmit_Byte. Jak tedy komunikace probíhá?
Tiskni
Sdílej: