åã®èšäºïŒ
ããŒã1.äžè¬æ å ±
ããŒã2. RTOS MAXã®ã«ãŒãã«
ããŒã3.æãåçŽãªããã°ã©ã ã®æ§é
ããŒã4.æçšãªçè«
ããŒã5.æåã®ã¢ããªã±ãŒã·ã§ã³
ããŒã6.ã¹ã¬ããåæããŒã«
ããŒã7.ã¿ã¹ã¯éã§ããŒã¿ã亀æããæ段
ããŒã8.å²ã蟌ã¿ã®åŠçïŒãã®èšäºïŒ
äžæãéèŠãªçç±
ã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã®æåž«ã¯ãããŒãªã³ã°ã ãã§ãªãäžæã«ã€ããŠã®äœæ¥ãããããšãéåžžã«å¥œãã§ããŸãããã®åŸã圌ãã¯éåžžãäžæã®åŠçã®å°ããªäŸãæããŠããããã¯ã«ã€ããŠå¿ããŸãã ããã«ãå®éã®ããã°ã©ãã³ã°ã§ã¯ãèªåã®ã¹ãã³ã§ã¯ãªãããã®ããžãã¹ã®åºæ¬ãç解ããå¿ èŠããããŸãã
ã·ã³ã°ã«ã¿ã¹ã¯ã·ã¹ãã ã§ããã°ã©ãã³ã°ããå Žåãå°åæ©åšãæäœããããã«ãæãåºããããšãã§ããŸãã ãã«ãã¿ã¹ã¯ã·ã¹ãã ã§ã¯ãããã¯ãŸããŸãå°é£ã«ãªã£ãŠããŸãã
æãåçŽãªäŸãèããŠã¿ãŸãããã 9600ããŒãšããéåžžã«äœãé床ã§ã·ãªã¢ã«ããŒãããåä¿¡ããŸãã å®éã®é床ã¯é·å¹Ž250 KBaudã®é åã«ãããŸããããåé¡ã解決ããããã«é床ãèœãšãã ãã§ã¯ãªããè¶ äœéããŒãžã§ã³ãèããŠã¿ãŸãããã
ã·ãªã¢ã«ããŒãã«ã¯1ãã€ãããããŸã-ããã¯ç§ã®ãæ°ã«å ¥ãã®ããŒãèšå®ã§10ãããã§ãïŒ8ããŒã¿ããããããã³éå§ãšåæ¢ïŒã åèšã960ãã€ã/ç§ã§ãã 1000ã«åãäžããŸããããã¯1ããªç§ããã1ãã€ãã§ãã æé軞ã«ã€ãã³ããé 眮ããŸãã
å žåçãªã³ã³ãããŒã©ã次ã®ãã€ããå°çããåã«æ¬¡ã®ãã€ããåŠçããæéããªãå Žåãã©ã€ã³ããæ¥ãæ°ããå€ã«ãã£ãŠäžæžããããŸãã STM32ã³ã³ãããŒã©ãŒã®èª¬æããããã€ã¢ã°ã©ã ã§ããã®æ¬è³ªãæ€èšããŠãã ããã
ããã©ã«ãã§ã¯ãã¿ã¹ã¯ã¯1ããªç§ããšã«åãæ¿ããããŸãã 5ã€ã®ã¿ã¹ã¯ã®é 次åãæ¿ãã®å Žåãæé軞äžã«é 眮ããŸãããã
ã¿ã¹ã¯1ã§COMããŒããããŒãªã³ã°ããŸãã2ã€ã®å³ãçµã¿åãããŠã¿ãŸããã...
ã芧ã®ãšãããã·ãªã¢ã«ããŒãããã®4ãã€ãã¯ãããããåŸ æ©ããŠããã¿ã¹ã¯ãéã¢ã¯ãã£ããªãšãã«éä¿¡ãããŸãã 倧ããªããŒããŠã§ã¢ãã¥ãŒãæã€ã³ã³ãããŒã©ãŒããããŸãã ããšãã°ãESP8266ã¯ããŒããŠã§ã¢ãããã¡ãŒã§128ãã€ããåä¿¡ã§ããŸãã ãã®ãããªã³ã³ãããŒã©ã§èæ ®ãããç¶æ³ã¯äœããããŸãã-ã¿ã¹ã¯1ã¯ãæ©åšã«ãã£ãŠèç©ãããããŒã¿ãåãåããŸãã ãã ããããšãã°ããã¹ãŠã®STM32å ¥åãããã¡ã§ã¯ã1ãã€ããã䜿çšã§ããŸããã ãããŠã圌ãã«ãšã£ãŠãããŒãªã³ã°ã®æ»ã®ããã«ãã«ãã¿ã¹ã¯ç°å¢ã§ã·ãªã¢ã«ããŒããæäœããããšã¯ã9600ããã/ç§ã®ãããªãšãã§ããªãé床ã§ãåæ§ã§ãã
æ£ãã解決çã¯ããããã¡ã¡ã¢ãªã«å°çãããã€ããè¿œå ããŠãåŠçã¿ã¹ã¯ã倧éã«èç©ããããã¹ãŠãåŠçããããã«ããããšã§ãã ãŸãã¯ãããçš®ã®ååŠçïŒããšãã°ãé 延ãªãã§å¯èœãªå Žåã¯ãã±ããã®åæåæïŒãå®è¡ããåŠçæžã¿ã®ãã©ã¡ãŒã¿ãŒãåŠçã¿ã¹ã¯ã«è»¢éããŸãã
ãã¡ãããã»ãšãã©ã®èªè ã«æãè¿ããã®ãšããŠãã·ãªã¢ã«ããŒããåããäŸãéžæããŸããã å®éãã·ã³ã°ã«ã¿ã¹ã¯ç°å¢ã§ãããŒãªã³ã°ãåãå ¥ããããããã«ãã¿ã¹ã¯ç°å¢ã§ã¯äžå¯èœãªå Žåãå€ããããŸãã æåã«é ã«æµ®ãã¶ã®ã¯ããšã³ãžã³é床ãç¶æããããšã§ãã å®éã®ã±ãŒã¹ã¯ããšã³ãžã³ã1å転ããã2åã®ãã£ãŒãããã¯ãã«ã¹ãããæ¯åæ倧5,000å転ã®é床ã§å転ããããšã§ãã
å転é床ã枬å®ããããã®å žåçãªã¢ã«ãŽãªãºã ã®1ã€ã§ã¯ãã¿ã€ããŒã䜿çšããŠãããã®ãã«ã¹ã®ç¹°ãè¿ãåšæã枬å®ããå¿ èŠããããŸãã ã€ãŸããå°çæã«ã¿ã€ããŒãåããæ°ãã枬å®ã®ããã«ã¿ã€ããŒãåèµ·åããå¿ èŠããããŸãã ãã«ã¹ãå°çããŠããèªã¿åãå€ãååŸããããŸã§ã«ã©ã³ãã ãªæéãçµéãããšã枬å®ç²ŸåºŠãå€§å¹ ã«äœäžããŸãã ãããŠãã®å ŽåãåçŽã«å€§å¹ ã«äœäžããã®ã§ã¯ãªãã容èªã§ããªãã»ã©äœäžããŸãã
ç¶æ³ãæšå®ããŠã¿ãŸããã-æ¯å10,000ãã£ãŒãããã¯ãã«ã¹ã 60ã§é€ç®ãããšã167 Hzã«ãªããŸãã 5ããªç§ã«1ãã«ã¹ãããã¯ã枬å®ã®ç²ŸåºŠã倱ããªãããã«ãçºçããç¬éã«ã§ããéãè¿ãåŠçããå¿ èŠããããŸãã ã€ã³ãã«ã¹ã®å°çæéãäºæž¬ããããšã¯äžå¯èœã§ã-ãšã³ãžã³ã¯åœŒã«æºè¶³ããããã«å転ããŸãã 5ã€ã®ã¿ã¹ã¯ã®å Žåã次ã®ã¿ã¹ã¯ãžã®å¶åŸ¡ã®ç§»è¡ãåŸ ã€å¯èœæ§ã®ããæéã¯ããã«ã¹ç¹°ãè¿ãåšæã®åå以äžã§ãã ããšãã°ã次ã®ãããªç¶æ³ã§ãã
ã€ã³ãã«ã¹ãå°çããŠãã調æ»ãå®è¡ããã¿ã¹ã¯ãèµ·åãããŸã§ã«ã©ã®ãããæéãçµéãããã¯äžæã§ãã ã芧ã®ãšãããããã§ã¯ãå²ã蟌ã¿ã«ãã£ãŠã®ã¿ãããããçš®é¡ã®åççãªããŒã¿åŠçãå®è£ ã§ããŸãã è¡åãæ¥ãŠããã®å°çæå»ãèšæ¶ãããŠããããã§ã«åŠçäžã®ã¿ã¹ã¯ã¯ãã€ã§ããã®æéãå©çšã§ããŸãã
以äžããã
ãã«ãã¿ã¹ã¯ç°å¢ã§ã®äžæã¯åŒ·åãªã ãã§ãªããå€ãã®å Žåãæ©åšãæäœããããã®å¯äžã®å¯èœãªã¡ã«ããºã ã§ãã
RTOS MAXã§å²ã蟌ã¿ãåŠçããããã®äž»ãªã¡ã«ããºã
RTOS MAXã䜿çšããå Žåãå²ã蟌ã¿ã¯ã䟿å©ããšãé«éãã®2ã€ã®æ¹æ³ã§åŠçã§ããŸãã æåã«ãã¡ã€ã³ãªãã·ã§ã³ïŒã䟿å©ãïŒãšèŠãªããããã®ãæ€èšããŸãã
OSå ã§ã¯ãå ±éã®ã¿ã¹ã¯ãéçºãããŸããã Taskããç¶æ¿ããã®ã§ã¯ãªãã TaskIrqããç¶æ¿ããå¿ èŠããããŸãã äžæãçºçãããšããã«ä»ã®ãã¹ãŠã®ã¿ã¹ã¯ã眮ãæããå¿ èŠãããããããã®ã¿ã¹ã¯ã«ã¯é«ãåªå é äœãäžããããŸãã TaskIrqã¯ã©ã¹ã«ã¯ãIrqHandlerïŒïŒä»®æ³é¢æ°ãå«ãŸããŠããŸããããã¯ãå²ã蟌ã¿ã®åŠçã«é¢é£ãããã¹ãŠã®ã¢ã¯ã·ã§ã³ãããã«é 眮ããããšã§ãªãŒããŒã©ã€ãããå¿ èŠããããŸãã
åæåäžã«ãå²ã蟌ã¿ã³ã³ãããŒã©ãŒã®ããã°ã©ãã³ã°ãä»ããŠå²ã蟌ã¿ãæå¹ã«ããå¿ èŠããããŸãïŒæåŸã®2ã€ã®æ®µèœã§ãå²ã蟌ã¿ããšããèšèãäœåèšãããããæãã§ãããæ®å¿µãªãããããªãã§ã¯äœãèµ·ãããŸããïŒã èšç»ã¿ã¹ã¯ãèšå®ãããšãã¯ãç¹å¥ãªã¯ã©ã¹ããç¶æ¿ããããããåŠçããå²ã蟌ã¿èŠæ±ã®æ°ããã©ã¡ãŒã¿ãŒã®åœ¢åŒã§æå®ããå¿ èŠããããŸãã
ã€ããªãã®ãŒçã«ããã®ã¿ã¹ã¯ã®èª²é¡ã¯æ¬¡ã®ããã«è¡šãããšãã§ããŸãã
ãã®ãããåªå 床ãé«ãããå¿ èŠããããŸããä»ã®ã¿ã¹ã¯ãšå€ãããªãããããããã眮ãæããå¿ èŠããããããã¯åªå 床ã®å©ããåããŠè¡ãããŸãã 次ã«å®çšçãªäŸãèããŠã¿ãŸãããã ããã«å žåçãªã¿ã¹ã¯ããããŸã-ã·ãªã¢ã«ããŒãã«æ¥ç¶ãããç¡ç·ã¢ãžã¥ãŒã«ã®ãã³ãã©ãŒã ã芧ã®ãšãããå®éã«ã¯TaskIrqããç¶æ¿ãããŠãããIrqHandlerïŒïŒé¢æ°ã¯å®éã«ãããã¯ãããŠããŸãã
ããã¹ã
class PortRadioTask : public TaskIrq { public: PortRadioTask() : TaskIrq("Radio") {} virtual void IrqHandler(); };
ããããã®ã¿ã¹ã¯ã®è¿œå æ¹æ³ã§ãã
const int Radio_IrqNumber = EXTI15_10_IRQn; ... result = TaskIrq::Add(radio_task = new PortRadioTask, Radio_IrqNumber, Task::PriorityRealtime);
ç¡ç·ã¢ãžã¥ãŒã«ã®äŸã®NVICã»ããã¢ããã¯ããã®ã»ã¯ã·ã§ã³ã®ç¯å²å€ã§ãã ç§ã®æèŠã§ã¯ããã®äŸã§ã¯ããŸã説æçã§ã¯ãããŸããã çŽç²ã«èª¬æã®ããã«ãå¥ã®äŸã§ç¹å®ã®ããã»ããµã«å¯ŸããŠNVICãã©ã®ããã«æ§æãããŠãããã瀺ããŸãïŒåªå é äœãå€æŽããããšã¯ã§ããŸããããåªå é äœãå€æŽãããªãã·ã§ã³ã¯ç¹å¥ã«éžæãããŸãïŒã
NVIC_EnableIRQ(EXTI9_5_IRQn); NVIC_SetPriority(EXTI9_5_IRQn,1);
ã ããã ã¿ã¹ã¯ãèšè¿°ããããã®TaskIrqæ©èœããããã¯ãããã¿ã¹ã¯ãã¹ã±ãžã¥ãŒã©ãŒã«è¿œå ãããŸãã次ã¯äœã§ããïŒ ãããŠ-OSã®ã±ã¢ã å²ã蟌ã¿ãçºçãããšãå éšå²ã蟌ã¿ãã³ãã©ãŒèªäœãã¹ã±ãžã¥ãŒã©ãŒãåŒã³åºããŸãã 1-ã¿ã¹ã¯ãã¢ã¯ãã£ãã«ããŸãã ããã§éèŠãªã®ã¯ãã¿ã¹ã¯ã®åªå 床ãé«ã ãä»ã®ã¿ã¹ã¯ãæ··ã¿åãããšãä¿èšŒãããããšã§ãã ãããŠããã°ããããŠããïŒã¿ã¹ã¯ãåãæ¿ããããã«å¿ èŠïŒãIrqHandlerïŒïŒé¢æ°ãå¶åŸ¡ãç²åŸããŸãã ãã®é¢æ°ã®æ¬äœã«é 眮ãããã®ã¯ãã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã®åé¡ã§ãïŒããã¥ã¡ã³ãã®æ¬¡ã®éšåã§ã¯ãäžäœã¬ãã«ã®ãã©ã€ããæäœããããã®äžè¬çãªãœãªã¥ãŒã·ã§ã³ã«ã€ããŠèª¬æããŸãïŒã
æšæºãœãªã¥ãŒã·ã§ã³ïŒ
- ããŒã¿ãåä¿¡ããååŠçããéåžžã®åªå 床ã®ã¿ã¹ã¯ã®ã¡ãã»ãŒãžãã¥ãŒã«å ¥ããããšãã§ããŸãã
- ãŸãã¯ãéåžžã®åªå 床ã§ã¿ã¹ã¯ã®ã»ããã©ãã³ãã¯ããããšãå¯èœã§ã
å²ã蟌ã¿ãã³ãã©ã®ç°¡åãªäŸïŒ
Semaphore s_sema_radio_irq(0, 1); // void PortRadioTask::IrqHandler() { s_sema_radio_irq.Signal(); }
ã¡ã€ã³ã¡ã«ããºã ã®äœ¿çšæã«èµ·ããããåé¡
ã¡ã€ã³ã®å²ã蟌ã¿åŠçã¡ã«ããºã ã䜿çšããããšã§çºçããå¯èœæ§ã®ããåé¡ã¯ãã¹ãŠã1ã€ã®ããšã«é¢é£ããŠããŸãããã³ãã©ãŒã¿ã¹ã¯ãèµ·åããã«ã¯ãã¿ã¹ã¯ã³ã³ããã¹ããåãæ¿ããå¿ èŠããããŸãã æéãããããŸãã 2ã€ã®ã¿ã¹ã¯ãããã·ã¹ãã ã§ã®å®éã®äœæ¥ã§ã¯ããªã·ãã°ã©ã ã§ãåãæ¿ãã4.7ãã€ã¯ãç§ã§çºçããããšãããããŸããã äžè¬ã«ãæéã¯ãã«ããªãã·ã§ã³ãã¿ã¹ã¯ã®æ°ãããã³ãã®ä»ã®æ¡ä»¶ã«äŸåããŸãã ããã«æšå®ã®åºç€ãšããŠã10ãã€ã¯ãç§ãšããããªãçŸå®çã§ããªãäžžãå€ãåããŸãããã
ãã€ã¯ãã³ã³ãããŒã©ã«ãã£ãŠåŠçãããæ©åšã®å žåçãªã·ããªãªãããã€ãèŠãŠã¿ãŸãããã ç°¡åãªãã®ããå§ããŸãããã 250ãããããã®é床ã§ã·ãªã¢ã«ããŒããä»ããŠG-CODEã³ãã³ããåä¿¡ããCNCãã·ã³ã æ¢ã«è¿°ã¹ãããã«ãã·ãªã¢ã«ããŒãã§ã¯ããã€ãã¯10ãããïŒ8ããŒã¿ãããã«å ããŠãéå§ããããšåæ¢ãããïŒã§ãã åèšã§ããã€ãå°ççã¯25 kHzã§ãã 40ãã€ã¯ãç§ã§1ãã€ãã ãŸããã³ã³ããã¹ãã®åãæ¿ãã«ã¯10ãã€ã¯ãç§ããããŸãã
ãã€ã¯ãã³ã³ãããŒã©ïŒåŒ·åãª32ããããã€ã¯ãã³ã³ãããŒã©ïŒã®åäœæéã®4åã®1ã¯ãã³ã³ããã¹ãã®åãæ¿ãã«ã®ã¿äœ¿çšãããŸããããã¯ãGã³ãŒãã®è¡ã1ã€ãã€ãããªãé«å¯åºŠã®ã¹ããªãŒã ã«ãªãããã§ãã ããã¯åãå ¥ããããŸããïŒ å¯èœæ§ãé«ãã¯ãã
ããã«ã150 mm / sã®é床ã§å°å·ãã3Dããªã³ã¿ãŒã§1ããªã¡ãŒãã«ããã200ã¹ããããå¿ èŠãšããã¹ãããã³ã°ã¢ãŒã¿ãŒã䜿çšããã«ã¯ã30 kHzã®åšæ³¢æ°ã§åäœããå¿ èŠããããŸãã ããã¯4åã®1以äžã§ãã
Gã³ãŒãã¯ãã¹ãããã³ã°ã¢ãŒã¿ãŒãå¶åŸ¡ããåãã³ã³ãããŒã©ãŒã§æ¡çšãããŠããŸãã åèšãããšãå²ã蟌ã¿ãå ¥åããããã«ããã»ããµæéã®åå以äžããã§ã«å¿ èŠã§ãã
ãã¡ããããã®ãªãã·ã§ã³ã¯åãå ¥ããããŸãã ã
ããããäžæ¹ã§ã åãé床ã§åãã·ãªã¢ã«ããŒãã䜿çšããŸããã32ãã€ããã±ããã1ç§éã«4åéä¿¡ãããç¡ç·ã¢ãžã¥ãŒã«ã«æ¥ç¶ããŸãã ãããã£ãŠãããã»ããµã®è² è·ã¯1200ãã€ã¯ãç§ã®é·ãã®ã»ã¯ã·ã§ã³ã§å¢å ãããã®ãããªããŒã¯è² è·ã®æéã¯1ç§ã§4800ãã€ã¯ãç§ä»¥å ã«çºçããŸãã ããã¯æéã®4.8ïŒ ã§ãã åãå ¥ããããŸããïŒ ãããŠãã®å Žåã ã€ãŸããæšæºçãªæ¹æ³ã§åŠçããããã®ãã®ãªãã·ã§ã³ã¯åãå ¥ãããããšèããŠããŸãã
åæ§ã«ããã£ãŒãããã¯ä¿¡å·ãããšã³ãžã³é床ã決å®ããããã®åè¿°ã®ã¡ã«ããºã ã¯åãå ¥ããããªããšæšå®ã§ããŸã-ã¿ã€ããŒã¯ä¿¡å·ãå°çããç¬éã«å¯èœãªéãè¿ã¥ããã¹ãã§ãã ãŸãã湿床ã»ã³ãµãŒããã®èªã¿åãå€ã®ååŸã¯å®å šã«åãå ¥ããããŸãã åæã«ãã·ãªã¢ã«ããŒãããã®ããŒã¿ãæ¯ç§921ãããããã®é床ã§åŠçãããšãã¿ã¹ã¯ãåãæ¿ããã®ã«100ïŒ ã®æéãããããããåãå ¥ããããŸãã...ãŸããªã©ã§ãã Acceptable Unacceptableã²ãŒã ã¯é·æéãã¬ã€ã§ããŸãã äžè¬ååãå®åŒåããŸãããã
äžæããã£ãã«èµ·ãããªãå Žåããã®ãªãã·ã§ã³ã¯åãå ¥ããããŸãã
äžæãé »ç¹ã«çºçããŠã³ã³ããã¹ãã®åãæ¿ãã«100ïŒ ä»¥äžãããå Žåããã®ãªãã·ã§ã³ã¯åãå ¥ããããŸãã
ã³ã³ããã¹ãã®åãæ¿ãã«ãããæéã®å²åãé«ãå Žåãããã¯ãã£ãã«èµ·ããããååã«çãããŒã¹ãã§çºçããŸã-ãªãã·ã§ã³ã¯åãå ¥ãå¯èœã§ãã
é«åšæ³¢ã§ã®ã¹ã€ããã³ã°ãäžå®ã®å Žåããã®ãªãã·ã§ã³ã¯åãå ¥ããããŸããã
ã©ã®ãããªä»£æ¿åãæäŸã§ããŸããïŒ ãã¡ãããçŽæ¥å²ã蟌ã¿åŠçã
äž»ãªã¡ã«ããºã ãæåŠãã¹ãã§ã¯ãªãçç±
ããã¹ãŠã®å Žåã«çŽæ¥å²ã蟌ã¿åŠçãæäŸããªãã®ã¯ãªãã§ããïŒã RTOS MAXã®éçºè ã«ãŸã£ããåã質åãããŸããã æ®å¿µãªããã圌ãã®çãã¯è³ªçã§ãããæšæºåŠçãããã«äŸ¿å©ãªçç±ããããŸãã
ç°¡åãªãã®ããå§ããŸãããã å²ã蟌ã¿ãã³ãã©ãŒã®ååã ARMãã¡ããªå ã§ãããããã¯ç°ãªããŸãã STM32ãšMilanderãã¡ããªãŒã®æãé¡èãªéãã¯æ¬¡ã®ãšããã§ãã
STM32 | ãã©ã³ã㌠|
USART1_IRQHandler | UART1_IRQHandler |
TIM1_UP_TIM10_IRQHandler | Timer1_IRQHandler |
TIM2_IRQHandler | Timer2_IRQHandler |
移è¡äžã«ãããããæžãæããå¿ èŠããããŸãã åºæ¬çãªã¡ã«ããºã ã§ã¯ããã³ãã©ãŒã®ååã¯OSã®é¢å¿äºã§ãã ãããã¯ã¢ããªã±ãŒã·ã§ã³ããã°ã©ãããé ãããŠããŸãïŒãã¯ãã«ã®ååãé ãããŠããªãã®ã¯æ®å¿µã§ããããããªãã§ã¯ã§ããŸããïŒã
ããã«ãæšæºãã³ãã©ãŒã䜿çšãããšãéåžžã®ã¿ã¹ã¯ãåŒã³åºãããŸãã çã®å²ã蟌ã¿ãã³ãã©ã¯ãã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã®ç®ã«ã¯èŠããŸããã ãã³ãã©ãŒã¿ã¹ã¯ãèµ·åããã³ã³ããã¹ããåãæ¿ããå¿ èŠãããããšãã¹ã±ãžã¥ãŒã©ãŒã«éç¥ããŸãã ãã以å€ã¯ãã¹ãŠå ±éã®ã¿ã¹ã¯ã§ãã ããããäžæããããšããã¹ãŠãç°ãªããŸãã OSã®èª¬æïŒãªã¢ã«ã¿ã€ã ã§ãã£ãŠããWindowsã§ãã£ãŠãïŒãèŠããšãéåžžã«å€ãã®ã¡ã«ããºã ãå²ã蟌ã¿ãã³ãã©ãŒã§æ©èœããªãããšãããããŸãã RTOS MAXã®ã¡ã«ããºã ããã°ãã調ã¹ãŸãã
ããã€ãã®ãšã³ããªãé»è²ã§ãããšæãããçç±ãèŠãŠã¿ãŸãããïŒçµå±ãããæ¡ä»¶äžã§ã¯ãã¡ã«ããºã ã¯å©çšå¯èœã§ãïŒããèµ€è²ã§ããŒã¯ãããŠããŸãã ãããã®ã¡ã«ããºã ãå®è£ ããå Žåãé¢æ°ãåå ¥åããå¯èœæ§ãæé€ããå¿ èŠããããŸãã ãã®ãããã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ããã®äžã«é 眮ãããŸããããã¯ãæãåºãããã«ãåªå 床ãMAX_SYSCALL_INTERRUPT_PRIORITYãããäœããã¹ãŠã®å²ã蟌ã¿ããããã¯ããŸãã å®éãããã ãã§ãã äžæã¯äžæçã«çŠæ¢ãããŠããŸãã ã€ãŸããçŽæ¥å²ã蟌ã¿åŠçã®æ©æµã¯åããŸããã äžæ¹ãã¡ã€ã³ã®å²ã蟌ã¿åŠçãšã³ãžã³ã§å©çšå¯èœãªãã¹ãŠã®èšåã¯å€±ãããŸãã äžè¬ã«ãã¡ã€ã³ã®å²ã蟌ã¿åŠçã¡ã«ããºã ãçŽæ¥ã®ã¡ã«ããºã ã«åªå ããŠæåŠããç¶æ³ã§ã¯ãã»ããã©ãèšå®ã§ãããã¡ãã»ãŒãžãã¥ãŒã䜿çšã§ããŸããã ãããã£ãŠãè¡šã§ã¯èµ€ã§ããŒã¯ãããŠããŸãã
ãããã£ãŠãOSã®ãã¹ãŠã®æ©èœã䜿çšã§ããå Žåã¯ããããã䜿çšããæ¹ãããç°¡åã§ãããããã極端ã«å¿ èŠãªå Žåã«ã®ã¿å²ã蟌ã¿ã®çŽæ¥åŠçã«é²ã¿ãŸãã
çŽæ¥å²ã蟌ã¿åŠç
çŽæ¥å²ã蟌ã¿åŠçã§ã¯ãåå¿é床ã¯ãã€ã¯ãã³ã³ãããŒã©ãŒã®æ©èœã«ãã£ãŠã®ã¿æ±ºå®ãããŸãã åãããžã§ã¯ãã§äœ¿çšå¯èœãªstartupXXXX.sãã¡ã€ã«ããå²ã蟌ã¿ãã³ãã©ãŒã®ãªã¹ããååŸãããšäŸ¿å©ã§ãã PinListAndTimerDemoãã¢ã¢ããªã±ãŒã·ã§ã³ã¯ãã¿ã€ããŒ2ããã®å²ã蟌ã¿ãåŠçããŸãããã³ãã©ãŒã®ååããã°ããèŠã€ããæ¹æ³ãèŠãŠã¿ãŸãããã
0
ãã³ãã©ãŒã®ååããããã°ã次ã®ã«ãŒã«ã䜿çšããŠãããè¡ãã®ã¯éåžžã«ç°¡åã§ãã
- cppãã¡ã€ã«ïŒC ++ã³ãŒãïŒã«ããå Žåã¯ã externâ Câãã¬ãã£ãã¯ã¹ãè¿œå ããå¿ èŠããããŸãã ããããªããšãé¢æ°åã¯C ++ã«ãŒã«ã«åŸã£ãŠåœ¢æãããã·ã¹ãã ã¯å²ã蟌ã¿ãã³ãã©ã眮ãæããŠããããšãç解ããŸããã
- æ»ãå€ã®åã¯ç¡å¹ã§ãã
- åŒæ°ã¯ãããŸããã
ãããã£ãŠãåè¿°ã®äŸã§ã¯ãéå§ã³ãŒãã®ã¿ã€ããŒ2ããã®å²ã蟌ã¿ãã³ãã©ãŒã¯æ¬¡ã®ããã«ååãä»ããããŠããŸãã
ãããŠãåŠçæ©èœãããããã
extern "C" void TIM2_IRQHandler (void) { ...
ãã®ãããªå²ã蟌ã¿ã®ãã³ãã©ãŒã¯ã§ããã ãæ©ãå®è¡ããå¿ èŠãããããšãèŠããŠããããšãéèŠã§ãã ããã°ã©ã ããã³ãã©ãŒã«ããéãä»ã®ãã¹ãŠã®ã¿ã¹ã¯ã¯æ©èœãããåªå é äœã®äœãå²ã蟌ã¿ã¯ãããã¯ãããŸãã
å²ã蟌ã¿ãã³ãã©ãŒã¯ãããŒã¿ããã°ããåãå ¥ããããã«åŠçããããã«ããŒã¿ãæ¿å ¥ããããã«äœæ¥ãåæ¢ããå¿ èŠããããŸãã è€éãªèšç®ããå²ã蟌ã¿ãã³ãã©ã§ã®ãã®ä»ã®äœåãªäœæ¥ãèŠã€ããå¿ èŠã¯ãããŸããã
å²ã蟌ã¿ãã¡ã€ã³ã¿ã¹ã¯ã«æ¥ç¶ããããã®äŸ¿å©ãªã¡ã«ããºã ã¯ããªã³ã°ãããã¡ã§ãã å²ã蟌ã¿ã¯ãåä¿¡ããããŒã¿ãå°çãããšããã«å ¥ããäžéšã®ã¿ã¹ã¯ã¯ãããåãåããåŠçé床ãæ°ã«ããã«äœ¿çšããŸãã
mcucppã©ã€ãã©ãªã®ãªã³ã°ãããã¡ãŒ
è£å©ã©ã€ãã©ãªãšããŠäœ¿çšãããKonstantin Chizhovã®mcucppã©ã€ãã©ãªã«ã¯ããã§ã«ãªã³ã°ãããã¡ã®å®è£ ãå«ãŸããŠããŸãã ããã¥ã¡ã³ãã®æ¬¡ã®éšåã§ã©ã€ãã©ãªã«ã€ããŠå€ãã®ããšãè¿°ã¹ãŸãããä»ã®ãšããããã¡ã€ã«ring_buffer.hãèããŠã¿ãŸãããã
RingBufferã¯ã©ã¹ã¯ãäœæ¥ã§newæŒç®åã䜿çšããŠåèŠçŽ ãè¿œå ããããããªã¢ã«ã¿ã€ã ã¢ããªã±ãŒã·ã§ã³ïŒããã³ç¹ã«å²ã蟌ã¿ïŒã§ã¯äœ¿çšã§ããŸããã ããããåãããããŒãã¡ã€ã«ã«ã¯ãRingBufferPO2ã¯ã©ã¹ãå«ãŸããŠããŸãããªã³ã°ãããã¡ãŒã®ãµã€ãºã¯2ã®ã¹ãä¹ã®åæ°ã§ãã ãã®ã¯ã©ã¹ã¯ãäºåã«å²ãåœãŠããããããã¡ãŒã§æ©èœããã ãã§ãªãããã€ã¯ãã³ã³ãããŒã©ãŒã³ãã³ãã·ã¹ãã ãèš±å¯ããã1ã€ã®ã©ã€ã¿ãŒã1ã€ã®ãªãŒããŒãã¹ããŒã ã«å¯ŸããŠã¹ã¬ããã»ãŒãã§ãïŒå±éºãªã«ãŠã³ã¿ãŒã¯ã¢ãããã¯ã¢ã¯ã»ã¹ã¯ã©ã¹ãä»ããŠæžã蟌ãŸããã»ãã¥ãªãã£ã¯æ¢ã«ãã®ã¯ã©ã¹ã«ãã£ãŠæ±ºå®ãããŠããŸãïŒã
ã¯ã©ã¹ã¯æ¬¡ã®ããã«å®çŸ©ãããŸãã
ãã³ãã¬ãŒã<size_t SIZEãã¯ã©ã¹Tãã¯ã©ã¹Atomic = VoidAtomic>
ã¯ã©ã¹RingBufferPO2
SIZE-èŠçŽ ã®æ°ã 2ã®çŽ¯ä¹ã®åæ°ã§ãªããã°ãªããŸãããããããªããšãã³ã³ãã€ã©ãŒã¯ãšã©ãŒãã¹ããŒããŸãã
Tã¯ãä¿åãããããŒã¿ã®ã¿ã€ãã§ãã ã¹ã«ã©ãŒãšæ§é ã®äž¡æ¹ãèš±å¯ãããŸãã
Atomic-æäœã®ååæ§ãä¿èšŒããã¯ã©ã¹ïŒæå®ãããŠããªãå Žåãååæ§ã¯æäŸãããŸããïŒã
ããŒã¿ãä¿åããããã®ãããã¡ã¯ãã¯ã©ã¹ã®ã¡ã³ããŒå€æ°ã§ãã ãããã£ãŠãã¯ã©ã¹ãªããžã§ã¯ãã¯ãååãªç©ºãé åïŒã¹ã¿ãã¯ãããŒããã°ããŒãã«ã¡ã¢ãªãç¹å¥ã«å®çŸ©ãããã¡ã¢ãªããŒã«ãªã©ïŒãããããŒã«ã«é 眮ããå¿ èŠããããŸãã
COMããŒãããåä¿¡ãããã€ãã®ãããã¡ãŒã®å®£èšäŸïŒ64æåïŒïŒ
Mcucpp::Containers::RingBufferPO2<64, uint8_t, Mcucpp::Atomic> bufFromUart; , <b>bool push_back(const T& value)</b>
çµæãfalseã®å Žåããããã¡ããã£ã±ãã§ãããããããŒã¿ã¯é 眮ãããŠããŸããã
éåžžãé¢æ°ã䜿çšããŠããã¥ãŒããããŒã¿ãããã·ã¥ããããŒã¿ãååŸããŸãã ã¹ã«ã©ãŒéã®å Žåãããã¯æ£åœåãããŸãããæ§é ã®å Žå-è¿œå ã®ã³ããŒæäœãå®è¡ãããŸã-ããŒã¿ã¯å€ãå Žæããåé€ããããããæ°ããå Žæã«ã³ããŒãããŸãã ãããããã³ããŒãé²ãããã«ãmcucppã©ã€ãã©ãªã®äœæè ã¯ãããã«ç°ãªãæ¹æ³ã䜿çšããŸããã ãã¥ãŒããã®ããŒã¿ã¯ããã·ã¥ãããŸããããèªã¿åãããŸãïŒããããžã®ãªã³ã¯ãååŸãããŸãïŒã ããŒã¿ãåé€ããã«ã¯ãå¥ã®æ©èœã䜿çšãããŸãã
ã¡ã€ã³ããŒã¿èªã¿åãé¢æ°ã¯ã次ã®ããã«åŒã³åºãããšãã§ããŸãã
const TïŒããã³ãïŒïŒconst
TïŒããã¯ïŒïŒ
ã芧ã®ãšãããããŒã¿ãžã®ãªã³ã¯ãè¿ããŸããã€ãŸãã ã³ããŒããŸããã
ãã¥ãŒå ã®ææ°ã®ã¢ã€ãã ãžã®ãªã³ã¯ãååŸã§ããŸãã
const TïŒbackïŒïŒconst
TïŒããã³ãïŒïŒ
ã€ã³ããã¯ã¹ã§ãã¥ãŒãæäœããããšãã§ããŸãïŒ
const TïŒæŒç®å[]ïŒsize_type iïŒconst
TïŒæŒç®å[]ïŒsize_type iïŒ
ããŠãèŠçŽ ãäžèŠã«ãªã£ãã ã次ã®é¢æ°ã䜿çšããŠãã¥ãŒããåé€ããå¿ èŠããããŸãã
bool pop_frontïŒïŒ
ãã¥ãŒã空ã®å Žåãé¢æ°ã¯falseãè¿ããŸãã
æ··éãšç©ºã®ãã¥ãŒããã§ãã¯ããããã®è£å©æ©èœããããŸãã
bool fullïŒïŒconst
bool emptyïŒïŒconst
çŸåšãã¥ãŒã«ããã¢ã€ãã ã®æ£ç¢ºãªæ°ã確èªã§ããŸãã
size_type sizeïŒïŒconst
æåŸã«ããã¥ãŒã®å®¹éã調ã¹ãããšãã§ããŸãïŒãã ããäžå®ã§ãããããã°ã©ã éçºã®æ®µéã§èšå®ãããŸãããåçãããã¡ãšã®äºææ§ã®ããã«ããããã®æ©èœã圹ç«ã€å ŽåããããŸãïŒã
size_type max_sizeïŒïŒ
size_type容éïŒïŒ
1ã€ã§ã¯ãªã2ã€ã®é¢æ°ãåŒã³åºãã¢ãããŒããã©ãã»ã©æªããã確èªããŸãããã é©åãªãã³ãããŒã¯ãååŸããã«ã¯ãã³ãŒããã©ã°ã¡ã³ããåå¥ã®åŒã³åºãã§ãã¬ãŒã åããŸãïŒå¯Ÿå¿ããè¡ãæ¶ããŸãïŒã
ããã¹ã
txtOuter.ShowSymbol('A'); txtOuter.ShowSymbol(bufFromUart.front()); bufFromUart.pop_front(); txtOuter.ShowSymbol('B');
察å¿ããã¢ã»ã³ãã©ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
ããã¹ã
00025c 2141 MOVS r1,#0x41 ;288
00025e a801 ADD r0,sp,#4 ;288
000260 f7fffffe BL _ZN9TextOuter10ShowSymbolEwb ; TextOuter::ShowSymbol(wchar_t, bool)
000264 484b LDR r0,|L4.916|
000266 2201 MOVS r2,#1 ;290
000268 f8901044 LDRB r1,[r0,#0x44] ;290
00026c f001013f AND r1,r1,#0x3f ;290
000270 5c09 LDRB r1,[r1,r0] ;290
000272 a801 ADD r0,sp,#4 ;290
000274 f7fffffe BL _ZN9TextOuter10ShowSymbolEwb ;
000278 f3bf8f4f DSB ;290
00027c 4845 LDR r0,|L4.916|
00027e 6c02 LDR r2,[r0,#0x40] ;290
000280 6c41 LDR r1,[r0,#0x44] ;290
000282 428a CMP r2,r1 ;290
000284 d001 BEQ |L4.650|
000286 1c49 ADDS r1,r1,#1 ;290
000288 6441 STR r1,[r0,#0x44] ;290
|L4.650|
00028a 2201 MOVS r2,#1 ;293
00028c 2142 MOVS r1,#0x42 ;293
00028e a801 ADD r0,sp,#4 ;293
000290 f7fffffe BL _ZN9TextOuter10ShowSymbolEwb ;
ã芧ã®ãšããããªããã£ãã€ã¶ãŒã¯é¢æ°åŒã³åºããè¡ããããã¹ãŠãçŽç·çã«é 眮ããŸããã ãŸããã³ãŒãã®å質ã¯ã1ã€ãŸãã¯2ã€ã®é¢æ°ãããã°éãã¯ãããŸããã æ§é ã䜿çšããå Žåãã³ããŒã¯è¡ãããªãããã§ãã
ãªã³ã°ãããã¡ã®äŸ
å®éããã®äŸã¯åçŽã§ãã COMããŒãããã®ããŒã¿ããããã¡ãªã³ã°ããäŸãšããŠèããŠãã ããã ããã¥ã¡ã³ãã®ç¬¬3éšã§ã¯ãCOMããŒããšãã®å²ã蟌ã¿ã®è©³çŽ°ãªæäœãæ€èšããŸãã 64èŠçŽ ã®ãããã¡ãŒã宣èšããŸãïŒå¹³å30æåã®è¡ãåŠçãããå Žåããã®ãããªãããã¡ãŒã¯ç¢ºå®ã«ãªãŒããŒãããŒããªããšçŽæçã«å€æããŸããïŒã
#include <ring_buffer.h> #include <atomic.h> ... Mcucpp::Containers::RingBufferPO2<64, uint8_t, Mcucpp::Atomic> bufFromUart;
å²ã蟌ã¿ãã³ãã©ãŒã§ããããã¡ãŒã«ããŒã¿ãå ¥ããŸãã
bufFromUart.push_back (Buf[i]);
ãããŠãã¿ã¹ã¯ã®1ã€ã§ã¯ããšããã次ã®ãããªã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
while (!bufFromUart.empty()) { char ch = bufFromUart.front(); bufFromUart.pop_front(); ...
ããŒã¿ãäžæžããããå¿é ã¯ãããŸããïŒèšããŸã§ããªãããã¥ãŒã®ãµã€ãºã¯ãªãŒããŒãããŒããªãããã«ååã§ãªããã°ãªããŸããïŒã ããŠãåãåã£ããã£ã©ã¯ã¿ãŒchã§ããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã ãã¥ãŒã空ã®å Žåãæå®ãããã«ãŒããžã®ãšã³ããªã¯çºçããŸããã
æ··åå²ã蟌ã¿åŠç
æ··ä¹±ãé¿ããããã«ãç°¡åãªãã¬ãŒãºããå§ããŸããå²ã蟌ã¿ã®åŠçãéå§ããããã«å¿ èŠãªãã®ã¯ãã¹ãŠæ¢ã«èª¬æãããŠããŸãã ä»ã®ãã¹ãŠã¯ãã§ã«æ²æé£è¡ã§ãã ããããæãæ£ããããšã¯ãæåã«2ã€ã®æ¥µç«¯ãªæ¹æ³ïŒãã£ãããšäŸ¿å©ã«ããŸãè¿ éã«ãããŸã䟿å©ã§ã¯ãªãïŒãç¿åŸããŠãããã»ã¯ã·ã§ã³ã®ãã®éšåã®èªã¿åãã«æ»ãããšã§ãã
äžæãåŠçããæ¹æ³ã¯ããŸããŸã§ãã æåã«ããã³ãã©ãŒãæžãçŽãããéèŠãªã¢ã¯ã·ã§ã³ãæåã«å®è¡ããã次ã«éåžžã®é«åªå 床ã¿ã¹ã¯ãã¢ã¯ãã£ãåãããŸãã ç¹ã«ãåšæ³¢æ°æž¬å®ã®å Žåããã®ãã³ãã©ãŒã§ã¯ãå®éã®ã¿ã€ããŒå€ã¯è¶³ããã®å²ã蟌ã¿ã®ç¬éã«ååŸã§ãããã®åŸã¿ã€ããŒã¯æ¬¡ã®æž¬å®ã®ããã«éå§ããããã®åŸãã¿ã€ããŒããåãåã£ãå€ã®åŠçã®åé¡ã¯éåžžã®ã¿ã¹ã¯ã«å§ä»»ãããŸãã ãŸãããããŠä»ã®ãã®ã å³æã®åå¿ãéèŠã§ãããã³ã³ããã¹ãã®åãæ¿ãã«æéãããããšããäºå®ãéèŠã§ãªãå Žåã¯ããã®æ¹æ³ã䜿çšã§ããŸãã
ããã§ãTaskIrqã«ãã£ãŠçæãããã¿ã¹ã¯ãäœæããç¬èªã®å²ã蟌ã¿ãã³ãã©ãŒãäœæãããã®äžã§ã¿ã€ã ã¯ãªãã£ã«ã«ãªã¢ã¯ã·ã§ã³ãå®è¡ããŸãã...次ã«äœãããŸããïŒ
ãããŠã MaksIrqHandlerïŒïŒé¢æ°ãåŒã³åºãå¿ èŠããããŸãã ãã®é¢æ°ã¯ãã³ã³ããã¹ãåãæ¿ããéå§ããå²ã蟌ã¿é¢é£é¢æ°ãžã®å¶åŸ¡è»¢éãè¡ããŸãã
ããã¹ã
extern "C" { extern void MaksIrqHandler (); void EXTI15_10_IRQHandler() { if (EXTI_GetITStatus(EXTI_Line13) != RESET) { /* Clear interrupt flag - , ! */ EXTI_ClearITPendingBit(EXTI_Line13); // MaksIrqHandler (); } } }
ä»®æ³å²ã蟌ã¿
ãããŠæåŸã«ãå²ã蟌ã¿ã«çŽæ¥é¢é£ããŠããªãããå²ã蟌ã¿ã«é¢é£ä»ããããŠããã¡ã«ããºã ãæ€èšããŸãã ãã®ã¡ã«ããºã ã¯ãå¿ é ã§ã¯ãªããããã°ã©ãã«è¿œå ã®è¡šçŸæ å ±ãæäŸããã ãã§ãã
ã¿ã¹ã¯ãäœæãããšãã TaskIRQåŸç¶ã¯ã©ã¹ã« ãå®éã«ã¯ååšããªãå²ã蟌ã¿çªå·ãå²ãåœãŠãããšãã§ããŸãã FIRST_VIRT_IRQå€ããã倧ããããå¿ èŠããããŸãïŒARMã¢ãŒããã¯ãã£ã®å Žåããã®å€ã¯0x100ã§ãããä»ã®ã¢ãŒããã¯ãã£ã®å Žåã¯ç°ãªãå ŽåããããŸãïŒã
ãã®ãããªã¿ã¹ã¯ã¯å®éã®å²ã蟌ã¿ã«é¢é£ä»ããããŠããããã«ãŒãã«ã«ãã£ãŠèªåçã«ã¢ã¯ãã£ãåãããããšã¯ãããŸããã ãã ããããã°ã©ãã¯ãã€ã§ãé¢æ°ãåŒã³åºãããšãã§ããŸãã
void ProceedIrqïŒint irq_numïŒ;
ãã®åŸãã¿ã¹ã¯ã¯ãäžæã«é¢é£ããã¿ã¹ã¯ã®ã¢ã¯ãã£ãåã®ãã¹ãŠã®ååã«åŸã£ãŠã¢ã¯ãã£ãåãããŸãã ãªãã§ïŒ ãªãã·ã§ã³ã¯ããããæãçŽ æŽãããã§ãã ããšãã°ã1ã€ã®ãã¯ã¿ãŒã§è€æ°ã®ããã€ã¹ãããã³ã°ãããå Žåãåãç©çå²ã蟌ã¿ãã³ãã©ãŒããè€æ°ã®ç°ãªããã³ãã©ãŒã¿ã¹ã¯ãåŒã³åºãããšãã§ããŸãïŒIRQã©ã€ã³ã®ç¯å²ãåºããŠããã³ã³ãããŒã©ãŒéçºè ã§ããåŒã³åºããçµã¿åãããããšãã§ããŸãïŒã äžè¬ã«ãOSéçºè ã®1人ã説æããããã«ããã¡ã«ããºã ã¯å¯ä»ãããŸããããªã䜿çšããªãã®ã§ããïŒã ProceedIrqïŒ ïŒé¢æ°ã¯ããããã«ããŠãã·ã¹ãã ã®å éšããŒãºã«å¿ èŠã§ãã
ããã«é¢ããŠãäžæ žã®æ€èšã¯ãã©ãããå®äºãããšèŠãªãããšãã§ããŸãã ãã©ã€ããŒã¯å è¡ããŠããŸãããããã¥ã¢ã«ã®ç¬¬2å·»ã§ã¯ãããã«ã€ããŠèª¬æããŠããŸãã