* En funktion eller klass - only one responsibility * Alltid enhet i variabelnamn ==== Inom klasser ==== s_ static variabel m_ modul variabel ==== Globala variabler ==== g_ ==== Referens - r för referens ==== rVal1 ==== Objekt ==== oObj1 ==== Pekare ==== pPoint1 ==== Klasser ==== IClass För Interface ==== Includes - dependency order ==== Inkludera lokala filer först Subfoldrar samma projekt Andra projekt System includes ==== RAII - googla ==== ==== lock_guard ==== std::lock_guard< std::recursive_mutex > oLock( g_InterruptCounter_mutex ); ==== Compile static pthread program ==== Need to use -Wl,--whole-archive -lpthread -Wl,--no-whole-archive See http://sourceware.org/ml/libc-alpha/2007-10/msg00005.html Also see this for reasons not to do it: http://stackoverflow.com/questions/10390584/force-gcc-to-static-link-e-g-pthreads-and-not-dynamic-link ==== Fix for boost asio on RPi ==== https://svn.boost.org/trac/boost/ticket/7140 28c28 < #elif defined(__GNUC__) && defined(__arm__) --- > #elif defined(__GNUC__) && defined(__arm__) && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) 57c57 < #elif defined(__GNUC__) && defined(__arm__) --- > #elif defined(__GNUC__) && defined(__arm__) && !defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) ===== Suggestions to names ===== ^ Name ^ Description ^ | Aggregator | An object that aggregates data or functionality | | Builder | Builds things. For example and object that takes a binary stream and creates an object. | | Command | Usually used in protocols to encapsulate a command. Basically a function name and data parameters. | | Container | A place to store things, usually data objects. Note the difference to Pool, which is a place to store things not in use. | | Converter | An object that converts data or other objects. | | Data | A pure data object (must not contain any functionality, except simple getters and setters if needed). | | Factory | An object that creates other objects. | | Node | A node object, usually in a Tree. | | Parser | An object that parses something. A builder will most likely use a parser. | | Policy | An object that will change the behavior of another object. | | Pool | A pool of things. A place to store them when not in use. Note the difference to Contain, which is a place to store data objects. | | Reader | An objects that reads things, usually from storage and that a Writer object has written before. | | State | An object that keeps a state for something | | Supervisor | An object that monitors other objects. | | Synchronizer | An objects that has the responsibility of keeping different parts of the system synchronized. | | Writer | An object that writes things to storage, usually. | ==== Bad names ==== ^ Name ^ Description ^ | Base | Example, CommandBase. Just use Command instead | | Handler | Same as Manager, too generic | | Manager | Too generic, probably bad coding. | | Object | Everything is objects... so what does this mean? | ==== Under Review ==== ^ Name ^ Description ^ | Listener | | | Processor | An object that processes something. An example might be a UserLoginProcessor. | | Event | Function that will receive a call, this should be used for when you have multiple targets | | Callback | Function that will receive a call, used for single target, usually in inheritance | ==== Reference ==== http://c2.com/cgi/wiki?DontNameClassesObjectManagerHandlerOrData http://www.bright-green.com/blog/2003_02_25/naming_java_classes_without_a.html http://stackoverflow.com/questions/1866794/naming-classes-how-to-avoid-calling-everything-a-whatevermanager http://stackoverflow.com/questions/1194403/what-names-do-you-find-yourself-prepending-appending-to-classes-regularly http://stackoverflow.com/questions/38019/whats-the-best-approach-to-naming-classes Book that came up as suggestion to read in several discussions: Patterns of Enterprise Application Architecture ==== Linux perf tools ==== Use -fno-omit-framepointer to get callgraph with optimized builds g++ ... -O2 -fno-omit-framepointer perf record -g perf report -g perf report -g 'graph,0.5,caller' Defeat optimizer.. http://www.youtube.com/watch?v=nXaxk27zwlk static void esacpe( void* p ) { asm volatile( "" : : "g"(p) : "memory" ); } static void clobber() { asm volatise( "" : : : "memory" ); } static void bench_reserve( benchmark::State &state ) { while( state.KeepRunning() ) { std::vector< int > v; v.reserve( 1 ); escape( v.data() ); } } static void bench_push_back( benchmark::State &state ) { while( state.KeepRunning() ) { std::vector< int > v; v.reserve( 1 ); escape( v.data() ); v.push_back( 42 ); clobber(); } } Det finns en prescale counter också som kan sänka hastigheten på timern. Kan du se vad T0PC är satt till? Om allt är vettigt konfigurerat kan man nog garantera att man inte missar en tick. Här kommer mer info som jag sammanställt från manual/datasheet. Kan skicka om sen när du är vi datorn. CCLK - processor clock - assuming 60MHz APB - peripheral bus divider - defaults to 1/4 of CCLK - 15MHz PCLK - peripheral clock - 15MHz T0PC - T0 prescale counter - ticks with PCLK speed T0PR - T0 prescale register - T0PC counts to this value then resets to 0 T0TC - ticks every time prescale counter T0PC equals T0PR, so if T0PR is 4 T0TC ticks with 1/4 speed of PCLK ==== Adding comments to ASM code from C/C++ ==== #define ASM_CMT(str) asm volatile("# @@@ " str) //In code. Outputs "# @@@ Hi, I'm here!" in the generated asm ASM_CMT("Hi, I'm here!");