Table of Contents
- 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 <binary> 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!");