Vergelijken of unsigned long kleiner dan nul is ?

algemene C code
Gebruikers-avatar
Berichten: 1374
Geregistreerd: 06 Aug 2016, 01:03

Vergelijken of unsigned long kleiner dan nul is ?

Berichtdoor Koepel » 09 Nov 2017, 13:42

Voordat je meteen gaat roepen dat het niet kan, deze situatie is nog best ingewikkeld.

Ik wil graag de ReadBytes() van de Stream class voor de Wire library promoten, maar er zit een timeout in.

Zowel de AVR als de SAMD gebruiken deze code:
cpp code
int Stream::timedRead()
{
int c;
_startMillis = millis();
do {
c = read();
if (c >= 0) return c;
} while(millis() - _startMillis < _timeout);
return -1; // -1 indicates timeout
}

Referentie:
https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/Stream.cpp
https://github.com/arduino/ArduinoCore-sam/blob/master/cores/arduino/Stream.cpp.

Ik diende een issue in: https://github.com/arduino/Arduino/issues/6652.
De timeout heeft voor de Wire library geen betekenis, en kan een delay veroorzaken die nergens op slaat.
Eventueel is het misschien mogelijk om een Wire.setTimeout(0); in de Wire.begin() te doen.

Het draait hier om: while(millis() - _startMillis < _timeout)
Het zijn allemaal unsigned long variabelen, waarbij de _timeout dan nul zou zijn.

Is het mogelijk om met een unsigned variabele te kijken of iets kleiner dan nul is (die 'nul' is een variabele, geen constante) ? Ligt dat vast in de 'c' taal ? Is dat voor alle processors en alle compilers hetzelfde ?

Advertisement

Gebruikers-avatar
Berichten: 4553
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Vergelijken of unsigned long kleiner dan nul is ?

Berichtdoor nicoverduin » 09 Nov 2017, 13:58

Hoogste bit aftesten.
Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 1374
Geregistreerd: 06 Aug 2016, 01:03

Re: Vergelijken of unsigned long kleiner dan nul is ?

Berichtdoor Koepel » 09 Nov 2017, 17:13

De "millis() - _startMillis" is waarschijnlijk 0, en misschien iets hoger als millis() net verhoogde of er een interrupt door kwam.

De conditie is dus "0 < 0" of "1 < 0". Maar dan met variabelen die die waarden hebben.

Mijn vraag is dus wat de compiler doet met "< 0" als die '0' een unsigned long is met de waarde nul. Ligt dat vast voor de taal 'c' ?

Gebruikers-avatar
Berichten: 4553
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Vergelijken of unsigned long kleiner dan nul is ?

Berichtdoor nicoverduin » 09 Nov 2017, 18:59

Als ie het goed doet geeft ie een waarschuwing. Die heb ik als ik een unsigned met signed vergelijk :)
Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 4553
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Vergelijken of unsigned long kleiner dan nul is ?

Berichtdoor nicoverduin » 10 Nov 2017, 10:34

Als je in de vergelijking de c vervangt voor 0 dan loopt de compiler te mauwen(warning) dat deze vergelijking altijd false is. maak je de vergelijking met een variabele (zie voorbeeld) dan vind de compiler het goed.
cpp code
#include "Arduino.h"
unsigned int a = 100;
unsigned int b = 100;
unsigned int c = 0;

void setup()
{
Serial.begin(9600);
if (a - b < c) {
Serial.println("negative");
}
}

void loop()
{
}
Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 1374
Geregistreerd: 06 Aug 2016, 01:03

Re: Vergelijken of unsigned long kleiner dan nul is ?

Berichtdoor Koepel » 10 Nov 2017, 14:42

Dankjewel Nico.
Ik heb intussen gelezen dat een ALU van een processor niet twee getallen van elkaar gaat aftrekken bij een vergelijking, maar dat er logische poorten worden gebruikt om te bepalen welke groter is.

Ik zou eerst nog een testje willen doen met de gewijzigde Stream class. Daarna zal ik een pull request bij Arduino doen. Als dat door komt ga ik iedereen adviseren om Wire.readBytes() te gebruiken na een Wire.requestFrom().

Gebruikers-avatar
Berichten: 4553
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Vergelijken of unsigned long kleiner dan nul is ?

Berichtdoor nicoverduin » 10 Nov 2017, 17:32

Suc6
Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 1 gast