diff --git a/README.md b/README.md index 7d697eb..949f3e6 100644 --- a/README.md +++ b/README.md @@ -12,20 +12,22 @@ Variables and functions are accessed via indexes which need to be known to their The muCom protocol does not define master or slave ECUs. Both act as equal partners and define their capabilities but the variables and functions they link to the muCom interface. -##### Benchmark results ##### +##### Benchmark results from v2.0 ##### | Function | Execution time in us | | --- | --- | -| writeByte() | 35 | -| writeShort() | 55 | -| writeLong() | 92 | -| writeLongLong() | 156 | -| writeFloat() | 93 | -| readByte() | 255 | -| readShort() | 340 | -| readLong() | 458 | -| readLongLong() | 701 | -| readFloat() | 456 | -| invokeFunction() | 40 | +| writeByte() | 42 | +| writeShort() | 62 | +| writeLong() | 99 | +| writeLongLong() | 164 | +| writeFloat() | 100 | +| writeDouble() | 100 | +| readByte() | 307 | +| readShort() | 411 | +| readLong() | 527 | +| readLongLong() | 767 | +| readFloat() | 527 | +| readDouble() | 527 | +| invokeFunction() | 42 | Executed on an Atmega328p with a 250000kBaud serial interface in loopback mode. @@ -33,3 +35,5 @@ Executed on an Atmega328p with a 250000kBaud serial interface in loopback mode. ##### Frame structure ##### See muComBase.cpp for details regarding the binary structure of muCom frames. +Each muCom frame is tuned for maximum transmission speed and efficiency resulting in a binary efficiency of 87.5% when comparing the useful transmitted data (frame type, payload byte count and target variable ID are considered useful) to the overall frame length. +The muCom protocol has no need for wait times for frame synchronization, allowing the serial interface to run at 100% load when streaming data as fast as possible. diff --git a/examples/Benchmark/Benchmark.ino b/examples/Benchmark/Benchmark.ino index 661a373..807f742 100644 --- a/examples/Benchmark/Benchmark.ino +++ b/examples/Benchmark/Benchmark.ino @@ -1,14 +1,15 @@ #include "muCom.h" -muCom Device(Serial, 6, 1); +MUCOM_CREATE(Device, Serial, 6, 1); -long timestamps[12] = {0}; //Timestamps for benchmark +long timestamps[14] = {0}; //Timestamps for benchmark uint8_t u8Dummy = 0; uint16_t u16Dummy = 0; uint32_t u32Dummy = 0; uint64_t u64Dummy = 0; float f32Dummy = 0.0; +double f64Dummy = 0.0; void DoNothing(uint8_t *data, uint8_t cnt) @@ -35,6 +36,7 @@ void setup() Device.linkVariable(2, &u32Dummy); Device.linkVariable(3, &u64Dummy); Device.linkVariable(4, &f32Dummy); + Device.linkVariable(5, &f64Dummy); //Link function Device.linkFunction(0, DoNothing); @@ -73,32 +75,42 @@ void setup() delay(5); Device.handle(); + tmpTime = micros(); + Device.writeDouble(5, -666.66); + timestamps[5] += (int)micros() - tmpTime; + delay(5); + Device.handle(); + // ------- Benchmark reading variables ------- tmpTime = micros(); u8Dummy = Device.readByte(0); - timestamps[5] += (int)micros() - tmpTime; + timestamps[6] += (int)micros() - tmpTime; tmpTime = micros(); u16Dummy = Device.readShort(1); - timestamps[6] += (int)micros() - tmpTime; + timestamps[7] += (int)micros() - tmpTime; tmpTime = micros(); u32Dummy = Device.readLong(2); - timestamps[7] += (int)micros() - tmpTime; + timestamps[8] += (int)micros() - tmpTime; tmpTime = micros(); u64Dummy = Device.readLongLong(3); - timestamps[8] += (int)micros() - tmpTime; + timestamps[9] += (int)micros() - tmpTime; tmpTime = micros(); f32Dummy = Device.readFloat(4); - timestamps[9] += (int)micros() - tmpTime; + timestamps[10] += (int)micros() - tmpTime; + + tmpTime = micros(); + f32Dummy = Device.readDouble(5); + timestamps[11] += (int)micros() - tmpTime; // ------- Benchmark invoking functions ------- tmpTime = micros(); Device.invokeFunction(0); - timestamps[10] += (int)micros() - tmpTime; + timestamps[12] += (int)micros() - tmpTime; delay(5); Device.handle(); } @@ -106,10 +118,10 @@ void setup() //Calculate average benchmark result tmpTime = micros(); __asm__("nop\n\t"); //Ensure that micros is actually stored in tmpTime - timestamps[11] = (int)micros() - tmpTime; - for(i = 0; i < 11; i++) + timestamps[13] = (int)micros() - tmpTime; + for(i = 0; i < 14; i++) { - timestamps[i] = (timestamps[i] / 100) - timestamps[11]; + timestamps[i] = (timestamps[i] / 100) - timestamps[13]; } digitalWrite(LED_BUILTIN, HIGH); @@ -124,13 +136,15 @@ void loop() Serial.print("writeLong(): "); Serial.println(timestamps[2]); Serial.print("writeLongLong(): "); Serial.println(timestamps[3]); Serial.print("writeFloat(): "); Serial.println(timestamps[4]); - Serial.print("readByte(): "); Serial.println(timestamps[5]); - Serial.print("readShort(): "); Serial.println(timestamps[6]); - Serial.print("readLong(): "); Serial.println(timestamps[7]); - Serial.print("readLongLong(): "); Serial.println(timestamps[8]); - Serial.print("readFloat(): "); Serial.println(timestamps[9]); - Serial.print("invokeFunction(): "); Serial.println(timestamps[10]); + Serial.print("writeDouble(): "); Serial.println(timestamps[5]); + Serial.print("readByte(): "); Serial.println(timestamps[6]); + Serial.print("readShort(): "); Serial.println(timestamps[7]); + Serial.print("readLong(): "); Serial.println(timestamps[8]); + Serial.print("readLongLong(): "); Serial.println(timestamps[9]); + Serial.print("readFloat(): "); Serial.println(timestamps[10]); + Serial.print("readDouble(): "); Serial.println(timestamps[11]); + Serial.print("invokeFunction(): "); Serial.println(timestamps[12]); Serial.println(); delay(5000); -} \ No newline at end of file +} diff --git a/examples/Example_1/Example_1.ino b/examples/Example_1/Example_1.ino index 239f090..c01b5b0 100644 --- a/examples/Example_1/Example_1.ino +++ b/examples/Example_1/Example_1.ino @@ -6,7 +6,7 @@ void setLED(uint8_t *data, uint8_t cnt); //Create muCom interface -muCom Device(Serial, 2, 1); +MUCOM_CREATE(Device, Serial, 2, 1); //Global variables diff --git a/extras/Doxyfile b/extras/Doxyfile index 5b4f790..b7b3ae2 100644 --- a/extras/Doxyfile +++ b/extras/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = muCom # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.1 +PROJECT_NUMBER = 2.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/extras/html/annotated.html b/extras/html/annotated.html index f679984..d39857a 100644 --- a/extras/html/annotated.html +++ b/extras/html/annotated.html @@ -19,7 +19,7 @@
muCom -  1.1 +  2.0
The reliable, fast and easy way to exchange binary data via UART
@@ -46,9 +46,9 @@
Here are the classes, structs, unions and interfaces with brief descriptions:
- + - +
 CmuComFile containing the main class for the muCom interface when being used for an Arduino
 CmuComMain class for the muCom interface when being used for an Arduino
 CmuCom_LinkedVariable_strInternal structure to store references to linked variables
 CmuComBaseBase muCom class
 CmuComBaseBase muCom class
