Vergelijken of unsigned long kleiner dan nul is ?
7 berichten
• Pagina 1 van 1
Vergelijken of unsigned long kleiner dan nul is ?
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
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 ?
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Vergelijken of unsigned long kleiner dan nul is ?
Hoogste bit aftesten.
Re: Vergelijken of unsigned long kleiner dan nul is ?
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' ?
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' ?
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Vergelijken of unsigned long kleiner dan nul is ?
Als ie het goed doet geeft ie een waarschuwing. Die heb ik als ik een unsigned met signed vergelijk
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Vergelijken of unsigned long kleiner dan nul is ?
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
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()
{
}
Re: Vergelijken of unsigned long kleiner dan nul is ?
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().
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().
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
7 berichten
• Pagina 1 van 1
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 2 gasten