AVR
Atmelã®AVRãã€ã¯ãã³ã³ãããŒã©ãŒã¯éçºè ã«éŠŽæã¿ããããã»ãšãã©å°å ¥ããå¿ èŠã¯ãããŸããã ãããã®ããã€ã¹ã¯ä¿®æ£ãããããŒããŒãã¢ãŒããã¯ãã£ã䜿çšããäœæ¶è²»é»åã§é©åãªããã©ãŒãã³ã¹ãçºæ®ããŸãã ã©ããããAVRã®çŸåšã®äººæ°ã¯äž»ã«Arduinoãããžã§ã¯ãã«ãããã®ã ãšèšã£ãŠãéèšã§ã¯ãªãããã§ãã
Arduino
Arduinoã¯ããããã¿ã€ãã³ã°çšã®ãªãŒãã³ãã©ãããã©ãŒã ã§ãã çŸåšãããŸããŸãªArduinoããŒããšãªãã·ã§ã³ãè±å¯ã«çšæãããŠããŸãã Cããã°ã©ãã³ã°èšèªã®åŠç¿ãããããµãã»ãããšãäžçäžã®æ奜家ã«ãã£ãŠäœæãããè±å¯ãªã©ã€ãã©ãªã»ããã«ãããã»ãŒç¡å¶éã®æ°ã®ã¿ã¹ã¯ã解決ããã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã ããã°ã©ãã³ã°ã®ããã§ãåå¿è ã§ããã¢ã€ãã¢ããã°ãããã¹ãããããå°æ¥ã®ããã€ã¹ã®ãããã¿ã€ããæçæéã§äœæãããã§ããŸãã ãã ããå®éã®ãããžã§ã¯ãã«ArduinoãœãããŠã§ã¢ã䜿çšããããšã¯ã»ãšãã©ãããŸããã äž»ãªçç±ã¯ãçµæã®ã³ãŒãã®éå¹çæ§ã§ã[8]ã ArduinoããŒã«ã®æ±çšæ§ãšã·ã³ãã«ãã«å¯ŸããèŠæã¯ãAVRãã€ã¯ãã³ã³ãããŒã©ãŒã®å¯èœæ§ããã®ããã©ãŒãã³ã¹ãããã³äžŠååŠçã®èªç¶ãªå¯èœæ§ãååã«æŽ»çšããããšãå¯èœã«ããŸããã
ãã¡ãŒã ãŠã§ã¢éçºã¢ãããŒã
ãªãŒã«ãã¹ã¯ãŒã«
å€ãåŠæ ¡ã®ä»£è¡šè ã¯ããœãããŠã§ã¢ãšãââãŒããŠã§ã¢ã®äž¡æ¹ã®å°é家ã§ãã ãããã®ããŒã«ã¯Cèšèªãšã¢ã»ã³ãã©ãŒã§ãã 圌ãã®äž»ãªç®æšã¯ãåãã€ããããã¹ãŠãçµãåºããŠãæå°éã®ã¡ã¢ãªäœ¿çšéãšé»åæ¶è²»ã§æ倧éã®ã³ãŒãããã©ãŒãã³ã¹ãéæããããšã§ãã åæã«ã圌ããäœæããã³ãŒãã¯å¿ ãããç解ãããããšã¯éãããã³ãŒãã®ãããªããµããŒããšéçºãéåžžã«è€éã«ããå¯èœæ§ããããŸãã
æ°æ ¡
ãªããžã§ã¯ãã®æ代ã«è²ã£ã人ã ã¯ããã¹ãŠã®ãšã³ãã£ãã£ã§ãªããžã§ã¯ããèŠãåŸåããããŸãã ã¯ã©ã¹ã¯åå©çšå¯èœãªã³ãŒãã®çŽ æŽãããäŸã§ãã ã¯ã©ã¹ã®äœ¿çšã«ãããéçºè ã¯ã³ãŒãæ§é ãæ¹åããã³ã³ããŒãã³ãéã§è²¬ä»»ãæ éã«åæ£ã§ããŸãã é©åã«èšè¿°ããããªããžã§ã¯ãæåã³ãŒãã¯ãç解ãšä¿å®ãç°¡åã§ãã C ++ã䜿çšããŠèšè¿°ãããã³ãŒãã®æ¬ ç¹ã¯ãå€ãã®å Žåããã®ããã©ãŒãã³ã¹ã§ãã èšèªã®ãªããžã§ã¯ãæåæ©èœã¯ééããªãå©ç¹ã§ãããå€ãã®å Žåãè²»çšãããããŸãã ã¡ãœããã®èªåçæãäžæãªããžã§ã¯ãã®æé»çãªäœæã«ãããçµæã®ã³ãŒãã®
C ++ãã³ãã¬ãŒã
C ++ã®é·æã®1ã€ã¯ãã³ãã¬ãŒããšã³ãžã³ã§ãã äž»ãªã¢ã€ãã¢ã¯ã䜿çšãããšã³ãã£ãã£ãæ瀺çã«æå®ããã«ãã³ãŒãã®åäœãäžè¬åããŠå®çŸ©ã§ããããšã§ãã ãã³ãã¬ãŒãã䜿çšããæãããªäŸã¯ãæšæºãã³ãã¬ãŒãã©ã€ãã©ãªã§ãã STLã¯ãã³ã³ãããã¢ã«ãŽãªãºã ãå埩åãšãã3ã€ã®äž»èŠãªãšã³ãã£ãã£ã¿ã€ããæäŸããŸãã æ±çšã³ã³ããã䜿çšãããšã䜿çšæã«å¿ èŠãªã¿ã€ãã®ä¿åããŒã¿ãæå®ã§ããŸãã ã¢ã«ãŽãªãºã ã¯ã³ã³ããã«ã€ããŠäœãç¥ããŸããã ã¢ã«ãŽãªãºã ãšã³ã³ãããŒã¯ãã€ãã¬ãŒã¿ãŒãä»ããŠãªã³ã¯ãããŸãã ãããã£ãŠãSTLã¯é©ãã¹ãæè»æ§ã瀺ããç¡éã®æ°ã®å®éçãªåé¡ã解決ããããšãã§ããŸãã
ãã³ãã¬ãŒãã¯ã©ã¹ã®ééããªãå©ç¹ã¯ãã³ã³ãã€ã©ãå®éã«ã³ãŒãã§äœ¿çšãããã¯ã©ã¹ã¡ãœããã®ã¿ãã€ã³ã¹ã¿ã³ã¹åããããšã§ãã æ®ãã®ãã¹ãŠã®ã³ãŒãã¯ãæ§æã®æ£ç¢ºæ§ã®ãã§ãã¯ã®ã¿ã«åæ ŒããŸãã ããã«ãããæªäœ¿çšã®ã³ãŒããæé€ãããã¡ã¢ãªæ¶è²»ãåæžãããŸãã ç¹æ®åã¡ã«ããºã ã䜿çšãããšããã³ãã¬ãŒããã©ã¡ãŒã¿ãŒã«å¿ããŠåäœã埮調æŽã§ãããããã³ãŒããæé©åãã絶奜ã®æ©äŒãåŸãããŸãã ãã³ãã¬ãŒãã®æ¬ ç¹ã¯ãéçºã®è€éããšãã³ãã¬ãŒãã³ãŒãã«å¯Ÿããã³ã³ãã€ã©ã®æµæã§ãã
ãã³ãã¬ãŒãã®ã¢ã€ãã¢ã¯ãäŸãæããŠèª¬æããã®ãæãç°¡åã§ãã
æŽæ°ãæ±ãããã«miné¢æ°ãå¿ èŠã ãšããŸãã Cããã°ã©ããŒã«ãšã£ãŠæãããªè§£æ±ºçã¯æ¬¡ã®ãããªãã®ã§ãã
int min(int a, int b) { return (a < b) ? a : b; }
æµ®åå°æ°ç¹ãæ±ãããã«åæ§ã®é¢æ°ãå¿ èŠãªå Žåã¯ãå¥ã®é¢æ°ãäœæããå¿ èŠããããŸãã
float min(float a, float b) { return (a < b) ? a : b; }
æ°ããã¿ã€ãããšã«æ°ããæ©èœãå¿ èŠã«ãªããŸãã
C ++ããã°ã©ãã®å Žåãã¿ã¹ã¯ã¯ããã次ã®ãã³ãã¬ãŒããèšè¿°ããããšã§è§£æ±ºãããŸãã
template<typename T> T min(T a, T b) { return (a < b) ? a : b; }
ãã®å Žåã䜿çšãããå€ã®ã¿ã€ãã¯æ瀺çã«ç€ºãããã代ããã«ãtypenameããŒã¯ãŒãã䜿çšããŠãã³ãã¬ãŒãå®çŸ©ã«ååšããæå®Tã䜿çšããŸãã ãã³ãã¬ãŒãé¢æ°ïŒããã³ã¯ã©ã¹ã¡ãœããïŒã®å Žåãã³ã³ãã€ã©ã¯ãéä¿¡ãããå€ã®ã¿ã€ãã«åºã¥ããŠãå¿ èŠãªãã©ã¡ãŒã¿ãŒã¿ã€ããåå¥ã«æšå®ã§ããŸãã ç°ãªãã¿ã€ãã®ãã©ã¡ãŒã¿ãŒã®ãã¢ããã®miné¢æ°ã«æž¡ããããšãã³ã³ãã€ã©ãŒã¯ãã®äžæºãéåžžã«åççã«è¡šçŸããŸãã åæã«ãç°ãªãã¿ã€ãã®ãã©ã¡ãŒã¿ãŒã®è»¢éãæå³çã«å®è¡ãããå Žåãé¢æ°ãåŒã³åºããšãã«ãã³ãã¬ãŒããã©ã¡ãŒã¿ãŒã®ã¿ã€ããæ瀺çã«ç€ºãããšã§ã³ã³ãã€ã©ãŒãæ¯æŽããããšãã§ããŸãã
float float_variable = 3.141; int integer_variable = 3; int result = min<int>(float_variable, integer_variable);
ãŸãã¯å¿ èŠãªãã®ã«å¿ããŠïŒ
float result = min<float>(float_variable, integer_variable);
ãã®æ¹æ³ã§å®£èšãããé¢æ°ã¯ãä»»æã®ããŒã¿åã§æ©èœããŸããå¯äžã®æ¡ä»¶ã¯ããã®åã«å®çŸ©ãããæäœã<ãïŒå°ãªãïŒã®ååšã§ãã ããã¯ãåçåä»ãã䜿çšããèšèªã®åäœã«éåžžã«äŒŒãŠããŸãããæ ¹æ¬çãªéãããããŸãã Pythonã®ãããªèšèªã§ã¯ãé¢æ°ã¯åäžã®ã³ããŒã«ååšã§ããŸãã
ããã¯éåžžã«äŸ¿å©ã§ããããã®ç¶æ³ã ãããã³ãã¬ãŒãã®å¥ã®åé¡ã®åå ã§ããå¯èœæ§ããããŸã-ã³ãŒãã®è¥å€§åã ãã®ç¹å®ã®é¢æ°ã¯å°ãããã€ã³ã©ã€ã³åã®æãããªåè£ã§ãããããåé¡ã§ã¯ãããŸããã ãã ããããªã¥ãŒã¡ããªãã¯ã¡ãœãããæã€ãã³ãã¬ãŒãã¯ã©ã¹ã®ããŸããŸãªãã©ã¡ãŒã¿ãŒåãããã€ã³ã¹ã¿ã³ã¹ãã³ãŒãå ã«ååšãããšãã³ãŒããå€§å¹ ã«å¢å ããå®éã®åé¡ãçºçããå¯èœæ§ããããŸãã Todd Veldhusenã¯ããããåé¿ããããã®æšå¥šäºé [5]ãäœæããŠããŸãã
ã¡ã¿ããã°ã©ãã³ã°
1994幎ãC ++æšæºåå§å¡äŒã®äŒè°ã§ãErwin Unruhã¯æåã«ã³ã³ãã€ã«æ®µéã§èšç®ãå®è¡ã§ããããšãå®èšŒããŸããã ã³ã³ãã€ã«ããã»ã¹äžã«ã圌ãæ瀺ããã³ãŒãã¯ãå€æ°ã®çŽ æ°ã®å€ãå«ãäžé£ã®èšºæã¡ãã»ãŒãžã衚瀺ããŸããã ãããªãç 究ã«ãããæ°åŠæŒç®ãå®è¡ããå¯èœæ§ã¯èšç®äžå®å šã§ããããšã瀺ãããŸãã[6]ãå®éãç®è¡æŒç®ã䜿çšããååž°ã䜿çšããŠãµã€ã¯ã«ãç·šæããç¹æ®åã䜿çšããŠåå²ããããšãã§ããŸãã
ãã¿ãŒã³ãšã©ã³ã¿ã€ã ã®éåžžã®æ©èœã®éã«ã¯ãããçšåºŠã®é¡äŒŒæ§ãèªããããŸãã[3]ã
ãã³ãã¬ãŒããã©ã¡ãŒã¿ã¯éåžžã®é¢æ°ãã©ã¡ãŒã¿ã®åœ¹å²ãæããããã¹ããããåãšåæåã®å®æ°å€ã¯æ»ãå€ã«é¡äŒŒããŠããŸãã ã¡ã¿é¢æ°ãšæ»ãå€ã®ãã©ã¡ãŒã¿ãŒãšããŠãåããšã³ãã£ãã£ãŒã䜿çšã§ããŸããããã«ã¯ãã³ãã¬ãŒããã©ã¡ãŒã¿ãŒã䜿çšã§ããŸãã
-åæåã®å®æ°å€ã
-ã¿ã€ãã
-ãã€ã³ã¿ãŒ
1.æãåçŽã§æãç解ããããã±ãŒã¹ã¯ãåæåã®äœ¿çšã§ãã
以äžã®ã¡ã¿é¢æ°ã¯ãBASEå€ãPWRã®çŽ¯ä¹ã«äžããŸãã
template // < unsigned PWR, unsigned BASE = 10 // // > struct power { enum{value = BASE * power<PWR-1,BASE>::value}; }; template<unsigned BASE> // struct power<0,BASE> { enum{value = 1}; };
ã芧ã®ãšãããçµæãèšç®ããããã«ããã¯ãŒãã³ãã¬ãŒãã¯å€æŽãããPWRå€ã䜿çšããŠååž°çã«åŒã³åºããŸãã ç¡éååž°ãé²ãã«ã¯ããã®å ŽåãPWRã®ãŒãå€ã«ç¹åããå¿ èŠããããŸãã
䜿çšäŸïŒ
unsigned KILO = power<3,10>::value; // KILO 1000 unsigned MEGA = power<6,10>::value; // MEGA 1000000 unsigned kBytes = power<10,2>::value; // kBytes 1024
2.ã¿ã€ãã«å¯Ÿããèšç®
ValueTypeåã®å ¥åãã©ã¡ãŒã¿ãŒãé¢æ°ã«æž¡ãå¿ èŠããããšããŸãã ã¿ãŒã²ãããã©ãããã©ãŒã ãšç¹å®ã®çš®é¡ã®ãã©ã¡ãŒã¿ãŒã®ãµã€ãºã«å¿ããŠããã©ã¡ãŒã¿ãŒãïŒå®æ°ãªã³ã¯ãŸãã¯å€ã§ïŒæž¡ãæé©ãªæ¹æ³ãèªåçã«éžæãããããã«ããŸãã
template < typename ValueType > struct PARAM { typedef typename type_selector< (sizeof(ValueType*) < sizeof(ValueType)), const ValueType&, ValueType >::type type; };
ã¡ã¿ãã¡ã³ã¯ã·ã§ã³å ã§äœ¿çšãããtype_selectorãã¿ãŒã³ã¯ãå€ãã®èè ã«ãã£ãŠèšè¿°ãããŠããïŒããšãã°ã3ã4ïŒã次ã®ããã«ãªããŸãã
template // < bool CONDITION, // typename TYPE0, // , , typename TYPE1 // , , > struct type_selector { typedef TYPE0 type; }; // CONDITION == false template<typename TYPE0,typename TYPE1> struct type_selector<0,TYPE0,TYPE1> { typedef TYPE1 type; };
CONDITIONæ¡ä»¶ã®å€ã«å¿ããŠãtype_selectorãã¿ãŒã³ã¯TYPE0ïŒCONDITION == trueïŒãŸãã¯TYPE1ïŒCONDITION == falseïŒãéžæããŸãã ãã®å Žåãè«çåŒãæ¡ä»¶ãšããŠäœ¿çšããŸãïŒsizeofïŒValueTypeïŒ> sizeofïŒValueType *ïŒã ããšãã°ããã©ã¡ãŒã¿ãŒãuint32_tåã®å Žåãé¢æ°ã«ã¯æ¬¡ã®å®çŸ©ã䜿çšããŸãã
void function(typename PARAM<uint32_t>::type value){...}
ãã®å Žåãã³ã³ãã€ã©ã¯ãã³ãã¬ãŒãã«ã¢ã¯ã»ã¹ããåã«typenameããŒã¯ãŒããæå®ããå¿ èŠããããŸããããã¯ããã©ã¡ãŒã¿ãŒãæž¡ãããã«äœ¿çšãããåããã¹ããããŠããããã§ãã é¢æ°ã®åæ§ã®å®£èš/å®çŸ©ã¯å°ãé¢åã«èŠããŸãããã¿ã¹ã¯ã¯è§£æ±ºãããŠããŸãïŒ-32ãããããã³64ããããã©ãããã©ãŒã ã§ã¯ããã©ã¡ãŒã¿ãŒã¯å€ã§æž¡ãããŸããããšãã°ãã¢ãã¬ã¹ãµã€ãºã2ãã€ãã®AVRãã€ã¯ãã³ã³ãããŒã©ãŒã§ã³ã³ãã€ã«ãããå Žåããã©ã¡ãŒã¿ãŒã¯å®æ°ãªã³ã¯ã«ãã£ãŠæž¡ãããŸãã
3.ãã³ãã¬ãŒããã©ã¡ãŒã¿ãšããŠã®ãã€ã³ã¿
ããã€ãã®ã³ãŒãå ã§ãã³ãŒã«ããã¯åŒã³åºããè¡ãå¿ èŠããããšä»®å®ããŸã-ã¿ã€ãã次ã®ããã«å®çŸ©ãããŠããé¢æ°ïŒ
typedef void (*CALLBACK_FUNCTION_TYPE)(); // callback
次ã«ãã³ãŒãããã³ãã¬ãŒããšããŠå®çŸ©ããŸãã
// cb_func, // CALLBACK_FUNCTION_TYPE template<CALLBACK_FUNCTION_TYPE cb_func> void some_code(...) { ... cb_func(); // ... }
次ã®ããã«ã³ãŒããåŒã³åºããšãã«å¿ èŠãªé¢æ°ãæž¡ãããšãã§ããŸãã
some_code<&our_callback_function>(...);
our_callback_functionã®ã¢ãã¬ã¹ã¯ã³ã³ãã€ã«æã«ããã£ãŠãããããã³ã³ãã€ã©ãŒã«ãã£ãŠæ£åžžã«ã€ã³ã©ã€ã³åã§ããŸã[5]ã ã³ãŒãã®ãµã€ãºãšå¹çã«å¯Ÿããåã蟌ã¿é¢æ°ã®åœ±é¿ã«ã€ããŠèªãããšãã§ããŸã[7]-ãã®æ¬ã®3ã€ã®ç« ã¯ãåã蟌ã¿é¢æ°ã®åé¡ã«å®å šã«å°å¿µããŠããŸãã 圌ã®èšäº[5]ã§ãTodd Veldhusenã¯ãè¡åç©ã®ãããç©é¢æ°ã䜿çšããã«ãŒãå±éããã·ãªãŒãºãåèšããããšã«ããé«éããŒãªãšå€æã¢ã«ãŽãªãºã ã®äžè§å®æ°ã®èšç®ãªã©ãã¡ã¿é¢æ°ã®äœ¿çšã®éåžžã«èå³æ·±ãäŸã瀺ããŠããŸãã ããã§ããããã®ã¢ã¯ã·ã§ã³ã¯ã³ã³ãã€ã«æ®µéã§å®è¡ããããããå®è¡æã«ãããã®ã¢ã¯ã·ã§ã³ã¯ãã¹ãŠãŒãã®å€ã«ãªãããšãç解ããããšãéèŠã§ãã
èšèš
ç¹°ãè¿ã䜿çšãããããšã«ãªã£ãŠããã³ãŒãã«é¢ããŠã¯ãã€ã³ã¿ãŒãã§ãŒã¹ã®åé¡ãåé¢ã«åºãŠããŸãã æ確ã«å®çŸ©ãããã€ã³ã¿ãŒãã§ã€ã¹ã®éèŠæ§ã¯ãWebã§ç¹°ãè¿ãè°è«ãããŠããŸãã åªããã€ã³ã¿ãŒãã§ãŒã¹ã«å¯ŸããŠäŒçµ±çã«è¡ãããäžé£ã®èŠä»¶ã«ã¯ãæ£ããå®çŸ©ãããæœè±¡åãå®è£ ã®è©³çŽ°ã®é èœãæå°æ§ãšååæ§ã䜿ãããããäžé©åãŸãã¯äžé©åãªäœ¿çšã®äžå¯èœæ§ãªã©ãå«ãŸããŸã[9]ã ã¡ã¿ããã°ã©ãã³ã°ã䜿çšããå ŽåãèŠä»¶ã®äžéšã¯å€å€§ãªåªåãæããªããã°å®çŸã§ãããäžéšã¯ãŸã£ããå®çŸãããªãå ŽåããããŸãã ãã®ã±ãŒã¹ã§äœ¿çšãããŠããèšèªããããã£ãå¶ç¶çºèŠããããšããäºå®ã¯ãããªãäžåšçšãªæ§æã®çç±ã説æããŠããŸãã ããã¯ãã¡ã¿ããã°ã©ãã³ã°ã³ãŒããéçºãããã³ãã¬ãŒãããŒã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããå Žåã«äŸ¿å©ã§ã¯ãããŸããã ã³ã³ãã€ã«äžã«èšºæã¡ãã»ãŒãžãæå®ã§ããªãããšã«ãããã³ãŒãã®æ£ãã䜿çšãå®è£ ãã«ãããªããŸããããã®æ¹åãå€æŽããããã€ãã®è©Šã¿ã¯æ¢ã«è¡ãããŠããŸããããšãã°ãboostã©ã€ãã©ãªã®éçã¢ãµãŒã·ã§ã³ãæ°ããèšèªæšæºã§ãã
ããŒããŠã§ã¢ããã€ã¹ãå¶åŸ¡ããã³ãŒããéçºããå ŽåããŠãŒã¶ãŒã«ãã¹ãŠã®ïŒããã€ã¹ïŒã³ã³ããŒãã³ãã®å®å šãªå¶åŸ¡ãæäŸããå¿ èŠããããŸãã åæã«ãã€ã³ã¿ãŒãã§ã€ã¹ã®æå°èŠä»¶ãä¿æãããŸãã ããã§ã®åççãªã¢ãããŒãã¯ãããããããã€ã¹ã€ã³ã¿ãŒãã§ã€ã¹ã§æ£ãããã©ã¡ãŒã¿ãŒã·ãŒã±ã³ã¹ã䜿çšããããšã§ãã æãé »ç¹ã«å€æŽããããã©ã¡ãŒã¿ãŒãæåã«é 眮ããæ®ãã®ãã¹ãŠïŒãã©ã¡ãŒã¿ãŒïŒã«ã€ããŠã¯ãæãäžè¬çãªäœ¿çšäŸã«å¯Ÿå¿ããããã©ã«ãå€ã決å®ããå¿ èŠããããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ãæ§ç¯ããããã®äŸ¿å©ãªã¢ãããŒãã¯ã[1ã2]ã§èª¬æãããŠããæŠç¥ã®ã¯ã©ã¹ã䜿çšããèšèšã§ãã ã¢ã€ãã¢ã¯ãšãŠãã·ã³ãã«ã§ãã å®è£ ãããæ©èœã®äžéšã¯ããã³ãã¬ãŒããã©ã¡ãŒã¿ãšããŠäœ¿çšãããå€éšã¯ã©ã¹ïŒæŠç¥ïŒã«å§ä»»ãããŸãã åäœãå€æŽããå¿ èŠãããå Žåã¯ãå¥ã®æŠç¥ãéžæãããŸãã ããã¯ãéåžžã®ïŒå®è¡æïŒé¢æ°ã®ãã©ã¡ãŒã¿ãŒã䜿çšããã®ãšéåžžã«ãã䌌ãŠããŸãããã©ã¡ãŒã¿ãŒã®ãããã§ãåŒæ°ã®ããŸããŸãªå€ãé¢æ°ã«æž¡ããšãç°ãªãçµæãåŸãããšãã§ããŸãã ããŒãã³ãŒããããåŒæ°å€ãæã€é¢æ°ã¯åžžã«åãçµæãè¿ããŸãããããã¯ããŸãæå³ããããŸããã ãã³ãã¬ãŒãã®ãã©ã¡ãŒã¿ãŒïŒæŠç¥ïŒãšããŠããã¹ãŠã®æ©èœãåããã¿ã€ãïŒã¯ã©ã¹ïŒã䜿çšã§ããŸãã ããã«ããããã³ãã¬ãŒãåŒæ°ãšããŠç®çã®åäœãæã€æŠç¥ãæå®ããããšã§ã䜿çšæã«ã¢ã«ãŽãªãºã ããã©ã¡ãŒã¿ãŒåã§ããŸãã ããã«ãããæ°ããã¬ãã«ã®æè»æ§ãšäžè¬åãå®çŸããŸãã
å žåçãªAVRã³ã³ãããŒã©ãŒã®äžéšã§ããUSARTããã€ã¹ã€ã³ã¿ãŒãã§ã€ã¹ïŒãŠãããŒãµã«åæ-éåæãã©ã³ã·ãŒããŒïŒã®å®è£ äŸãæ€èšããŠãã ããã
enum USART_ID // { USART0, USART1, USART2, USART3, }; enum BAUD_RATE // { BR_2400 = 2400, ... BR_921600 = 921600, BR_CUSTOM = CUSTOM_BAUD_RATE }; // - ( ) template < BAUD_RATE baud = BR_9600, // (enum) DATA_BITS data_bits = DATA_BITS_8, // (enum) PARITY parity = NO_PARITY, // (enum) STOP_BITS stop_bits = STOP_1, // (enum) ... > struct FRAME_CONTROL;
C ++ã®å³å¯ãªåæå®ã§ã¯ããã©ã¡ãŒã¿ãŒãšããŠã宣èšãããããŒã¿åãšå®å šã«äžèŽããå€ãæå®ããå¿ èŠããããŸãã ããšãã°ãçºæ¿ã¬ãŒãã瀺ãããã«ãBAUD_RATEåæã§å®£èšãããŠããå€ã®ã¿ãéžæã§ããŸãã ç¹å¥ãªïŒéæšæºïŒé床å€ãå¿ èŠãªå Žåã¯ãå¿ èŠãªããŒã¿ã¬ãŒãã§ãã¯ãå®çŸ©CUSTOM_BAUD_RATEãäºåã«å®£èšããŠãããšãBR_CUSTOMå€ã䜿çšã§ããŸãã
USARTã¯ã©ã¹ã®å®çŸ©ã¯æ¬¡ã®ãšããã§ãã
template < USART_ID id, // (enum) class usart_ctrl = FRAME_CONTROL<>, // - () - FRAME_CONTROL class receiver = USART_RECEIVER<>, // - () - USART_RECEIVER class transmitter = USART_TRANSMITTER<> // - () - USART_TRANSMITTER > struct USART { static void inline init(){...} static size_type send(const uint8_t* data, size_type data_size){...} static size_type print(const char* fmt, ...){...} static size_type _vprintf(const char* fmt, va_list ap){...} ... static void USART_UDRE_handler(){...} };
ããã§ã¯ãç°¡æœã«ããããã«ãå€ãã®åæãšæ§é ã®å®çŸ©ã¯çç¥ãããŠããŸãã å®éã®ã³ãŒãã§äœ¿çšããããã«ãincludeãã£ã¬ã¯ãã£ãã䜿çšããŠããããã¹ãŠã®æ§é ã®èª¬æãå«ãããããŒãã¡ã€ã«ãå«ããããã€ã¹ã«å¿ èŠãªãã©ã¡ãŒã¿ãŒã決å®ããŸãã
#define SEND_BUFFER_SIZE 32 #define RECV_BUFFER_SIZE 16 typedef USART< USART0, FRAME_CONTROL<BR_921600>, RECEIVER_DISABLED, USART_TRANSMITTER<SEND_BUFFER_SIZE> > usart_0; // USART0, 921600 , 8N1, , 32 typedef USART< USART1, FRAME_CONTROL<BR_9600, DATA_BITS_7, EVEN_PARITY, STOP_2> USART_RECEIVER<RECV_BUFFER_SIZE>, USART_TRANSMITTER<SEND_BUFFER_SIZE> > usart_1; // USART1, 9600-7E2, 16 , 32 typedef TWI<400000> I2C; // TWI - 400 kHz
ãã®ãããUSARTæ§é ã¯4ã€ã®ãã³ãã¬ãŒããã©ã¡ãŒã¿ãåãå ¥ããŸãã
-ããã€ã¹èå¥å-4ã€ã®å©çšå¯èœãªããã€ã¹ã®ããããã䜿çšã§ããŸãïŒMega256ã®ã¿ãè¥ããããã«ã¯USART0ã䜿çšããå¿ èŠããããŸãïŒ
-åäžå®è£ ã®usart_ctrlæŠç¥-FRAME_CONTROL-亀æãã©ã¡ãŒã¿ãŒã®æå®çšïŒäžèšãåç §ïŒã
-ã¬ã·ãŒããŒæŠç¥-å®è£ ã2ã€ãããªãã¬ã·ãŒããŒ-å¿ èŠãªã¬ã·ãŒããŒãã©ã¡ãŒã¿ãŒã®èšå®ãå¯èœã«ããUSART_RECEIVERïŒãããã¡ãŒãµã€ãºã®æå®ãšå²ã蟌ã¿ã®å¶åŸ¡ïŒããã³RECEIVER_DISABLEDïŒå¿ èŠã«å¿ããŠã¬ã·ãŒããŒã®åæãå¯èœã«ããïŒ
-ãã©ã³ã¹ããã¿ãŒæŠç¥ââ-USART_TRANSMITTERå®è£ ïŒãããã¡ãŒãµã€ãºãå²ã蟌ã¿å¶åŸ¡ïŒããã³TRANSMITTER_DISABLEDã䜿çšãããã©ã³ã¹ããã¿ãŒãã©ã¡ãŒã¿ãŒããã©ã³ã¹ããã¿ãŒããã³å¯Ÿå¿ããå²ã蟌ã¿ãçŠæ¢ããŸãã
ãã®äžé£ã®æŠç¥ã¯ãããã€ã¹ãå®å šã«å¶åŸ¡ããããã©ã«ãå€ã䜿çšããããšã«ãããæãäžè¬çãªãŠãŒã¹ã±ãŒã¹ã®ã¯ã©ã¹ãã©ã¡ãŒã¿ãŒåãç°¡çŽ åããŸãã
次ã«ãããã€ã¹ãåæåããŸãã
usart_0::init(); I2C::init();
ããã§ã¯ãã¡ãœãããåŒã³åºãããã®ç°åžžãªæ§æã«æ³šæãæãå¿ èŠããããŸãã éåžžã®æŒç®åãããã®ä»£ããã«-æ§é äœã®ã¡ã³ããŒãžã®åç §ïŒæ§é äœåç §ïŒãããã§ã¯æŒç®åã::ãã䜿çšãããŸã-ã¹ã³ãŒãã®é瀺ïŒã¹ã³ãŒã解決ïŒã å®éã«ã¯ãUSARTã¯ã©ã¹ã®ãã¹ãŠã®ã¡ãœããïŒããã³TWIïŒãéçãšããŠå®çŸ©ãããŠãããããããã§ã¯ãªããžã§ã¯ãã§ã¯ãªãåã䜿çšããŸãã ããã«ãããæœèšã®å»ºèšãšç Žå£ã®ãªãŒããŒããããåé¿ãããããã«ãããã€ã¹ã®ã·ã³ã°ã«ãã³ã®ãããªæ§è³ªãæ確ã«åæ ãããŸãã ããã¯ãåãšãã®éçã¡ã³ããŒã®äœ¿çšãæ¯æããŠãéåžžã®ãªããžã§ã¯ããå®å šã«æŸæ£ããããšãæå³ãããã®ã§ã¯ãããŸããã ã»ãšãã©ã®å Žåãã³ãŒãã«ã¯å€ãã®äœ¿ãæ £ãããªããžã§ã¯ããå«ãŸããŸãããããŒããŠã§ã¢ã³ã³ããŒãã³ãã管çããããã®æ§é ã«ã€ããŠèª¬æããå Žåããã®ã¢ãããŒãã®æ¹ãçã«ããªã£ãŠããŸãã
ãã®ããã«çæãããã¢ã»ã³ãã©ãŒïŒMega256çšïŒã¯æ¬¡ã®ããã«ãªããŸãã
000000ba <_Z10usart_initv>: ba: 10 92 c4 00 sts 0x00C4, r1 be: 10 92 c5 00 sts 0x00C5, r1 c2: 10 92 c0 00 sts 0x00C0, r1 c6: 88 e2 ldi r24, 0x28 ; 40 c8: 80 93 c1 00 sts 0x00C1, r24 cc: 86 e0 ldi r24, 0x06 ; 6 ce: 80 93 c2 00 sts 0x00C2, r24 d2: 10 92 26 01 sts 0x0126, r1 d6: 08 95 ret 000000d8 <_Z8twi_initv>: d8: 8c e0 ldi r24, 0x0C ; 12 da: 80 93 b8 00 sts 0x00B8, r24 de: 10 92 b9 00 sts 0x00B9, r1 e2: 85 e4 ldi r24, 0x45 ; 69 e4: 80 93 bc 00 sts 0x00BC, r24 e8: 10 92 03 01 sts 0x0103, r1 ec: 08 95 ret
ãªã¹ããããããã€ã¹ã®åæåã«å¿ èŠãªãã¹ãŠã®å®æ°ã®èšç®ãã³ã³ãã€ã«æ®µéã§å®è¡ãããããšãããããŸãã
å¥ã®äŸ
ç¬èªã®äº€æãããã³ã«ãéçºããŠããå Žåããã®çºè¡šïŒæŠç¥ã䜿çšïŒã¯æ¬¡ã®ããã«ãªããŸãã
template < class transport, class params = PROTO_PARAMETERS<...> // - ... > struct SUPER_DUPPER_EXCHANGE_PROTOCOL;
ããã§èå³æ·±ãã®ã¯ããããã³ã«ã®ãã©ã³ã¹ããŒãããã³ãã¬ãŒããã©ã¡ãŒã¿ãŒãšããŠæå®ãããŠããããšã§ãã ããã«ããã䜿çšæã«ãããã³ã«ãèšå®ã§ããŸãã次ã«äŸã瀺ããŸãã
typedef SUPER_DUPPER_EXCHANGE_PROTOCOL<usart_0, PROTO_PARAMETERS<>, ...> PROTO_SERIAL;
å¿ èŠã«å¿ããŠãSPIãTWIãªã©ã®å¥ã®ããã€ã¹ã§åããããã³ã«ã䜿çšã§ããŸãã
typedef SUPER_DUPPER_EXCHANGE_PROTOCOL<TWI<200000>, PROTO_PARAMETERS<>, ...> PROTO_TWI;
æŠç¥ã¯ã©ã¹ã«ã¯ãããšãã°ãå ±éã®ç¥å ããã®ç¶æ¿ã®èŠä»¶ãªã©ãè¿œå ã®å¶éã¯ãããŸããã ãã©ã³ã¹ããŒããšããŠäœ¿çšãããã¿ã€ãã®å¯äžã®èŠä»¶ã¯ãå¿ èŠãªçœ²åã䜿çšããã¡ãœããïŒéä¿¡ãåä¿¡ãªã©ïŒã®å¯çšæ§ã§ãã
å¿ èŠãªæ°ã®æŠç¥ãå®çŸ©ããããšãã§ããŸããããããã®æŠç¥ã¯æ©èœã®ç¹å®ã®åŽé¢ãæ åœããå¿ èŠãããããã®ãããããã®çŽäº€æ§ãä¿èšŒãããŸã[2]ã
æŠç¥ããšã«ãå€ãã®ç°ãªãå®è£ ãååšããå¯èœæ§ããããŸãã ãã®çµæãããŸããŸãªåäœïŒæŠç¥ã®å€ãã®å¯èœãªçµã¿åããïŒã®æ°ãéåžžã«å€§ãããªãå¯èœæ§ããããŸãã ããã¯ãå žåçãªç¶æ¿ããã©ãŒãã³ã¹ã®åé¡ãåŒãèµ·ããããšãªããåªããã³ãŒãã®æè»æ§ãæäŸããéçå€æ æ§ã®åªããäŸã§ãã
ãã®ããã«ããŠå¿ èŠãªåãå®çŸ©ãããã次ã®ããã«ã³ãŒãã§äœ¿çšããŸãã
PROTO_SERIAL::send(data, size); // data usart_0 PROTO_TWI::send(data, size); // data TWI
ãããã°
ããã°ã©ã ã³ãŒãã®ãããã°ã¯ç°¡åãªäœæ¥ã§ã¯ãªãããšãç¹°ãè¿ãå¿ èŠã¯ãããŸããã ãã€ã©ãŒãã¬ãŒãã³ãŒãã®ãããã°ã¯ãã³ã³ãã€ã©ã䜿ãã«ãããããéçºè ã«ãšã£ãŠããã«å°é£ã§ãã ããã¹ãå ã®ã¿ã€ããã¹ã¯ãé·ã蚺æãªã¹ãã®çµè«ã«ã€ãªãããŸããããã¯ãã³ã³ãã€ã©ãŒã®2ãã¹ã¢ãŒãã«ããããã«åå¢ããŸãã ãããã®ãªã¹ãã¯æåããèªãå¿ èŠãããã次ã®ã³ã³ãã€ã«ãè©Šã¿ãåã«æå°éã®ã³ãŒãå€æŽãè¡ããŸãã äžéšã®ã¡ãã»ãŒãžã¯ãèªå°ããããšã©ãŒã«ãã£ãŠåŒãèµ·ãããããšã©ãŒãä¿®æ£ããããšæ¶ããŸã-æ ¹æ¬åå ã
ãã³ãã¬ãŒãã®ç¹æ®åã¯ã芪æé¢ä¿ã«ãã£ãŠãã©ã€ããªãã³ãã¬ãŒããšã¯é¢ä¿ãããŸããã å®éãç¹æ®åã¯åå¥ã®ç¬ç«ããã¯ã©ã¹ãšèŠãªãããšãã§ããç¹æ®åããããã©ã¡ãŒã¿ãŒãäžèŽããå Žåã«ãã©ã€ããªãã³ãã¬ãŒãã®ä»£ããã«äœ¿çšãããŸãã ãããã£ãŠããã³ãã¬ãŒãã³ãŒãã®æäœæ§ãå°ãªããšãããçšåºŠç¢ºå®ã«ããã«ã¯ããã³ãã¬ãŒãã®åç¹æ®åãå°ãªããšã1åã€ã³ã¹ã¿ã³ã¹åããå¿ èŠããããŸãã ããã«ããããã€ã©ãŒãã¬ãŒãã³ãŒãã®ãããã°ããã»ã¹ã¯ããªãé·ãããã»ã¹ã«ãªããŸãã
åã蟌ãŸããã³ãŒãã®ãããã°ã¯ãç¹ã«ç¹å¥ãªæ©åšããªãå Žåãéçºè ã«ãšã£ãŠæªå€¢ã§ãã ãã®å Žåãå¯äžã®è§£æ±ºçã¯ãã«ãŒããã©ãŒã¹-ãããã°ã¡ãã»ãŒãžã®æ¿å ¥ã§ãã
次ã®ã€ã³ã¿ãŒãã§ã€ã¹ãæã€DEVICEã¯ã©ã¹ããããã°ãããšããŸãã
template < class params = DEVICE_SETTINGS<...>, class dbg = NO_DEBUG > struct DEVICE { static uint8_t some_method(uint8_t parameter) { dbg::print("%s:%d\n", __FUNCTION__, parameter); .... dbg:: print("retval:%d\n", retval); return retval; } };
ããã§ã¯ãããã©ã«ãã§å€NO_DEBUGã§åæåãããdbgãã³ãã¬ãŒããã©ã¡ãŒã¿ã«æ³šç®ããŸããåé¡ã®ã¡ãœããå ã§ãdbg :: printãåŒã³åºããŸãã
ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§ã¯ãããã€ã¹ã¯æ¬¡ã®ããã«å®£èšã§ããŸãã
typedef DEVICE_SETTINGS<...> DEV_SETTINGS; // typedef typedef DEVICE<DEV_SETTINGS, AVR_DEBUG<usart_0> > device; //
dbgãã©ã¡ãŒã¿ãŒãšããŠãusart_0ã¿ã€ãã§ãã©ã¡ãŒã¿ãŒåãããç¹å®ã®AVR_DEBUGãã³ãã¬ãŒãã䜿çšããŠããããšãããããŸããAVR_DEBUGã®å®çŸ©ãèŠããšã次ã®ã³ãŒãã®ãããªãã®ã衚瀺ãããŸãã
template < class SENDER > struct AVR_DEBUG { ... static void print(const char* fmt, ...) { va_list ap; va_start(ap, fmt); uint8_t retval = SENDER::_vprintf(fmt, ap); va_end(ap); } };
å®éãããã¯ãã¢ããªã±ãŒã·ã§ã³ã®å®è¡äžã«dbg :: printãåŒã³åºããšãã¯ã©ã¹AVR_DEBUG <usart_0>ã®printã¡ãœãããåŒã³åºããããããã¯ã©ã¹usart_0ã®_vprintfã¡ãœãããåŒã³åºãããšãæå³ããŸãããããã£ãŠããããã°ããã»ã¹äžã«ãusart_0ãã©ã¡ãŒã¿ãŒã§æå®ãããã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã«å¿ èŠãªãããã°æ å ±ãéä¿¡ããŸãã
ããã€ã¹ã®ã³ãŒãã®ãããã°ãå®äºãããã宣èšè¡ã次ã®ããã«çœ®ãæããŸãã
typedef DEVICE<DEV_SETTINGS, NO_DEBUG> device;
ãŸãã¯ããåçŽãªå Žåãdbgãã©ã¡ãŒã¿ã«ããã©ã«ãå€NO_DEBUGã䜿çšããŸãã
typedef DEVICE<DEV_SETTINGS> device;
NO_DEBUGã¯ã©ã¹ã®å°å·é¢æ°ã«ã¯ç©ºã®æ¬æãããã次ã®ããã«ãªããŸãã
struct NO_DEBUG { ... static void inline print(const char* , ...){} };
ããã§ãã空ã®é¢æ°ã®æ¬äœã®ã€ã³ã©ã€ã³åãšåé€ãæ£åžžã«å®è¡ããã³ã³ãã€ã©ã«äŸåããŠããŸããã³ãŒãã®ãªãªãŒã¹ããŒãžã§ã³ããã«ããããšãæªäœ¿çšã®ã³ãŒãã¯ãã¹ãŠåé€ãããŸãã
ãããã£ãŠããããã°æ å ±ã®åºåãå¶åŸ¡ã§ããã¡ã«ããºã ããããŸãã
åäœãã¹ã
Atmelã¯ãããã¥ã¡ã³ãã«ããŒã¿ãä¿åããããã®æå°ãµã€ãºã®ããŒã¿ââåã䜿çšããããšããå§ãããŸããæšå¥šäºé ã¯ãçµæã®ã³ãŒãã®ãµã€ãºã®åæã«äŸåããã¢ããªã±ãŒã·ã§ã³ã䜿çšããã¡ã¢ãªã®ã³ã¹ããåæžãããµã€ãºããã©ãããã©ãŒã ã«äŸåããªãã¿ã€ãã®äœ¿çšãæå³ããŸãããããŠããã¯ãããè¯ã移æ€æ§ãæã€ã³ãŒãã®äœæã«è²¢ç®ããŸããçæ³çã«ã¯ãPCäžã§ã³ãŒããå®è¡ããæ©äŒãåŸãŠãéçºäžã«åäœãã¹ãã䜿çšã§ããããã«ããŸãããã€ã¯ãã³ã³ãããŒã©ãŒåãã®ã³ãŒãã®ããªãã®éšåã¯ãã³ã³ãããŒã©ãŒã«ã¢ããããŒãããããã£ãšåã«ãã¹ãã§ãã¹ãã§ããŸãã
äžèšã®ãããã³ã«ã®äŸã«æ»ããšãç¹å¥ã«èšè¿°ãããã¯ã©ã¹ïŒã¢ãã¯/ãã§ã€ã¯ïŒããã©ã³ã¹ããŒããšããŠäœ¿çšã§ããŸããããã«ãããä»»æã®ã³ã³ãã³ããæã€ãã±ããã®åä¿¡ãã·ãã¥ã¬ãŒãã§ããéçºäžã®ãããã³ã«ã®ãããã°ãç°¡åã«ãªããŸãã
ãã®ã¢ã€ãã¢ãããã«çºå±ããããšãPCäžã®ã»ãšãã©ãã¹ãŠã®ã³ãŒãããããã°ããæ©äŒãåŸãããŸãã
察åŠããå¿ èŠãããå€ãã®åšèŸºæ©åšã¯ãå€éšã€ã³ã¿ãŒãã§ã€ã¹ïŒTWIãSPI ...ïŒãä»ããŠã³ã³ãããŒã©ãŒã«ãã£ãŠå¶åŸ¡ãããç¹å®ã®ãã©ãããã©ãŒã ã«çŽæ¥é¢é£ããŠããŸãããããŸããŸãªçš®é¡ã®ã»ã³ãµãŒããªã¢ã«ã¿ã€ã ã¯ããã¯ãLCDãã£ã¹ãã¬ã€ãªã©ã«ã€ããŠè©±ããŠããŸãããã®ãããªåšèŸºæ©åšã管çããããã®ã³ãŒãã¯ãçæ³çã«ã¯ã©ã®ãã©ãããã©ãŒã ã§ãå®è¡ã§ããã¯ãã§ããããã«ãããã³ãŒãã®ç§»æ€æ§ïŒç§»æ€æ§ïŒã®éèŠæ§ã決ãŸããŸãã
ãã®ãããªã³ãŒãããããã°ããã«ã¯ãããã€ã¹ãéçºè ã®ã³ââã³ãã¥ãŒã¿ãŒã«çŽæ¥æ¥ç¶ãããšéåžžã«äŸ¿å©ã§ããæ®å¿µãªãããããã€ã¹ã«å¿ èŠãªã€ã³ã¿ãŒãã§ã€ã¹ã¯ã³ã³ãã¥ãŒã¿ãŒäžã§ç©ççã«å©çšã§ããªãå ŽåããããŸãããã®å Žåãããã€ã¹ãšæšæºã®ã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ïŒCOMãŸãã¯USBïŒã®éã®ã¢ããã¿ãŒãšããŠãã€ã¯ãã³ã³ãããŒã©ãŒã䜿çšã§ããŸããããã¯ãä»»æã®ã³ã³ãã¥ãŒã¿ãŒã§äœ¿çšã§ããŸããæŠç¥ã䜿çšããèšèšã§ã¯ãå¶åŸ¡ãããŒãæšæºã®ã·ãªã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã«ãªãã€ã¬ã¯ããããããªæ¹æ³ã§ããããã°ãããã³ãŒãããã©ã¡ãŒã¿ãŒåã§ããŸããã·ãªã¢ã«ã€ã³ã¿ãŒãã§ãŒã¹ãšãããã°å¯Ÿè±¡ããã€ã¹ã«åæã«æ¥ç¶ãããŠãããã€ã¯ãã³ã³ãããŒã©ãŒã¯ããããã°æéå šäœã«ããã£ãŠäžåºŠããã°ã©ã ããã2ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹éã®ãã©ã³ã¹ã¬ãŒã¿ãŒãšããŠæ©èœããŸããããã«ãããéçºè ã®ã³ââã³ãã¥ãŒã¿ãŒã§ã³ãŒããçŽæ¥å®è¡ã§ããŸãããã®ã³ãŒããå®å šã«å¶åŸ¡ã§ããŸãã
ãããã°ãå®äºããããå®æããã³ãŒããå¿ èŠãªãã©ãããã©ãŒã åãã«ã¢ã»ã³ãã«ããé©åãªãã€ã¯ãã³ã³ãããŒã©ãŒã«ããŠã³ããŒãã§ããŸãã SPIã€ã³ã¿ãŒãã§ãŒã¹ïŒã³ã³ãããŒã©ãŒãSPIãžã®ã¢ããã¿ãŒã®ã·ãªã¢ã«ã³ãŒããå®è¡ïŒãä»ããŠSDã«ãŒããæäœããããã®ã³ãŒãããããã°ããéãããã³TWIã€ã³ã¿ãŒãã§ãŒã¹ïŒã³ã³ãããŒã©ãŒãTWIã¢ããã¿ãŒãžã®ã·ãªã¢ã«ãšããŠæ©èœããïŒã䜿çšãããªã¢ã«ã¿ã€ã ã¯ããã¯ãšæ £æ§ããã²ãŒã·ã§ã³ã»ã³ãµãŒã®ã³ãŒãããããã°ãããšãã«ããã®ææ³ãæ£åžžã«äœ¿çšãããŸããã
ãªã³ã¯ããã©ã[ avr_meta]å®éã«äœ¿çšãããŠããã³ãŒãã®äŸãããŠã³ããŒãã§ããŸãã avr8-gnu-toolchain-3.4.5.15.15-linuxã䜿çšããŠéçºããããŠããããã¹ããã¬ãŒã ã¯ãŒã¯ãšããŠTUTïŒC ++ãã³ãã¬ãŒããŠããããã¹ããã¬ãŒã ã¯ãŒã¯ïŒã䜿çšãããŸãããã³ãŒãã¯ç§ãã¡èªèº«ã®ããŒãºã®ããã«éçºãããŸããããããã§ãå€ãã®äœæ¥ãå¿ èŠã§ãããããã誰ãã«åœ¹ç«ã€ãããããªããšããåžæãæã£ãŠããããå ¬éããããšãå¯èœã§ããããšãããããŸããã
bin , . avr_adc AVR ADC â Analog to Digital Converter avr_debug AVR_DEBUG avr_interrupt/ext_int_control AVR avr_interrupt/pin_ch_int_control Pin Change AVR avr_misc avr_pin AVR avr_power_mgmt AVR avr_spi AVR SPI â Serial Peripheral Interface avr_twi AVR 2-wire Serial Interface ( ) avr_usart AVR USART ( ) container/bit_field bit field container/circular_buffer event_driven meta misc state/led_blinker () state/state_machine state/switch_case switch case
ãããã«
C ++èšèªã®ãªããžã§ã¯ãæåæ©èœã䜿çšãããšãã³ãŒãã®æ§é ãèªã¿ãããããããããããæ¹åã§ããŸããã¯ã©ã¹ã¯ãã³ãŒãã®åå©çšãšããèãæ¹ã®åªããå®æœåœ¢æ ã§ãã
ãã³ãã¬ãŒãã«åºæã®æè»æ§ã«ãããäžè¬çã§ãããšåæã«éåžžã«å¹ççãªã³ãŒããéçºã§ããŸãã䜿çšããããŒã¿ã®çš®é¡ããã³ãŒããç¬ç«ããŠãããããéçºã®æçµæ®µéã§å€ãã®èšèšäžã®æ±ºå®ãäžãããããœãŒã¹ã³ãŒããå€§å¹ ã«å€æŽããããšãªããããã®æ±ºå®ãå€æŽãããã§ããŸãã
æŠç¥ã䜿çšãããšãåçãªå€æ æ§ã«åºæã®ç¶æ¿ãäžè¬çãªããã©ãŒãã³ã¹ã®åé¡ã䜿çšããã«ãã³ãŒãã®åäœã«å€ãã®ãªãã·ã§ã³ãæäŸã§ããŸãããã³ãã¬ãŒãã®å°éåã«ãããéçºè ã¯ã³ãŒãã®åäœãæé©åããã³åŸ®èª¿æŽããããšãã§ããŸãã
1994幎ã«å®èšŒãããErwin Unruchãå¶ç¶çºèŠããC ++æ©èœã¯ãèšèªã®äœæè ã®æ¬æ¥ã®æå³ã®äžéšã§ã¯ãããŸããã§ããããå€ãã®éçºè ãã倧ããªé¢å¿ãåŒã³èµ·ãããŸãããã³ã³ãã€ã«æ®µéã§èšç®ãå®è¡ããæ©èœã¯ãéçºè ã«ã³ãŒãã®æ°ããã¬ãã«ã®äžè¬åãšãã®å®è¡ã®æå¹æ§ãæäŸããŸããçŸåšããã®ã¡ã«ããºã ã¯C ++ããã°ã©ããŒã«ããç¥ãããŠãããBlitz ++ãboost :: MPLãªã©ã®å€ãã®æåãªã©ã€ãã©ãªãŒã«çµã¿èŸŒãŸããŠããŸãã
å®éã1ã€ã®ããã°ã©ãã³ã°èšèªã®ãã¬ãŒã ã¯ãŒã¯å ã§ãå®è¡äžã®ã³ãŒãã®åäœãšãã³ã³ãã€ã«æ®µéã§åãã³ãŒããçæããããã»ã¹ã®äž¡æ¹ãå¶åŸ¡ã§ããŸããåçãã€ã³ãã£ã³ã°ïŒé¢æ°ãã©ã¡ãŒã¿ãŒïŒãšéçãã€ã³ãã£ã³ã°ïŒãã³ãã¬ãŒããã©ã¡ãŒã¿ãŒïŒãæã€ãšã³ãã£ãã£ã¯ã1ã€ã®èšèªæ§é ïŒãã³ãã¬ãŒãé¢æ°å ïŒã«åæã«ååšã§ããŸãã Todd Veldhusenã¯ãC ++ã2ã¬ãã«èšèªãšåŒãã§ããŸãã
ã¡ã¿ããã°ã©ãã³ã°ã䜿çšãããšãå®è¡ã®å¹çãå€§å¹ ã«åäžããã³ã³ãã€ã«äžã«æ±ºå®ãäžãããšã§çæãããã³ãŒãã®éãæžããããšãã§ããŸãããããžã§ã¯ãå ã«ãã³ãŒãå®è¡äžã«å€åããªãïŒã³ã³ãã€ã«æå®æ°ã§ããïŒãã©ã¡ãŒã¿ãŒãååšããããšã¯ãã¡ã¿ããã°ã©ãã³ã°ã䜿çšããŠæé©åããè¯ãæ©äŒã§ããã³ã³ãã€ã«æ®µéã§èšç®ã§ããå€ãããã³å®æ°ãã©ã¡ãŒã¿ãŒã«ãã£ãŠå¶åŸ¡ãããåå²ã¯ããã¹ãŠæé©åã®é©åãªåè£ã§ããã€ãŸããã³ã³ãã€ã«æéãå¢ããããšã§ãããã°ã©ã ã®å®è¡ãé«éåã§ããããšããããããŸããèšäº[10]ã¯ãAVRã§å®è¡ãããã¡ã¿ããã°ã©ã ã³ãŒãã®ããã©ãŒãã³ã¹ã枬å®ããçµæãšãAtmelã©ã€ãã©ãªã«åºã¥ããŠåŸæ¥éçºãããã³ãŒããšã®æ¯èŒã瀺ããŠããŸãã
ã¡ã¿ããã°ã©ã ã³ãŒãã®éçºã¯ãããªãæéãããããæéã®ãããããã»ã¹ã§ããã1åéãã®ãããžã§ã¯ãã«ã¯ãå§ãã§ããŸããããã ããã©ã€ãã©ãªã®éçºã«é¢ããŠã¯ããã®ãããªé·ææè³ã¯ãã¹ãŠã®åå©çšã«æçã§ãããšããæåŸ ããåªåãæ£åœåãããŸã[3]ã
ããã°ã©ã ã³ãŒãã®åªãã移æ€æ§ã¯ãããå°ãªãçµæã§ããå€ãã®çµæãããããããšãæå³ãããã¹ãŠã®å Žåã«ãããŠå©ç¹ã§ãããããã³ã«ã®äŸã«æ»ããšãããã§ã¯ç§»æ€æ§ãéèŠãªæ¡ä»¶ã§ããçžäºäœçšã®ååŽã«åå¥ã®ãããã³ã«å®è£ ãéçºããããšã¯ã»ãšãã©æå³ããããŸãããããã€ã¹ãæäŸããå Žåãã¯ã©ã€ã¢ã³ãã«ãããã³ã«ã®å®çŸ©ã察å¿ããã³ãŒãã®åœ¢åŒã§æäŸã§ãããããå¿ èŠãªãã©ãããã©ãŒã çšã®å¶åŸ¡ãœãããŠã§ã¢ã®éçºãå€§å¹ ã«ä¿é²ãããŸãã
å°æ°ã®åºçç©ããå€æãããšãäžè¬çãªãã³ãã¬ãŒããç¹ã«ã¡ã¿ããã°ã©ãã³ã°ã¯çµã¿èŸŒã¿ãœãããŠã§ã¢ã®äžçã§ã¯ããŸã人æ°ããããŸããããã¡ã¿ããã°ã©ãã³ã°æ©èœã倧ããªã¡ãªãããããããå ŽåããããŸãããªããžã§ã¯ãæåããã°ã©ãã³ã°ã«åŸæ¥ã®ææ³ã䜿çšãããšåæã«ãCããã³ASMã§æåã§èšè¿°ãããã³ãŒãã«åºæã®å¹çã確ä¿ã§ããŸãã
æåŠ
1.ãããããŽã¡ã³ãããŒã«ããšãã³ã©ã€M.ãžã§ã·ã¥ãã£ã¹ã C ++ãã³ãã¬ãŒãïŒå®å šã¬ã€ã
2. Andrei Alexandrescuã C ++ãã¶ã€ã³ïŒæ±çšããã°ã©ãã³ã°ããã³ãã¶ã€ã³ãã¿ãŒã³é©çš
3. David Abrahams and Aleksey GurtovoyãC ++ãã³ãã¬ãŒãã¡ã¿ããã°ã©ãã³ã°ïŒBoost and Beyondã®ã³ã³ã»ãããããŒã«ããã¯ããã¯
4. Davide Di Gennaroãé«åºŠãªC ++ã¡ã¿ããã°ã©ãã³ã°
5. Todd Veldhuizenã Scientific C ++ã®ãã¯ããã¯ãã€ã³ãã£ã¢ã倧åŠã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ãã¯ãã«ã«ã¬ããŒãïŒ542
6. Todd L. Veldhuizenã C ++ãã³ãã¬ãŒãã¯ãã¥ãŒãªã³ã°å®å šïŒ2003ïŒã§ãã
7. Dov BulkaãšDavid Mayhewãå¹ççãªC ++ãããã©ãŒãã³ã¹ããã°ã©ãã³ã°ãã¯ããã¯ã Addison-Wesley2000ã8.
Dale Wheatã Arduinoå éšãæŒããŠã
9.ããŒãã£ã³ã»ã¬ãã£ã C ++ã®APIãã¶ã€ã³ã 2011 Morgan Kaufmann Publishers
10.ã¯ãªã¹ããã»ã¹ãã¥ãŒãããã€ã±ã«ã»ã·ã¥ã«ãã§ããšã«ã°ã»ã«ã€ã¶ãŒãé«åºŠã«é©å¿å¯èœãªããã€ã¹ãã©ã€ããŒã®ããã®ãã³ãã¬ãŒãã¡ã¿ããã°ã©ãã³ã°ã®æŽ»çš-AVR CANãã©ã€ããŒã§ããCANARYã®ã±ãŒã¹ã¹ã¿ãã£ããã°ããã«ã¯å€§åŠåæ£ã·ã¹ãã åŠéš
11.第24åCPSUè°äŒã®è°äºé²ããçµæžéšéã®å¹çãæ¹åããããã®å¯Ÿçã匷åããããšã«ã€ããŠãçµã¿èŸŒã¿ãœãããŠã§ã¢ã®æå¹æ§ã®ã³ã³ãã©ã€ã¢ã³ã¹ãç£èŠããŸããã