diff --git a/extras/html/classes.html b/extras/html/classes.html index 2c75b4d..4744a84 100644 --- a/extras/html/classes.html +++ b/extras/html/classes.html @@ -19,7 +19,7 @@
muCom -  1.1 +  2.0
The reliable, fast and easy way to exchange binary data via UART
diff --git a/extras/html/classmu_com-members.html b/extras/html/classmu_com-members.html index cf2a917..f5b551e 100644 --- a/extras/html/classmu_com-members.html +++ b/extras/html/classmu_com-members.html @@ -19,7 +19,7 @@
muCom -  1.1 +  2.0
The reliable, fast and easy way to exchange binary data via UART
@@ -62,31 +62,34 @@ linkVariable(uint8_t index, uint64_t *var) (defined in muComBase)muComBaseinline linkVariable(uint8_t index, int64_t *var) (defined in muComBase)muComBaseinline linkVariable(uint8_t index, float *var) (defined in muComBase)muComBaseinline - muCom(Stream &ser, uint8_t num_var, uint8_t num_func) (defined in muCom)muCom - muComBase(uint8_t num_var, uint8_t num_func)muComBase - read(uint8_t index, uint8_t *data, uint8_t cnt)muComBase - readByte(uint8_t index, uint8_t *data)muComBaseinline - readByte(uint8_t index, int8_t *data) (defined in muComBase)muComBaseinline - readByte(uint8_t index)muComBase - readFloat(uint8_t index, float *data)muComBaseinline - readFloat(uint8_t index)muComBase - readLong(uint8_t index, uint32_t *data)muComBaseinline - readLong(uint8_t index, int32_t *data) (defined in muComBase)muComBaseinline - readLong(uint8_t index)muComBase - readLongLong(uint8_t index, uint64_t *data)muComBaseinline - readLongLong(uint8_t index, int64_t *data) (defined in muComBase)muComBaseinline - readLongLong(uint8_t index)muComBase - readShort(uint8_t index, uint16_t *data)muComBaseinline - readShort(uint8_t index, int16_t *data) (defined in muComBase)muComBaseinline - readShort(uint8_t index)muComBase - setTimeout(int16_t timeout)muComBase - write(uint8_t index, uint8_t *data, uint8_t cnt)muComBaseinline - writeByte(uint8_t index, uint8_t data)muComBaseinline + linkVariable(uint8_t index, double *var) (defined in muComBase)muComBaseinline + muCom(UARTClass &ser, struct muCom_LinkedVariable_str *var_buf, uint8_t num_var, muComFunc *func_buf, uint8_t num_func) (defined in muCom)muCominline + muComBase(struct muCom_LinkedVariable_str *var_buf, uint8_t num_var, muComFunc *func_buf, uint8_t num_func)muComBase + read(uint8_t index, uint8_t *data, uint8_t cnt)muComBase + readByte(uint8_t index, uint8_t *data)muComBaseinline + readByte(uint8_t index, int8_t *data) (defined in muComBase)muComBaseinline + readByte(uint8_t index)muComBase + readDouble(uint8_t index, double *data)muComBaseinline + readDouble(uint8_t index)muComBase + readFloat(uint8_t index, float *data)muComBaseinline + readFloat(uint8_t index)muComBase + readLong(uint8_t index, uint32_t *data)muComBaseinline + readLong(uint8_t index, int32_t *data) (defined in muComBase)muComBaseinline + readLong(uint8_t index)muComBase + readLongLong(uint8_t index, uint64_t *data)muComBaseinline + readLongLong(uint8_t index, int64_t *data) (defined in muComBase)muComBaseinline + readLongLong(uint8_t index)muComBase + readShort(uint8_t index, uint16_t *data)muComBaseinline + readShort(uint8_t index, int16_t *data) (defined in muComBase)muComBaseinline + readShort(uint8_t index)muComBase + setTimeout(int16_t timeout)muComBase + write(uint8_t index, uint8_t *data, uint8_t cnt)muComBaseinline + writeByte(uint8_t index, uint8_t data)muComBaseinline + writeDouble(uint8_t index, double data)muComBaseinline writeFloat(uint8_t index, float data)muComBaseinline writeLong(uint8_t index, uint32_t data)muComBaseinline writeLongLong(uint8_t index, uint64_t data)muComBaseinline writeShort(uint8_t index, uint16_t data)muComBaseinline - ~muComBase(void)muComBase