From 5a2a351791d980964125b6cb04540de0ff44683c Mon Sep 17 00:00:00 2001 From: hak8or Date: Fri, 9 Mar 2018 23:50:21 -0500 Subject: [PATCH] Initial work on comparison --- Assembly_Comparison.PNG | Bin 0 -> 54491 bytes Performance.md | 166 ++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 3 files changed, 167 insertions(+) create mode 100644 Assembly_Comparison.PNG create mode 100644 Performance.md diff --git a/Assembly_Comparison.PNG b/Assembly_Comparison.PNG new file mode 100644 index 0000000000000000000000000000000000000000..de039d9c0d1c108bea4372096ac82bb5744b83e8 GIT binary patch literal 54491 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 S_(=u^1_n=8KbLh*2~7acv{K{% literal 0 HcmV?d00001 diff --git a/Performance.md b/Performance.md new file mode 100644 index 0000000..889e6fb --- /dev/null +++ b/Performance.md @@ -0,0 +1,166 @@ +# Performance + +Cppreg makes use of C++'s "zero overhead" [capabilities](https://www.youtube.com/watch?v=zBkNBP00wJE) in order to optimize away **all** the code that CppReg utilizes to enforce type safety, specifically the very template heavy code. Understandably most would question the validity of such a claim, so this is written as an attempt to prove that a register interface written with Cppreg is just as fast as the corresponding CMSIS based code written in C. + +## Test Setup + +For a test example, let's use an imaginary Cortex M0 based microcontroller with the intention of having the UART send out a small string and then toggle two LEDs (PIN1 and PIN3) after every full string transmission. Why imaginary? Because a real implimentation will be longer than most screens, but a real implimentation is provided at the end. An example will be written in C using CMSIS style, then in C++ using CPPReg, and a comparison of the assembly output of both using GCC-ARM with links to GodBolt so the examples can be fiddled with. + +### Example peripheral + +``` +# Imaginary super simple GPIO Peripheral +(GPIO_Base) GPIO Peripheral Base Address: 0xF0A03110 + # 16 bits wide (2 bit per pin) + # 00 = Input, 01 = Output, 10 = Reserved, 11 = Reserved + # Our LEDS are on PIN1 and PIN3 + GPIO Direction Register: GPIO_Base + 0x00 + + # 8 bits wide (1 bit per pin) + # 0 = Do not toggle, 1 = Toggle + GPIO Toggle Register: GPIO_Base + 0x02 + +# Imaginary super simple UART peripheral +(UART_Base) UART Peripheral Base Address: 0xF0A03120 + # 8 bits wide, write bytes to here to insert into the TX FIFO + UART TX FIFO Register: UART_Base + 0x00 + + # 8 bits wide, Status Register + # BIT 0 (Enable) = Set to enable UART, Clear to disable. + # BIT 1 .. 2 = Reserved0, read only + # Bit 3 (Sending) = Set to send, stays set till TX FIFO empty. + # BIT 4 .. 7 = Reserved1, read only + UART Status Register: UART_Base + 0x01 +``` + +## CMSIS Style + +This snippet is based on a CMSIS style code, which makes heavy use of preprocessor macros (the defines) and just maps a struct right onto memory. + +```c +#include + +// Structs to map onto memory for each peripheral. +#define __IO volatile +typedef struct { + __IO uint16_t DIRECTION; // Base + 0x00 + __IO uint8_t TOGGLE; // Base + 0x02 +} GPIO_TypeDef; +typedef struct { + __IO uint8_t TXFIFO; // Base + 0x00 + __IO uint8_t STATUS; // Base + 0x01 +} UART_TypeDef; + +// Memory address for the where peipherals sit. +#define PERIPH_BASE ((uint32_t)0xF0A03110) +#define GPIOA_BASE (PERIPH_BASE + 0x0000) +#define GPIO ((GPIO_TypeDef *) GPIOA_BASE) +#define UART_Base (PERIPH_BASE + 0x0010) +#define UART ((UART_TypeDef *) UART_Base) + +void Demo_CMSIS(){ + // Make only PIN1 and PIN3 to output with masking. + const uint16_t DIRECTION_PIN_MASK = (0b11u << (1 * 2)) | (0b11u << (3 * 2)); + GPIO->DIRECTION = (GPIO->DIRECTION & ~DIRECTION_PIN_MASK) | (1u << (1 * 2)) | (1u << (3 * 2)); + + // Enable the UART. + const uint8_t UART_STATUS_ENABLE = 0b0000'0001u; + UART->STATUS = UART->STATUS | UART_STATUS_ENABLE; + + // Loop over forever. + while(true){ + // Put a string into the FIFO. + // UART->TXFIFO = 'H'; + // UART->TXFIFO = 'i'; + + // Start sending out TX FIFO contents. + const uint8_t UART_STATUS_SENDING = 1u << 3; + // UART->STATUS = UART->STATUS | UART_STATUS_ENABLE | UART_STATUS_SENDING; + + // Wait till the UART is done. + while ((UART->STATUS & UART_STATUS_SENDING) != 0u) {} + } +} +``` + +## CPPReg style + +This is written to mimic the CMSIS example as close as possible. + +```c++ +#include "cppreg-all.h" + +struct GPIO { + static constexpr uintptr_t GPIO_Base = 0xF0A03110; + + struct Direction : cppreg::Register { + using PIN0 = cppreg::Field; + using PIN1 = cppreg::Field; + using PIN2 = cppreg::Field; + using PIN3 = cppreg::Field; + using PIN4 = cppreg::Field; + using PIN5 = cppreg::Field; + using PIN6 = cppreg::Field; + using PIN7 = cppreg::Field; + }; + + struct Toggle : cppreg::Register { + using PIN0 = cppreg::Field; + using PIN1 = cppreg::Field; + using PIN2 = cppreg::Field; + using PIN3 = cppreg::Field; + using PIN4 = cppreg::Field; + using PIN5 = cppreg::Field; + using PIN6 = cppreg::Field; + using PIN7 = cppreg::Field; + }; +}; + +struct UART { + static constexpr uintptr_t UART_Base = 0xF0A03120; + + struct TXFIFO : cppreg::Register { + using DATA = cppreg::Field; + }; + + struct STATUS : cppreg::Register { + using Enable = cppreg::Field; + using Reserved0 = cppreg::Field; + using Sending = cppreg::Field; + using Reserved1 = cppreg::Field; + }; +}; + +void Demo_CPPReg(void){ + // Make the pins be an output. + GPIO::Direction::merge_write(1) + .with(1).done(); + + // Enable the UART. + UART::STATUS::Enable::set(); + + // Loop over forever. + while(true){ + // Put a string into the FIFO. + UART::TXFIFO::DATA::write<'H'>(); + UART::TXFIFO::DATA::write<'i'>(); + + // Start sending out TX FIFO contents. + UART::STATUS::merge_write(1) + .with(1).done(); + + // Wait till the UART is done. + while(UART::STATUS::Sending::is_set()) {} + } +} +``` + +## Assembly results + +[This](https://godbolt.org/#z:OYLghAFBqd5TKALEBjA9gEwKYFFMCWALugE4A0BIEAViAIzkA2AhgHaioCkATAEK8%2B5AM7oArqVTYQAcgD0csGADUqAA5rS2YMqYEARqRakAngDouABgCCcgFR2r15XeUABAGYEm2ZX//qmtoAtCxMTGZITi7uLGJESGT%2BygByBBiswsoAwqxiAG7YemzKEGyoeYXFbsLYbJgmbNhmGAC2AJTRrm4YaiakBMBIRDnofQNDIzyW9JbB0/QAHMoAynUNTaOkambK1uHKE8NZWrWkhZgWNi5yTnc8AMwE5UxiOMpcD9mowkSEbERPrh7k8Xm9fJ9skQTGpsAB9IhGYjCIEg54VcEfL4eMTlIgEdBsMKomy8UEY96QvStZEk6xOBSqDRaYBwgAi2C8TWEkTRHnqnJyAAUhQAlXAAcTh2RF4qlbNwADEAJIpXArOEACRBOC5vhlYsl0tlRoVKrVGu1NiJrWwwjULCkTKCOi4AHYBNd/GJhM8dNZMJhTsIEVi2cpfpgQCAxM8iGpEQjPp7nN7fRxlAB1AiYBKhz7hyPR2MAxZJh4p5I%2Bv3KADyHg8tSI%2BYehb%2BxbjZcBFei/iI2FaalY/axUJhdRYtuUABU6clfqQxKgRtDYXDWixhABrD4e3vJPwYNi/bAAD00EaILHxqFUhN%2BM%2BU%2BTCYghrcvUZAbDEtoGqDh1K0l8s4PLg0YbqeECdD2Xp%2BO6bLJncboIaSjzrAQHhwaSNiMtYqBSMIwhCugeioOYUSoU8/K6sKhpStY2TZOqKxCrWAAyyrZAAmlqOqcs8%2BomvRjHMaxHHcbx1qTnaDpOoELK7pWfYDkO15vmOsI2r4ACy2nKrWCLkMoq4TlO05GdOygbtuRn1o22DNiM6ANk2c7%2BAuS4jKK2gECepDeSwmCKfuB5Hie56kJe17pHex4jPo6AkcovkIgM%2BQEGEYYhQe/gQNZO4FgWxnjuum5bpCIFgSAz6vNg7QfDwABsvCNaUzn2SMhXvpYYjQUpOX9oOw7qSZWnKAAqmGT7oDmbk5c8xS%2BL80W3pZWiBRA2U5bFD66fpCKuGFIytDS6Bwjg6VSOQW0DeOY1FiAE76D4cIYZCSgpYiBDpWERnjY4oHRiZU3fuECakDd21Qzl9VsOgZ5SAmwWwdDWhEBIJTLTecKoJu3bZJVUB2CdBLndgl0Qk1VllfVqKgco7VNn1kPwYhKPJINqkjpCo3SRNU35DNmBzQeC0CVFN6PutmCbez21Hcoe0GUQh33sdp1kxT11y7dml8w9T0vW9XyfWlGVMH9ANVcDRWg0w4OQ9DTvKLD8OnojnV7jrB5oxjEvpDjeMVUCEDExrF3pHVbOpjlrMwTHu4IfHHMqcNo681OSuGcVetmRZ1M2XWLkOaGjMOSLHnLso3nAL5/akJmAzc17CfJEdZ4XljMUKwlSWm995tZd7yR5WVWXviZpXbsHgPVS%2BdUNc1VMQGXnWtkVPXM97nNpzzd185NRWC7NoGQ2Lmxd7ex9BQA7k32Cy6321ZyrO3q6TEdXY7/iWTVr7a0/XWpklrtkekSZ68JjbZA%2BiGL6P0LYTStkDccIMxBg0RN/Z2ztXYI2wEjd0/VoZhw/uTSOU1L6B1%2BDPXAj8sEj2IWdT%2BlNWoAD98q0zdNkUoEA/7qUhAzYuRBaZU3YZgl20coZx0ISnIaal077ynIfd818RbJHPiAla00czKDvsQB%2BYiX6qzilZcOpCv7Dx/k%2BeeACsEZxAZ%2BQ2kCPCQn7vAy2QJkGwlQegiGFi6HQxwe7PBntpHbQYZrMhR954SO2lIkKcSUY7zkXvXOOk9LKyMnYmc%2Bd8q2UEaXQR%2BdeEV0RJ5auPk/KNz0dkNW7AQmQ3bhFf2t4e6JSYMlWBZtMqFT8aUfK49wyT3ytQ6MvDhFL1aivQRAzlCbxiQNVOySvhZKUeGFRp9vbqOaVo2%2B99aHO0MW/ExJCtZiKyQbcBRtnFfBgalAev1EEeJADbd8dsHa9P8TDZQcNcH4Jblg8JTDyFXmxrjKhwEQ5iPoSTRhZjmHKDYTTXcXCoC8NHPw1e4yC5bk6L0regDE7zIPEk7myyFG%2BFWTs1R/gtmXx2TovZBj0kHSOTCiJ5iCUc3JR%2BaMjjXrXOyK4827jZ4vPDG8jBHzPku2%2BW7D2yNOX%2BEBXCgW0Tk6xOQkShJCdK4jGlnCQkTATAKqhiSka3KX6ZO5eZR8uSi4dQKR1alfhaUgpimtbAG0FaHIVmyphgT5UELEb7UgJQa512wP5T1wsviWuydioyq8nnSzyqYim%2BLJGavVXBLNhDdWHGjXCXRI4QAFsCgatgRqTXbTNfI1JitmVECtfWm1lk7V2SbI61yGyCWus0dfBleiIA%2BrVsc2FpypXSoCKO3%2B88A3BOrU7cNlT76QjjTau1SbZ7Fofn6uFRkxlEuSNq01izSUaWAQ2/aTac6XtbQm%2B1nanKFMfMUntUM%2B2SwHTu4djajEPj3em2Vvz6m9OXfXKp/YalxTqWuxtFkjKbpfW%2B4EvTow/sA5HDNGqk6hL8LWlJl641ZPvcM9921P0xQHU2X917/3v3HVhyGPygl/LwwecDkbIPYGg8tAEcHr0IYfT1RDZVnUHnQ3szDUhsOx1zZDAjZL63EetTksT5H5qVvFnSgdFRPWkFo8rejY72VR29ixwN/znacYbvfXjV5%2BOxvg/Gu1ImEVkdQ4qvwkmh3Sajtmg8J6a1nvNcp5zJG1PTw06LLTF83VXyFsZdAwBgA%2BEMyy31aamPmblQuoNvTlUU2BStSh%2BNCahz87TAArLgbFsnAvyZRkFvw%2Bad0VqrflglimL1jRUy2yLW48kOufU66LajYsaK/Yln9I7jF%2BZsVOz5CtZ21XnWxsRNnuMCYyfGoZ6mCZPN4UZHqTyf1Qv8PN7haLIQYsEVi0Rk7FtPelfV49jWushbrUR8LqnbVlSG0%2BgRHUilqs8x%2Bib2zv17NmwBrLMngOsdA158ptcV3VNqY57I52/DrubfCMjB3Z5HdmWIIyqL57oq%2BEDpmi86vY8W%2BJ5IPn%2ByppOUxgLb3cPxPe6zSi6FMIfGwrYOQM4kREB5BRekjwMICkwgaOUcJpyimsMqaclo%2BJ6logrpXKu1eSWsFpe0jpfDyW0Iu4yn3ITZlzEgUMKwCAAC9sAlMXFXGz05xxEu60CS8ruvIVPrh72EkJFhiB9wQ5Q1YMxip5TGTs5Y%2BCEoC97%2Bm%2Bb3ee6%2BPQRqYf6YR6jzoGPD0SxECzwnpPhCU%2B1bTwHyNQfndfAeDwHPtW8/pgLygoqRe4yN7L9q3nUuHj86wvSHCIvayFFIB4Jg6Ab68kojLmi8ujS1gAGq4FFIqNitZMz67JLqcWS%2BpSr/X5v7f%2BvDeyRN8yM3nWL/G%2BSgCSNRImBZE6zIrmfDvbW7zCMTMC2gFjTp7B5fCZhPLAxHYKbcpAH17ZCgGiooKASAhNbRb5qoBIDYCoBbgGoT5T4z7m5Vht4FrCBoJrwoRdbcoPRxjaBGBMA4wY74y9wILXZfBFSIFgEZ6EJ96aqkjcED5D6C4j7C6KxlRz4D4L6CiH5wjaTWArAADSu%2Bjw%2B%2Bmwkh0hch5%2B0kRuck1%2BroVm%2BGluSmRGZU5YYO06cUHckU2kRhx0LAW4%2BOZUEACs3%2BtuIwN8OYCQa2SOUMIaJQrhNuMylgWIio2OJ2j2TsIA2OFCYK%2BMlh24xh%2ByU6o8thU85UsaVhIcThCIEAvhCQygwQyg9A7QtMLBVOBRyK%2BR2O9WzWFusi56WSMRWB3YJhh4as5hwhsR1hSRwgSAGE/YmAyRDho6GRLhbhSA/%2Bz20qCsHaJcI2NOFmeWuhPsDkfskRQcqR7RIcG4SRBO9RcR2RSARRWOVOmKWqPOvBZI/Bdwo%2BqwSAgUM%2BK%2B88ohZI4hcuQkcIKwmo1gbI2%2BK%2B1gbE40uAChDwShgkdEbxHxXxmYPxfxAJVoBuGhl%2BzoCkb%2BykNRoWl6NmRkjBE0tQKwNxmAM%2BLuZSuJtxN8%2BBph4Unc8WRyWJPo8IXRJJU0HgYQtQJxXOiS%2BhPWfMNmhJVcxJ%2BJN8kIGJxki49eLeCx84VJWSNmnivgb67GjSlJmirSSUtJcI9J/JU0pS9enB727%2Bu8BhgBNeEM0WUpRpMp1xJJgpRpmSIph2FOPSBK0pIApw5cyeHJppqO9cIsCpkUyp7SfJBJXwQpWpTyqp6pgZKY/e5x9QGEw%2BDIIu2kkawA2A3Gjx0u1EEhrx2k6%2BEouAmYooquMJGuB%2BWZOZeZBZ04RZUktomhV%2BLo5u3u28UB1pkB9aTpwMuSkMUxjk1ODkYxXKbZZpzyKCxSyBtWFQm4WQiZpAyZ3GCIQ05uagYgz06Q4R3s%2Beyg%2Bgm48IMeHpEapAMpRKmg30aka5BKFCk5kaRAEASgTp4ZN8xYtQapeJM%2B/ZU6vAPAv4yZg6I4vksqIwLAz43gLAECygHgSQ95VitUBanpkaH5r25J/YTSdKPc25CIKCcIjoqAP4aCakfRzBZBWC5O0FN2Rxd2tOoiHOiFrRKFo6W5T5wMdBrQ%2BgAkfR/SRUZG7G05s59885Q4UEwUup/gS5K5qAZ54Oi02y3FKZvFRAC5mxD8HhikBa6MoagluG5ekM0lc5cl/F3qSZMleifFTALURR4YOAPg/YR6/g2lslQ0LUDMsIRgJAxpbIAxxitlRlulJlTUZlygFlDk2pWlBlOl9lVMYwka14ZABYw6IVdlQ4LUplU0AVVlVFOOcVXlC5EVzl0VrYsVM5hl/YxlflKVQV3snlRV3l%2BVPFmVCVTUSVRUpV1lLqEOA6%2BJTQAlCsiVVMcx62vSe5fk0YMODGpmQ8yOyQTppAN864A4cIagM0j%2BBmCFOUm2dm9BN2j2A19cQ18G9OW1kaMpb5TsTFLFTQbF/29OIm9OmF%2BEOFw0%2BF0SoR0qp2UmcO/m7GVRepSyWO/V3KioR1B49FO5KCTQ01EBv1LaU0FVO59lLBj2GJ9OEAJ1rFyRZRio4ENMANUMV1j2SNWFd1eFcI12VMLC6NIA7CZRUAoNRN9pxRXCZNmKi89O4x/iZND241LNgWY2/g4m6irZl6FyIFVyG1yOEAVBoazJ0YaBGBWB6AOB0%2BApcNHNfgd5ju2ARk1NxOEAbNY8dMtWDNd2zN4xyadoJBoyc6WNP8RtdC7Bwe9V9V3srhCQnVo63VrUvVnhzs3hserQctD804GNthUEy1mlTWQlehqJ6KTZg5sFFA/Nhpsd5pwyY5IUE5hEisGVzchCIlpE4l20G5QN6FXiRU%2B1B5w5wB2daUp5DSLRyFVJqFDFGFbQp12A5124U0nFIUOdq5NdZhddmi0N1MQdDdwNXiYyCOlm7GyQ3t0NPCc6zVodBKs90NbtVkN8HhkMpaN12FrQuFvRNNtUeUs%2B29BN%2B949Qa4dB4s9%2BlBVW2vlyVRQgVC9K94VTlUVrl7lu0mdzu99jVj9qVXF39Dl2V79MVL9EyJV/9ZVvarViW7VilRyq9HtZJABXJQ5w1JmQKDp0qk101torQc1C19cUEC9E1RpW2St0qpdO1gm9OhdJkltOUyNZ1yRjDB4IRytTsL1vmb1RkJ9u991B9r4Idn1KJH%2BX2Y0QR3NLVklK9QZ1pygzDrdqN7o9NGNUWtWTtkuRFI9Rdspc6TNPVuWfVyOF5hEV5EAlBIYwg0kItnNNaf10YDoWgAIcILI%2B5bDi23JT1z2dptUnjNtPAPAXgRQQUf5cMIwHgpA6ArQxk6BEYfM7jfkD%2BVkBlRaq6QTIdyQZN81pEJgQMn2O6djny9D44ATfgpTsI5TygOtNk9OBtTqPjDOoEm0TU/De9yjxOh6aVixqlbA9OD0vthQ8RU6cj2QQpSNzdKN7FnCNT6jOKjOzsgdD87Tgjh6TTB4Ijl9x5z4/YedOUZjZw15t5Q595j5dJL5N81TscQTX5vgO6HS/5yggFLAwFoF4FkUkFaKSTXpmTC9PpGdt9ey9UW9%2BNAjhNvCEAm86l/ztdF419dFaF4BILijYLHTD1h9%2BQHCAgl9yQlTvgqzELaqOpbJ9IZxaEMZAulxQhNmaZVEsuWuRocoyoKwlZoogJwJjLUozLrL6%2B6hNZCJpuOhFeHJkMAYQYdosCKO4rwYANQxKOThANpddeVpwAThttvg3kTY9xJF3Up4lgANWJ40OJlzjJzJzuKdKM1esdKDkehBu5zZsdKr8jarIxGrC9G5L8AsJE0UPgt6sLfdipksCsMrkroYhdgUEr6dRUNcobhEAbFJnz9dgxIxoYvoTuU0Nc6rPTALtFxiwMLppB5S2rxLkMG5kFRUAZit4zCjxr2AVbdM7GdKhyU1M1BD814tAlyJTs3tWg4tQQzYUR22GWasIcEbgYwYWzpLUMebu0f6hwZ0%2BDhDnb2LwaSxalfbi1A7pWkI3q87R0Y7aFkbk7C9ojEd4jhGkjvNEOzbQDBpfMOTxgdQzYPzkaRktTKRTRB4dz6TQ6CsWSZN4BBjyD3bqM67/Tj2YzAHTjT7rjr7FAcz5N6mX7WCyzUAc9urhxajIAjNDlH7hRp7uLYj%2BpP1yOAHbDQH/jZy1qUN39xlxT/i0HIAzjz7bjLZj2H71TDTTY1To5nD9j4m17kll88d%2BsoCfKUCYi4tz%2BwgUt6BmB2BkauB1bAzatB61ipQH7WIwI9M3HDkuK/Hvjs8pwZtc8VHvSs4GzXD8BdtEykMP7P6SloHXh4HPtftEAAdSHQdBHPTZ7zSmF5jpA15WbIxygSgG8pO1tPNQTShNYLAKO%2B5t6AiOioXPUjzETzz4QM%2Brd8FrJ0cUZFLhAVLQujIioBAoTdLzxXLcIPLbLKouAbEbIHL/EyhrxtXJ%2ByoDXTXsJd%2BWh9ZoHjZ5B9afA25CNX%2BqbIwZXoTirXZ%2BSk35XTAmA3ZSr3KeEBEREJE6QJg8SKBpSVcU3i3trG5LHcHRpU0I3tQ3JPTG5Dr9aJ3L7Q5JkHrhBXrJd3K93bHidIAL8z3NYuTW3U0a3krxEeTCbSFQb3cKbNuoYexU0B3mA2b8pcLSbSpo63ZXaDkcPC3S3giYPNFyb%2BbKC7F74Clz5PRyjBOT3LTex1z9jdPvZQieP/dwbdFbSygNx1jpr2DzsH38H0YZzMYT595C93WlHr44mqB8nst8teBzn8syP2yfpRBJBY10q0nktaAUvink%2BCtDHU6vPpzanUX4Nhnfgo87detDPBn9PnyJtxBTARA5ttUhH07FGN7kpKCKaTn4p203t/3ZEBTkd0sw7N6DDD6W6NC9OBvX30Tbby7i1JDVnNvT2U7Iv7pNHb3wBKHNK7v/aQskMP6/7FB4nlyTi70YAHPz5JJFkGrUFwjzGxjntTs/v%2BTzyhTq6Tmgmt6omhcEfIzWC0f%2B50YrbS7HbCf7QvHj1pvyfnyqfPTovGfE8Ge2fMj2mVJKijteyRf9agtEC/KkIlf95NfNn%2Bjq2DfIGtrZDsdFDF6eOPfg2DPiz3mIAZ2TUg/g1IAAvXT89PTyQLfgf4jIpp3x2xh89sUWC9H43/gk5IUj2d/ttWdJ4NZqY/YhhPyj6wcHuX3L/lPxn44Cp0c/djAvzHoacSM3rE%2BCvwfzCd4sonKcLv2FqUNnYSgQ/pczERu0xE0tBTn7R16BlsgKGYfqbQd5sNLO0/Z2O6035DpveU9YSptwD5t9I6QA7IH1nVrh9kMoOfvjz3QGfch%2BCAuPsgMjSJ9hBuAvAS7zT6R1CMdfJQSQKPj59pGFAtfitGoH2JeUpfffvQKdhMDLSvSVgb0nYHS8lOuvL4LwOdL8Cm0YiIQbgNEEEpHOE9eYpIL8A/pumH1Ijqvzix59tENGCQWIn/6yCP8YibtAoJ%2BxVNsUIcOAQdW0Gj8iGegnzokNd6aZKBqQoKHpmMACUQOPvHKFkLNRsCfAxgEPnfyKEtMShZdEfkgIqFLV8BZ8XPlNm0QkAUsaWDIb0naEhYzkyWVLDAUUH39ihGgvnmUOGErsxhmyCYTFCxIpR0h0Qkxlgm9ra1sefAjaGZSKjm8Cop8emJij2EwM6hksI4SGEaFLVThTfMDn0005XCghNw/wr1GME9NDmFjAYfzzVracioNPKLnBCCYhNDusPP8qwAKqRQEg7AZQPdxgqJd02P9HgCHQhFBcIAUIz/jCLpjhhYeggBnrT2PRBNV4DURPKiKyDojkymIm4iUFxHwcIwatXLuCPiwBcjmlw6bqF3C7dRIuVnD8rFwzDxd4eSXZyClz8Jpdwm6AACllxvg5c/mAWLgmQWjJFc4yNgfNBKCFD6Rzcs7cHpFGLzgxQwpo/aBdzfDhhLAp4RUDYEsAPB6AswfLlaz24jA2QBALQMuAJAlBS0QraMFd2yD2iDIjo5kbMn1YGt8i2ecPK0LtY1gzRKQAIkVHDEgB4ekIAMUGPxCEgjITeY7DEB4BGQcx%2BqIATp3YwbkMx9AKaDmLzFfACxGBIsWwBLGk58i5YysdoWuF9Eaxv3DMBmJ4BNj%2BxuY7HvmMDHtiQxXYksb2MRLaABxv7VKrWLLaEEMxDwccS6GjAtjsgbY4McWOUCljlA241wBWKXGgAgRg4jvuuPXKbjVQAAFh3Esg9xU41sTOKPGdiTx3Yl8ReL7G7ibxq40UsOJ0AZiqsr45cZONCbTjCxc438UZEgkASrxK4ocdd0fEpBWo2YicfuMPEdj5xygVqChKrGFp0JdYzCW6CgnXi8JX4giYhOUBUSSJE46sXeLy7xwQo%2BaacMsL9ZhiJxkY6MXCFjG0iXRlgS8aHhTEUT0xqoLMe%2BGbEfiDxdEhCfQG7GJjSJ5aQ1Nt0eFSSRxqoRsThKAm0T4Jx4lSUZEYCoTgJmkxthuOkkpAxxBkt8TBMW5wTZxJk7sZePUl9ErJ2kmybpJSDbiHJ0Eoya5J/GmSzxgExyfqm8n3iCU9Y58dRPfGwTPxxk0Kd2IeARToJUUytFpJilQw4pKQSCYFJokKT8JyktKRlOvFZSjU1kh8bZOwlyTcJJUpSW5KMjpSLJVUnKWBOUAZiqJRUxKc5OSkhSzJ5U9qYWminsTIyPOY0X6ImjWBRQlkUDpaNaI2jEwIwcaHNOnBCTtyU0F0W6OsAej6A0wH0TqhmnTgAAGiqEVC1hlAfEoCZGPWnzStptQOMaJMTESTc8qYjcmyGsDThnAfUpyTGgJgXTlQV0oyKHjLHMSgJbWcabqKmknS/cqwX6dOHGgrAbpFk%2B6RtKemUxE8ok8ye9LFI6SdAuAUvglIBmQhWWP0lGcNOOwVS0JbEjCTWC1aRoLgsk8MPJKSnZAKZyMlYIRPMmeT2snUhmRmDWAxkMw/0/cVzKpn5ERp/M8ib5J0BMzzgrdfSQ1MMkKTJZPM5QE%2BL/G0zgJcssOqSz7w2AB0HIX2saDFDaAeEQsToAsUZCWFbCcTXwGoGeBZB9AvgbEeIHjDxArgCcaMdGFKmEhwIaTeQX7JAABy2A0YBsSHAKJmAtGkIUOeHMjmqgHg0c9oGYHgYkMOJKMRkMTKFq%2BAEgFKDaT7OSAPTPOGs6MLnIgT88HImcyMtnJFxsREoagBmBPjApkByYkaYuf4BvjdE0sWpG2exkZBCh4gzzX3DWDjDoBHZNTEGbWC7k5RS50Yc6ZdNrD%2Byfp1gZnDATAAyBNQW8kOCHQXkgAl5M81eb9I3nvQZABAXeS03xSQxGQKwK8EFwjDoQMwnsmcGdOnlXTYo/YAEDyFvki5pYDMbKWBWx5ZAn2qgLoVoEwBGRRAo8vgJxAfy6oQxf8x5pG1bpGR0C5QfOd0SyD4k7QAIamEQDQJtRNgLsv0SGJQWBhW6acyGAfPLnk1g5HfbILQqRkoyK5pfVObHOIBRAvgzCymSsGjAiz/gwADhRnJvnexGQmYV5iuG8DtIC5s0%2BaY83gZzyDwPc7wA/F4XcyBFz868ccJrmFEYWBspCGQRkAT8mAsgKrDIHIARyZAlgSxegFkBY5%2BAtI0QBICdBkh6Alix3jYpMUT8twIAKrJYDMBPi3QiwN0G6EagLBPRAATiqyxLmAsgJ8ZYtaD%2BKDW1i2xeQHsUyBLFsnA1l4tsUT84AsAFABgBwD4BiAZASgNQDoAVjWAHANAIIEEAiBxAkgaQDICeJghKQXwSMHGF5A9p4yqwP0VkBIDUxm5hIYZfgzIDGoPmygT1EQqcoEA1A6BGgj7L3wtcCWcIc0YLGHBqKnAJkGiPmlA5wgNl104vKXn9HKhxQBMfSCkGTDKBGQwk/gPGMsCWAQoRy80cXi7AzhawEoCUGxFrHJB7l20kSfqx4BGLlAgkuvByGuQpg9lgoA5QsTeUnL48IwI%2BVdNuV3KRcDynGQmNeXHLI8yKxGXwvRWArnpwKmYGCtLmK5xwUK46XbIHCTLnmE7SVm3M5H3MllTs7AAsqWXMk%2BRRAFZYoTWXdT18yoIUJqCEkyFasUAYvD3iES7T3Rno2YAZ1WWa5ox1gcVSsElVChhVoq9VS3keWvTnlSqgVSqrNHXSoAEK6lYKDsD1RVVuqo1UCUFWUrYxEALVQWR1V8AJVL0hMYquLKbBS53CSlZCqtX1QnV25JVcbMSymyzoCglYCyxIa2yEyNhXwJpO6l6Tnm9QVNf5KSwMx4gS5YYjkXyh%2BhlFCsU5Y1FDBsgLluAK5bWBSBwgMxUhGQrISmhQt9AXosQJThRSNiLx%2Bi1RqUEsCtqVJHa0oOeJPFVDso0Y4IECArWXLpw1y5tROqnWVrq1KQWnCwmnVVrZ1NautaqAbVyEOEna9taRU7Xlie1szCAIOqPXDqT1YihODnJJlyLS5xa0dB8tDCUqNZcIXACkGsB8A/lO0/QM8ueVbyANKkolKXMnWgQNZU0MDUCEg29q31LCjUJ%2Bu/V/LjpAKhuU3JbmRoWVHc0gMotUV9yRSA85BcPIApjyMwE8qecvOUUlyNp4G3AKiuulFQt5O8tpT02g2gQGNU0LeZfNY11yCUd8h%2BSMFqCiydAr886R/OulHhv54uajYhXxWlhX1mM99RqpSAVqUgEoKaBerppniF67G9UAhqg20aYNBmuDUpoQ0fqv1P6sUlwng18K3in6tTRKFQ3bQJFUi4yDIqnn%2Bq/ySigvr3N8BQA9NsGqmLZu5n2bVNqoCUPVAlHOjeoBihOFGV4ImL4lMgCxVYtkDpLMljigQI8pcUtKGojeTxelp8XkB0CgUA6lBGS2JLyAySgJWlu8UZLZA2SkALkqK2FFyAfip8U%2BLMAPBLAboSwFVkWA8B6AboJ8fQAeBugalsgB4JYrSV2LGt5APJUlsKUIB4AEAYpTE2dk%2BAKAVAAYoODUUHljArQN0LMHIBeAHekaWThAH0BFbyAp1YwPkxkAeLyAbQW0ACFrDZSbtOADcBwB8CfalJhQWTvVrPAYF4grSp7VQTMX1avoyS7xaYvYCcAGl/AZgAYFk6QAJ%2BYwDsYDuCC1gsgwQVoAkB/D6BslzSqQAwFMXmKZtN2zJXNO0jKBgA%2BERiWYB4BmBGxZQQkAvAgBlKXK%2BW8yTUj21baed9ULLYIEK2w6J%2BpWnAAeQq0daolZgKrENqCbjaoliwRqIsEsBPiqslWpJSkrq0Zb5tOShba1vIDLa1taADbftsqW7bNtB1Q7cdoNZnb64l267fVru2mBZAT2l7c%2B3e1GpPtA4eHb9vq2EB4JAOm7cDuwp7NHtliiHTduh1G7alCOpxUjr0D6BUdFWjHSGKx047ci%2BOpAITuJ2uLpARI5Laltm0NaZANOunQzrdBM6WdpQOGE0Hqic7CA3OskJeL53W7IoreoXYjr4Ci78l4u6NOVvJ0yAqtNW1JVTv13NbDdYu9rSAB4DV7GoT4sSc8rdAPBGoVWJ8TwEG1uhkt023XXNqyXT78lxuxAKbqK4eBLdTAJALJ0YCkBr9c%2B4fSXon0yAAxDYPYKKFp307bw1e5nazvr0Lx8gWQCvV/sZ2/6697O9oH3uK1%2BKt9ZgfrfPtG3q7Go6uh4MEsm0j7Kd9WzJU1pa0z7IdPATA3rsP2La2tE%2BX0IHKfFAA%3D%3D%3D) is how GodBolt compares the CMSIS and CPPReg versions. Looking at the assembly, it's pretty darn close! + +![Assembly Comparison](Assembly_Comparison.PNG) + +## Full working example + +Lets say we are using a Cortex M0 based microcontroller like the [CY8C4013SXI-400](https://www.digikey.com/product-detail/en/cypress-semiconductor-corp/CY8C4013SXI-400/CY8C4013SXI-400-ND/4842995), the smallest ARM based microcontroller avaliable on Digikey at $1.32 in single unity quantities. It has a meager 8 kB of flash, 2kB of RAM, and runs at 16 Mhz. \ No newline at end of file diff --git a/README.md b/README.md index ce6a0e2..30aee34 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ Copyright Sendyne Corp., 2010-2018. All rights reserved ([LICENSE](LICENSE)). * expressive syntax which shows the intent of the code when dealing with registers and fields, * efficiency and performance on par with traditional C implementations (*e.g.*, CMSIS C code) when *at least some compiler optimizations* are enabled, +* [huge emphasis](Performance.md) on ensuring the assembly is the same if not better than CMSIS versions, * field access policies (*e.g.*, read-only vs read-write) detect ill-defined access at compile-time, * compile-time detection of overflow, * easily extendable to support, for example, mock-up.