Re: Problém s C kompilátorem nebo mezi klávesnicí a židlí?

Jakub Ladman ladmanj na volny.cz
Neděle Červenec 7 22:00:16 CEST 2019


Bingo!

Díky

Dne 07. 07. 19 v 20:34 Milan B. napsal(a):
>
> ioctl FIONREAD ocakava aku velkost premennej pre vratenu hodnotu?
>
> Ak - tak ako byva zvykom - 32 bitov (a premenna ktora sa mu podstrkuje 
> je 16-bitova), tak potom ioctl zrejme prepisuje aj to co je za nou/nad 
> nou v zasobniku...
>
> Skuste zmenit bytes_avail na 32 bitovu premennu, co to spravi.
>
> -m-
>
>
> On 07.07.2019 19:57, Jakub Ladman wrote:
>> Ahoj
>>
>> Moc často sem dotazy nekladu, ale teď si oravdu nevím rady a jsou tu 
>> odborníci, z nichž někteří znají normu téměř z paměti :-)
>>
>> Mějme funkci, která předává příkazy hardwaru přes sériový port a za 
>> odměnu od něj dostane 1-256 bytů dat.
>>
>> Nadřazený kus sw ale požaduje 0-65535 bytů (ano jeden chybí, ale to 
>> není část aktuálního problému)
>>
>> Problém je proměnná "biboch", která se jmenuje tak blbě jen proto, že 
>> už jsem měl podezření, že původní název "actual_len" s něčím 
>> koliduje. Ovšem asi ne, ani prohledání celého kódu neodhalí žádnou 
>> takovou proměnnou a už vůbec ne globální.
>>
>> Proměnná může nabývat jen zmíněných 1-256
>>
>> Ale její obsah nepřežije vstup do while smyčky.
>>
>> Uvnitř proměnná existuje, ale její obsah je vynulován.
>>
>> Absolutně nechápu co je to za ptákovinu.
>>
>> Když si to v debuggeru krokuju a tu původní hodnotu si ručně obnovím, 
>> tak to funguje jak má.
>>
>> Díky za tip.
>>
>>
>> Jakub Ladman
>>
>> static uint8_t membuf[0xffff];    //whole 64kB memory image
>> static uint8_t page = 0;
>> uint8_t *doMemRead(uint16_t addr, uint16_t length)
>> {
>>     uint8_t data[4];
>>     uint8_t *output = membuf+addr;
>>     uint16_t biboch;
>>     uint16_t bytes_avail;
>>     uint8_t *temp;
>>     uint8_t len;
>>
>>     while(length > 0)
>>     {    // set address
>>         data[0] = (addr >> 8) & 0xff;
>>         data[1] = addr & 0xff;
>>         data[2] = page;
>>
>>         if(length/0x100)
>>             biboch = 0x100;
>>         else
>>             biboch = length%0x100;
>>
>>         data[3] = (biboch & 0xff);
>>
>>         if(ADR != send_hw_command(ADR, data, 4))
>>             return NULL;
>>         // read the data
>>         if(RDM != send_hw_command(RDM, data, 1)) // data byte is 
>> necessary but unread by hw
>>             return NULL;
>>
>>         usleep(1000);
>>
>>         printf("actual len %d\n", biboch);
>>         ioctl(sfd, FIONREAD, &bytes_avail);
>>
>>         while(bytes_avail && !global_server_quit)
>>         {
>>             printf("actual len %d\n", biboch);
>>             if(bytes_avail>=(biboch+4))
>>             {
>>                 if((biboch+4)==read(sfd,inbuf,(biboch+4)))
>>                 {
>>                     if(biboch == 
>> packet_decode(&len,&temp,inbuf,(biboch+4)))
>>                     {
>>                         memcpy(membuf+addr,temp,biboch);
>>                         length -= biboch;
>>                         addr   += biboch;
>>                     }
>>                     else return NULL;
>>                 }
>>             }
>>             ioctl(sfd, FIONREAD, &bytes_avail);
>>         }
>>     }
>>     return output;
>> }
>>
>>
>> Target: x86_64-linux-gnu
>>
>> gcc version 8.3.0 (Ubuntu 8.3.0-6ubuntu1)
>>
>> defaultně -std=gnu18, ale zkoušel jsem i 17 a 99
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list


Další informace o konferenci Hw-list