
åœç€Ÿã®è£œåã§äœ¿çšãããããã»ããµã¯ãäž»ã«16ãããããã³32ãããã®Microchipãã€ã¯ãã³ã³ãããŒã©ãŒã§ã8ã32 kBã®RAMã128ã512 kBã®ROMãMMUãªãã§ãã æã«ã¯ãæãåçŽãªããã€ã¹ã®å Žåãããã«æ§ãããª8ããããããã䜿çšãããŸãã
æããã«ãLinuxã«ãŒãã«ã䜿çšããïŒåççãªïŒæ©äŒã¯ãããŸããã ãããã£ãŠãäœããã®RTOSïŒãªã¢ã«ã¿ã€ã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ïŒãå¿ èŠã§ãã ãã€ã¯ãã³ã³ãããŒã©ã§OSã䜿çšããªã人ãããŸãããããã¯è¯ãç¿æ £ã§ã¯ãããŸãããããŒããŠã§ã¢ãOSã®äœ¿çšãèš±å¯ããŠããå Žåãããã䜿çšããŸãã
æ°å¹Žåã8ããããããã匷åãª16ããããã€ã¯ãã³ã³ãããŒã©ãŒã«åãæ¿ãããšããç§ãããçµéšè±å¯ãªååãTNKernelããªãšã³ããã£ãRTOSãæšå¥šããŸãã ã ããããç§ãæ°å¹ŽéããŸããŸãªãããžã§ã¯ãã§äœ¿çšããOSã§ãã
圌女ã«ãšãŠãæºè¶³ããŠããããã§ã¯ãããŸãããããšãã°ãã¿ã€ããŒã¯ãããŸããã ãŸããã¹ã¬ãããäžåºŠã«è€æ°ã®ãã¥ãŒããã®ã¡ãã»ãŒãžãåŸ æ©ããããšã¯ã§ããŸããã ãŸããã¹ã¿ãã¯ã®ãœãããŠã§ã¢å¶åŸ¡ãªãŒããŒãããŒã¯ãããŸããïŒå®éã«æ°ã«ãªããŸãïŒã ããããããŸããã£ãã®ã§ãç§ã¯ããã䜿ãç¶ããŸããã
æŒãåºãOSã®ä»çµã¿
ããªããšç§ããäºããç解ããŠããããšã確èªããããã«ãããªãšã³ããã£ãOSãåççã«ã©ã®ããã«æ©èœããããç°¡åã«èª¬æããŸãã ããã§èšå®ããŠããããšãèªè ã«ãšã£ãŠããããªããšã§ããå Žåã¯ãç³ãèš³ãããŸããã
è€æ°ã®ã¹ã¬ãããéå§ãã
ãã€ã¯ãã³ã³ãããŒã©ãŒã¯ãã·ã³ã°ã«ã¹ã¬ãããã§ããäžåºŠã«å®è¡ã§ããåœä»€ã¯1ã€ã ãã§ãïŒãã¡ããããã«ãã³ã¢ããã»ããµãŒããããŸãããçŸåšã§ã¯ããã§ã¯ãããŸããïŒã ã·ã³ã°ã«ã³ã¢ããã»ããµã§è€æ°ã®ã¹ã¬ãããå®è¡ããã«ã¯ãã¹ã¬ãããåãæ¿ããå¿ èŠãããããããŠãŒã¶ãŒã¯ã¹ã¬ããã䞊åã«å®è¡ããŠããããã«èŠããŸãã

ããã¯ãOSãæåã«å¿ èŠãªãã®ã§ããã€ãŸããã¹ã¬ããéã§å¶åŸ¡ãåãæ¿ããŸãã 圌女ã¯ã©ã®ããã«ãããããŸããïŒ
ãã€ã¯ãã³ã³ãããŒã©ã«ã¯ã¬ãžã¹ã¿ã®ã»ããããããŸãã ãªããªã ãã€ã¯ãã³ã³ãããŒã©ã¯ã·ã³ã°ã«ã¹ã¬ããã§ããããã®ã¬ãžã¹ã¿ã»ããã¯1ã€ã®ã¹ã¬ããã«ã®ã¿å±ããŸãã ããšãã°ã2ã€ã®æ°å€ã®åèšãèŠã€ããå ŽåïŒ
//-- assume we have two ints: a and b int c = a + b;
å®éã次ã®ãããªããšãèµ·ãããŸãïŒãã¡ãããã¢ã¯ã·ã§ã³ã®ç¹å®ã®ã·ãŒã±ã³ã¹ã¯ã¢ãŒããã¯ãã£ã«ãã£ãŠç°ãªããŸãããäžè¬çã«ã¯èãæ¹ã¯å€ãããŸããïŒã
# the MIPS disassembly: LW V0, -32744(GP) # a RAM V0 LW V1, -32740(GP) # b RAM V1 ADDU V0, V1, V0 # V1 V0 , V0 SW V0, -32496(GP) # V0 RAM ( c)
4ã€ã®ã¢ã¯ã·ã§ã³ããããŸãã ãªããªã ããªãšã³ããã£ãOSã§ã¯ã1ã€ã®ã¹ã¬ããããã€ã§ãå¥ã®ã¹ã¬ããã«åã£ãŠä»£ããããšãã§ããŸãããã¡ãããããã¯ãã®ã·ãŒã±ã³ã¹ã®éäžã§çºçããå¯èœæ§ããããŸãã åèšã®å€ãã¬ãžã¹ã¿V0ããã³V1ã«ããŒããããåŸãå¥ã®ã¹ã¬ãããçŸåšã®ã¹ã¬ãããæ··éãããŠãããšæ³åããŠãã ããã æ°ããã¹ã¬ããã«ã¯ç¬èªã®æ©èœããããããå¿ èŠã«å¿ããŠãããã®ã¬ãžã¹ã¿ã䜿çšããŸãã ãã¡ããã2ã€ã®ã¹ã¬ãããäºãã«å¹²æžããªãããã«ããå¿ èŠããããŸãããããã£ãŠãæåã®ã¹ã¬ãããåã³å¶åŸ¡ãååŸãããšããã¬ãžã¹ã¿V0ããã³V1ïŒããã³ãã®ä»ïŒã®å€ã¯ãæ··éããåãšåãã§ããå¿ èŠããããŸãã
ãã®ãããã¹ããªãŒã Aããã¹ããªãŒã Bã«åãæ¿ããå ŽåããŸããã¹ããªãŒã Aã®ãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ãã©ããã«ä¿åããŠãããã¹ããªãŒã Bã®ãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ã埩å ããå¿ èŠããããŸãããã®åŸãã¹ããªãŒã Bãå¶åŸ¡ãååŸããåäœãç¶ç¶ããŸãã
ãããã£ãŠãããæ£ç¢ºãªãããŒã¹ã€ããã³ã°å³ã¯æ¬¡ã®ããã«ãªããŸãã

ããã¹ã¬ããããå¥ã®ã¹ã¬ããã«åãæ¿ããå¿ èŠãããå Žåãã«ãŒãã«ãå¶åŸ¡ãååŸããå¿ èŠãªãµãŒãã¹ã¢ã¯ã·ã§ã³ïŒå°ãªããšããã¬ãžã¹ã¿ã®å€ãä¿åããã³åŸ©å ïŒãå®è¡ããŠãããå¶åŸ¡ã次ã®ã¹ã¬ããã«è»¢éãããŸãã
åã¹ããªãŒã ã®ã¬ãžã¹ã¿å€ã¯æ£ç¢ºã«ã©ãã«ä¿åãããŸããïŒ å€ãã®å Žåãããã¯ã¹ã¬ããã¹ã¿ãã¯ã§ãã
ã¹ããªãŒã ã¹ã¿ãã¯
ææ°ã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¯ãMMUã®ãããã§ïŒãŠãŒã¶ãŒïŒã¹ã¿ãã¯ãåçã«æé·ããŸããã¹ã¬ãããå¿ èŠã«ãªãã»ã©ãã¹ã¬ãããå¢ããŸãïŒã«ãŒãã«ãèš±å¯ããå ŽåïŒã ããããç§ã䜿çšããŠãããã€ã¯ãã³ã³ãããŒã©ãŒã«ã¯ãã®èŽ æ²¢ã¯ãããŸããããã¹ãŠã®RAMã¯ã¢ãã¬ã¹ç©ºéã«éçã«ããããããŸãã ãããã£ãŠãåã¹ã¬ããã¯ãã¹ã¿ãã¯ã«äœ¿çšãããç¬èªã®RAMãååŸããŸãã ãŸããã¹ã¬ãããå²ãåœãŠããããããå€ãã®ã¹ã¿ãã¯ã䜿çšãããšãã¡ã¢ãªãç Žæãããã®çµæãäžæ£ãªæäœãçºçããŸãã å®éãåã¹ã¬ããã®ã¹ã¿ãã¯ã¹ããŒã¹ã¯åãªããã€ãã®é åã§ãã
ç¹å®ã®åã¹ã¬ãããå¿ èŠãšããã¹ã¿ãã¯ã®éã決å®ããå Žåãæåã«å¿ èŠãªã¹ã¿ãã¯ã®éãææ¡ããããçšåºŠäœè£ãæã£ãŠååŸããŸãã ããšãã°ãæ·±ãåã蟌ãŸããGUIã¹ããªãŒã ã®å Žåãæ°ãããã€ããå¿ èŠã«ãªãå ŽåããããŸããããŠãŒã¶ãŒå ¥åãåŠçããå°ããªã¹ããªãŒã ã®å Žåã¯ãæ°çŸãã€ãã§ååã§ãã
3ã€ã®ã¹ã¬ãããããããããã®ã¹ã¿ãã¯æ¶è²»éã次ã®ãšããã§ãããšä»®å®ããŸãããã

æ¢ã«ç€ºããããã«ãåã¹ã¬ããã®ã¬ãžã¹ã¿å€ã®ã»ããã¯ããã®ã¹ã¬ããã®ã¹ã¿ãã¯ã«ä¿åãããŸãã ãã®ã¬ãžã¹ã¿å€ã®ã»ããã¯ãã¹ããªãŒã ã³ã³ããã¹ããšåŒã°ããŸã ã 次ã®å³ã¯ãããåæ ããŠããŸãïŒã¢ã¯ãã£ããªãããŒã¯ã¢ã¹ã¿ãªã¹ã¯ã§ç€ºãããŠããŸãïŒïŒ

ã¢ã¯ãã£ããªã¹ã¬ããïŒã¹ã¬ããAïŒã®ã³ã³ããã¹ãã¯ã¹ã¿ãã¯ã«ä¿åãããªãããšã«æ³šæããŠãã ããã ãã€ã¯ãã³ã³ãããŒã©ãŒã®ã¹ã¿ãã¯ãã€ã³ã¿ãŒã¯ãã¹ããªãŒã Aã®ãŠãŒã¶ãŒããŒã¿ã®å é ãæãããã€ã¯ãã³ã³ãããŒã©ãŒã®ã¬ãžã¹ã¿ã»ããå šäœãã¹ããªãŒã Aã«å±ããŸãïŒå®éãã¹ããªãŒã ã«é¢é£ããªãç¹å¥ãªã¬ãžã¹ã¿ããŸã ååšããå¯èœæ§ããããŸãããããã¯ä»ã§ã¯èå³ã®å¯Ÿè±¡ã§ã¯ãããŸããïŒã
ã«ãŒãã«ã¯ãå¶åŸ¡ãã¹ã¬ããAããã¹ã¬ããBã«åãæ¿ããããšã決å®ãããšã次ã®ããšãè¡ããŸãã
- ãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ãã¹ã¿ãã¯ïŒã€ãŸããã¹ã¬ããAã®ã¹ã¿ãã¯ïŒã«ä¿åããŸãã
- ã¹ã¿ãã¯ãã€ã³ã¿ãŒãã¹ããªãŒã Bã¹ã¿ãã¯ã®å é ã«åãæ¿ããŸãã
- ã¹ã¿ãã¯ããïŒã€ãŸããã¹ã¬ããBã®ã¹ã¿ãã¯ããïŒãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ã埩å ããŸãã
ãã®åŸã次ã®ãã®ããããŸãã

ã¹ããªãŒã Bã¯åŒãç¶ãäºæ¥ã«åãæãããŸãã
äžæ
äžæãšããéåžžã«éèŠãªãããã¯ã«ã€ããŠã¯ãŸã 觊ããŠããŸããã
å²ã蟌ã¿ãšã¯ãçŸåšå®è¡äžã®ã¹ã¬ãããïŒã»ãšãã©ã®å Žåãå€éšã€ãã³ããåå ã§ïŒäžæãããããã»ããµãïŒå²ã蟌ã¿ãåŠçããããã«ïŒãã°ããä»ã®äœãã«åãæ¿ããŠãããå²ã蟌ã¿ãåããã¹ã¬ããã«æ»ãããšã§ãã å²ã蟌ã¿ã¯ãã€ã§ãçæãããå¯èœæ§ããããããããã«åããå¿ èŠããããŸãã
éåžžãçµã¿èŸŒã¿ã·ã¹ãã ã«äœ¿çšããããã€ã¯ãã³ã³ãããŒã©ãŒã«ã¯ãã¿ã€ããŒããã©ã³ã·ãŒããŒïŒUARTãSPIãCANãªã©ïŒãADCãªã©ã®å€ãã®åšèŸºæ©åšããããŸãã ãã®åšèŸºæ©åšã¯ãç¹å®ã®ã€ãã³ããçºçãããšãã«å²ã蟌ã¿ãçæã§ããŸããããšãã°ãUARTåšèŸºæ©åšã¯ãæ°ãããã€ããåä¿¡ãããšå²ã蟌ã¿ãçæã§ãããããããã°ã©ã ã¯ã©ããã«ä¿åã§ããŸãã ã¿ã€ããŒã¯ãªãŒããŒãããŒå²ã蟌ã¿ãçæãããããããã°ã©ã ã¯ãããããã€ãã®å®æçãªã¿ã¹ã¯ãªã©ã«äœ¿çšã§ããŸãã
å²ã蟌ã¿ãã³ãã©ãŒã¯ISRïŒå²ã蟌ã¿ãµãŒãã¹ã«ãŒãã³ïŒãšåŒã°ããŸãã
å²ã蟌ã¿ã«ã¯ããŸããŸãªåªå é äœããããŸããããšãã°ãããçš®ã®äœåªå é äœã®å²ã蟌ã¿ãçæããããšãå®è¡äžã®ã¹ã¬ãããäžæãããISRãå¶åŸ¡ãåŒãç¶ããŸãã ããã§ãé«åªå 床ã®å²ã蟌ã¿ãçæããããšãçŸåšã®ISRãåã³äžæåæ¢ãããæ°ããå²ã蟌ã¿ã®ISRãå¶åŸ¡ãåŒãç¶ããŸãã æããã«ããããçµäºãããšãæåã®ISRã¯äœæ¥ãç¶è¡ãããããçµäºãããšãæçµçã«å¶åŸ¡ã¯äžæãããã¹ããªãŒã ã«æ»ãããŸãã
å²ã蟌ã¿ãåãå ¥ããããªãçãæéããããŸããããšãã°ãISRã§å€æŽãããå¯èœæ§ã®ããããŒã¿ãåŠçããå Žåã§ãã ãã®ããŒã¿ãè€æ°ã®ã¹ãããã§åŠçãããšãåŠçã®éäžã§å²ã蟌ã¿ãçºçããããŒã¿ãå€æŽãããå¯èœæ§ããããŸãã ãã®çµæãã¹ããªãŒã ã¯éæŽæ°ããŒã¿ãåŠçããããã°ã©ã ã®èª€åäœã«ã€ãªãããŸãã
ãããã®çãæéã¯ãã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ããšåŒã°ããŸããã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã«å ¥ããšå²ã蟌ã¿ãçŠæ¢ãããçµäºãããšå²ã蟌ã¿ãæå¹ã«ãªããŸãã ã€ãŸããã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³å ã§äœããã®çš®é¡ã®å²ã蟌ã¿ãçæãããå ŽåãISRã¯ïŒå²ã蟌ã¿ãèš±å¯ããããšãïŒåºå£ããã®ã¿åŒã³åºãããŸãã
éåžžã«èå³æ·±ã質åïŒISRã¹ã¿ãã¯ãã©ãã«ä¿åããŸããïŒ
å²ã蟌ã¿ã¹ã¿ãã¯
äžè¬ã«ã2ã€ã®ãªãã·ã§ã³ããããŸãã
- äžæãããã¹ã¬ããã¹ã¿ãã¯ã䜿çšããŸãã
- å²ã蟌ã¿çšã«å¥ã®ã¹ã¿ãã¯ã䜿çšããŸãã
äžæãããã¹ã¬ããã®ã¹ã¿ãã¯ã䜿çšãããšã次ã®ããã«ãªããŸãïŒæ¬¡ã®å³ã§ã¯ãã¹ã¬ããBãäžæãããŸãïŒã

å²ã蟌ã¿ãçæããããšãïŒ
- çŸåšã®ã¹ã¬ããã®ã³ã³ããã¹ãã¯ãã¹ã¬ããã®ã¹ã¿ãã¯ã«ä¿åãããŸãïŒISRãå®äºãããšãããã«å¥ã®ã¹ã¬ããã«åãæ¿ããããšãã§ããŸãïŒã
- ISRã¯ãã®ä»äºãè¡ããŸãïŒäžæãåŠçããŸãïŒã
- å¥ã®ã¹ã¬ããã«åãæ¿ããå¿ èŠãããå Žåã¯ãåãæ¿ããŸãïŒå°ãªããšããã¹ã¿ãã¯ãã€ã³ã¿ãŒãå€æŽããŸãïŒã
- ã¹ã¬ããã³ã³ããã¹ãã¯ã¹ã¿ãã¯ãã埩å ãããŸãã
- ã¹ããªãŒã ã¯äœæ¥ãç¶ããŸãã
ããã¯éåžžã«è¿ éã«æ©èœããŸããããªãœãŒã¹ãéåžžã«éãããŠããçµã¿èŸŒã¿ã·ã¹ãã ã®ã³ã³ããã¹ãã§ã¯ããã®ã¢ãããŒãã«ã¯é倧ãªæ¬ ç¹ããããŸãã ã©ã£ã¡ïŒ
å²ã蟌ã¿ã¯ãã€ã§ãçºçããå¯èœæ§ããããããå²ã蟌ã¿ãçºçãããšãã«ã©ã®ã¹ã¬ãããã¢ã¯ãã£ãã«ãªãããäºåã«ç¥ãããšã¯ã§ããŸããã ãã®ãããåã¹ã¬ããã®ã¹ã¿ãã¯ãµã€ãºãèŠç©ãããšãã¯ãææªã®ãã¹ããèæ ®ããŠãæ¢åã®ãã¹ãŠã®å²ã蟌ã¿ããã®ã¹ã¬ããã§çºçããå¯èœæ§ããããšæ³å®ããå¿ èŠããããŸãã ããã«ããããã¹ãŠã®ã¹ããªãŒã ã®ã¹ã¿ãã¯ãµã€ãºãå€§å¹ ã«å¢å ããå¯èœæ§ããããŸãã1KBã§ç°¡åã§ããããã以äžã«ãªãå ŽåããããŸãïŒãã¡ãããã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠç°ãªããŸãïŒã ããšãã°ãã¢ããªã±ãŒã·ã§ã³ã«7ã€ã®ã¹ã¬ãããããå Žåãå²ã蟌ã¿ã«å¿ èŠãªRAMãµã€ãºã¯1 * 7 = 7 kBã§ãã ãã€ã¯ãã³ã³ãããŒã©ãŒã®RAMã32 kBã®ã¿ã®å ŽåïŒããã¯æ¢ã«è±å¯ãªãã€ã¯ãã³ã³ãããŒã©ãŒã§ãïŒã7 kBã¯20ïŒ ã§ãïŒ ãã
åèšã§ãåã¹ã¬ããã®ã¹ã¿ãã¯ã«ã¯æ¬¡ã®ãã®ãå«ãŸããŠããå¿ èŠããããŸãã
- ç¬èªã®ã¹ããªãŒã ããŒã¿ã
- ã¹ããªãŒã ã³ã³ããã¹ãïŒãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ïŒ;
- ææªã®å Žåã®ãã¹ãã«åºã¥ããã¹ãŠã®ISRã®ããŒã¿ã
å²ã蟌ã¿ã«å¥ã®ã¹ã¿ãã¯ã䜿çšããå Žåã¯ã次ã®ãªãã·ã§ã³ã«é²ã¿ãŸãã

ããã§ãåã®äŸã®ISRã«1 kBã1åã ãå²ãåœãŠãå¿ èŠããããŸãã ããã¯ã¯ããã«æèœãªã¢ãããŒãã ãšæããŸããçµã¿èŸŒã¿ã·ã¹ãã ã§ã¯ãRAMã¯éåžžã«é«äŸ¡ãªãªãœãŒã¹ã§ãã
ãã®ãããªRTOSã®ååã®è¡šé¢çãªã¬ãã¥ãŒã®åŸã次ã«é²ã¿ãŸãã
TNKernel
èšäºã®åé ã§ç€ºããããã«ã16ãããããã³32ãããã®ãã€ã¯ãã³ã³ãããŒã©ãŒã®éçºã«ã¯TNKernelã䜿çšããŸããã
æ®å¿µãªããã PIC32ã®TNKernelããŒãã®äœæè ã§ããAlex Borisovã¯ãå²ã蟌ã¿ãå²ã蟌ã¿ã¹ã¬ããã®ã¹ã¿ãã¯ã䜿çšããå Žåã«ãã®ã¢ãããŒãã䜿çšããŠããŸããã 倧éã®RAMãç¡é§ã«ããç§ããšãŠã幞ãã«ããŸãããããã以å€ã®å ŽåTNKernelã¯èŠæ ãããããã³ã³ãã¯ãã§é«éãªã®ã§ã䜿ãç¶ããŸããã Xæ¥ãŸã§ãå®éããã¹ãŠãéåžžã«æªãããšãç¥ã£ãŠéåžžã«é©ããŸããã
PIC32ã®äžã®ãã¡ã€ã«TNKernel
ç§ã¯å¥ã®ãããžã§ã¯ãã«åãçµã¿ãŸããïŒè»ã®ãã£ã³ãã«ããã®ã¢ããã°ä¿¡å·ãåæãããŠãŒã¶ãŒããã®ä¿¡å·ã®ããã€ãã®ãã©ã¡ãŒã¿ãŒãèŠãããšãã§ããããã€ã¹ïŒæç¶æéãæ¯å¹ ãªã©ã ä¿¡å·ã¯æ¥éã«å€åãããããååã«é »ç¹ã«æž¬å®ããå¿ èŠããããŸãã1ãŸãã¯2ãã€ã¯ãç§ããšã«1åã§ãã
ãã®ã¿ã¹ã¯ã§ã¯ãPIC32ãã¡ããªã®Microchipããã»ããµïŒMIPSã³ã¢ä»ãïŒãéžæãããŸããã
ã¿ã¹ã¯ã¯ããã»ã©é£ãããªãã¯ãã§ãããããæ¥åé¡ãçºçããŸãããããã€ã¹ã枬å®ãéå§ãããšãã«ãããã°ã©ã ããŸã£ããäºæããªãå Žæã§ã¯ã©ãã·ã¥ããããšããããŸããã ãããã¯æ±æãããèšæ¶ã§ããã«éããªãããšç§ã¯æããéåžžã«æã£ãŠããã ã¡ã¢ãªç Žæã«é¢é£ãããšã©ãŒãèŠã€ããããã»ã¹ã¯é·ããå®å šã«éèªæã§ããå¯èœæ§ããããŸãïŒåè¿°ããããã«ãMMUããªããã·ã¹ãã å ã®ãã¹ãŠã®ã¹ã¬ããããã¹ãŠã®RAMã䜿çšã§ãããããã¹ã¬ããã®1ã€ãå¶åŸ¡äžèœã«ãªããä»ã®ã¹ã¬ããã®ã¡ã¢ãªãå°ç¡ãã«ããå Žåããã®åŸãåé¡ã¯å®éã®å Žæããéåžžã«é ãé¢ããå Žæã«çŸãããšã©ãŒãçºçããŸãã
TNKernelã«ã¯ãœãããŠã§ã¢ã¹ã¿ãã¯ãªãŒããŒãããŒå¶åŸ¡ããªãããšã¯æ¢ã«è¿°ã¹ãã®ã§ãã¡ã¢ãªç Žæã®çããããå Žåã¯ããŸããã¹ã¬ãããã¹ã¿ãã¯ã§ãªãŒããŒãããŒããŠãããã©ããã確èªãã䟡å€ããããŸãã ã¹ã¬ãããäœæããããšããã®ã¹ã¿ãã¯ã¯ç¹å®ã®å€ïŒPIC32ã®äžã®TNKernelã§ã¯
0xffffffff
ïŒã§åæåããããããã¹ã¿ãã¯ã®çµãããæ±ããŠãããã©ãããç°¡åã«ç¢ºèªã§ããŸãã 確èªãããšãããå®éãã¢ã€ãã«ç¶æ ã®ã¹ã¬ããã¹ã¿ãã¯ã¯æããã«ãã£ã±ãã§ãã

MIPSã§ã¯ãã¹ã¿ãã¯ã倧ãããªãããã
task_idle_stack[0]
ã¯ã¢ã€ãã«ã¹ã¬ããã¹ã¿ãã¯ã§æåŸã«äœ¿çšå¯èœãªã¯ãŒãã§ãã
ãŸããããã¯ãã§ã«äœãã§ãã ããããå®éã«ã¯ããã®ã¹ã¬ããã®ã¹ã¿ãã¯ã«ã¯å€§ããªããŒãžã³ãå²ãåœãŠãããŠããŸããããã€ã¹ãæ£åžžã«åäœããŠããå Žåã880ã®ãã¡çŽ300ãã€ããã䜿çšãããŠããŸããã ã¹ã¿ãã¯ããªãŒããŒãããŒãããããçš®ã®éçã®ãã°ãååšããã¯ãã§ãã
ãã®åŸãç§ã¯èšæ¶ããã泚ææ·±ãç 究ãå§ããã¹ã¿ãã¯ãç¹°ãè¿ããã¿ãŒã³ã§æºããããŠããããšãæããã«ãªããŸããã åç §ïŒã·ãŒã±ã³ã¹
0xFFFFFFFF, 0xFFFFFFFA, 0xA0006280, 0xA0005454
ïŒ

ãããŠåã³åãã·ãŒã±ã³ã¹ïŒ

ã¢ãã¬ã¹
0xA000051C
ããã³
0xA00005A4
éãã¯136ãã€ãã§ãã 4ïŒã¯ãŒããµã€ãºïŒã§å²ããŸãããããã¯34ã¯ãŒãã§ãã
ããŒãã34ã¯ãŒã...ããã¯MIPSã®ã³ã³ããã¹ãã®ãµã€ãºã§ãïŒ ãããŠãåããã¿ãŒã³ãäœåºŠãç¹°ãè¿ãããŸãã ãã®ãããã³ã³ããã¹ãã¯æ°åé£ç¶ããŠä¿åãããŠããããã§ãã ããã...ããã¯ã©ã®ããã«ã§ããŸããïŒïŒ
æ®å¿µãªããããã¹ãŠãç解ããããã«å€ãã®æéãããããŸããã ãŸããä¿åãããã³ã³ããã¹ãããã詳现ã«èª¿æ»ããããšããŸãããç¹ã«ãäžæãããã¹ããªãŒã ãåŸã§äœæ¥ãåéããå¿ èŠãããã¢ãã¬ã¹ãããã°ã©ã ã¡ã¢ãªã«ããå¿ èŠããããŸãã PIC32ã§ã¯ãããã°ã©ã ã¡ã¢ãªã¯
0x9D000000
ãã
0x9D007FFF
é åã«ãããã³ã°ãããããããããã®ã¢ãã¬ã¹ã¯æ®ãã®ããŒã¿ãšç°¡åã«åºå¥ã§ããŸãã ãããã®ã¢ãã¬ã¹ã¯ä¿åãããã³ã³ããã¹ããã
0x9D012C28
ããã®ãã¡ã®1ã€ã¯
0x9D012C28
ã§ãã éã¢ã»ã³ãã©ã確èªããŸãã
9D012C04 AD090000 SW T1, 0(T0) 9D012C08 8FA80008 LW T0, 8(SP) 9D012C0C 8FA9000C LW T1, 12(SP) 9D012C10 01000013 MTLO T0, 0 9D012C14 01200011 MTHI T1, 0 9D012C18 8FA10010 LW AT, 16(SP) 9D012C1C 8FA20014 LW V0, 20(SP) 9D012C20 8FA30018 LW V1, 24(SP) 9D012C24 8FA4001C LW A0, 28(SP) 9D012C28 8FA50020 LW A1, 32(SP) # <- 9D012C2C 8FA60024 LW A2, 36(SP) 9D012C30 8FA70028 LW A3, 40(SP) 9D012C34 8FA8002C LW T0, 44(SP) 9D012C38 8FA90030 LW T1, 48(SP) 9D012C3C 8FAA0034 LW T2, 52(SP) 9D012C40 8FAB0038 LW T3, 56(SP) 9D012C44 8FAC003C LW T4, 60(SP) 9D012C48 8FAD0040 LW T5, 64(SP) 9D012C4C 8FAE0044 LW T6, 68(SP) 9D012C50 8FAF0048 LW T7, 72(SP) 9D012C54 8FB0004C LW S0, 76(SP) 9D012C58 8FB10050 LW S1, 80(SP) 9D012C5C 8FB20054 LW S2, 84(SP) 9D012C60 8FB30058 LW S3, 88(SP) 9D012C64 8FB4005C LW S4, 92(SP) 9D012C68 8FB50060 LW S5, 96(SP) 9D012C6C 8FB60064 LW S6, 100(SP) 9D012C70 8FB70068 LW S7, 104(SP) 9D012C74 8FB8006C LW T8, 108(SP) 9D012C78 8FB90070 LW T9, 112(SP) 9D012C7C 8FBA0074 LW K0, 116(SP) 9D012C80 8FBB0078 LW K1, 120(SP) 9D012C84 8FBC007C LW GP, 124(SP) 9D012C88 8FBE0080 LW S8, 128(SP) 9D012C8C 8FBF0084 LW RA, 132(SP) 9D012C90 41606000 DI ZERO 9D012C94 000000C0 EHB 9D012C98 8FBA0000 LW K0, 0(SP) 9D012C9C 8FBB0004 LW K1, 4(SP) 9D012CA0 409B7000 MTC0 K1, EPC
SPïŒã¹ã¿ãã¯ãã€ã³ã¿ãŒïŒã«é¢é£ããã¢ãã¬ã¹ããã®LWïŒããŒãã¯ãŒãïŒããã®ãã®ç¹åŸŽçãªã·ãŒã±ã³ã¹ã¯ãã³ã³ããã¹ãå埩æé ã§ãã ããã§ãã³ã³ããã¹ããã¹ã¿ãã¯ãã埩å ããããšãã«ã¹ã¬ãããããã·ã¥ãããããšã¯æããã§ãã ããŠãããã¯äžæãåå ã§ããå¯èœæ§ããããŸããããªãããã»ã©é »ç¹ã«é£ç¶ããã®ã§ããããïŒ ã·ã¹ãã ã«ã¯ããã»ã©å€ãã®å²ã蟌ã¿ãããããŸããã
ãã以åã¯ãTNKernelã䜿çšããã®ã¯ããããã©ã®ããã«æ©èœãããæ確ã«ç解ããã«äœ¿çšããã ãã§ããã ã ãããç§ã¯ã³ã¢ã«æ·±ãå ¥ãã®ãå°ãæãã£ãã§ãã ããããä»åã¯ããããªããã°ãªããŸããã§ããã
PIC32ã§ã®TNKernelã®ã³ã³ããã¹ãã®åãæ¿ã
ã³ã³ããã¹ãã¹ã€ããã³ã°ã®ããã»ã¹å šè¬ã«ã€ããŠã¯æ¢ã«èª¬æããŸããããããã§ã¯ããã®ãããã¯ãæŽæ°ããç¹å®ã®å®è£ ïŒTNKernelïŒã®è©³çŽ°ãè¿œå ããŸãããã
ã«ãŒãã«ã¯ãã³ã³ããã¹ããã¹ã¬ããAããã¹ã¬ããBã«åãæ¿ããããšã決å®ãããšã次ã®ããšãè¡ããŸãã
- ãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ãã¹ã¿ãã¯ïŒã€ãŸããã¹ã¬ããAã®ã¹ã¿ãã¯ïŒã«ä¿åããŸãã
- äžæãçŠæ¢ããŸãã
- ã¹ã¿ãã¯ãã€ã³ã¿ãŒãã¹ããªãŒã Bã¹ã¿ãã¯ã®å é ã«åãæ¿ããŸãã
- ãã€ã³ã¿ãŒãã¢ã¯ãã£ããªã¹ã¬ããã®ãã³ãã«ïŒã¹ã¬ããBã®ãã³ãã«ïŒã«åãæ¿ããŸãã
- å²ã蟌ã¿ãèš±å¯ããŸãã
- ã¹ã¿ãã¯ããïŒã€ãŸããã¹ã¬ããBã®ã¹ã¿ãã¯ããïŒãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ã埩å ããŸãã
ã芧ã®ããã«ãã«ãŒãã«ãã¹ããªãŒã èšè¿°åãšã¹ã¿ãã¯ã®æäžéšãžã®ãã€ã³ã¿ãŒã§åäœããŠããéãçãã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ããããŸãïŒããã§ãªãå Žåããããã®ã¢ã¯ã·ã§ã³ã®éã«å²ã蟌ã¿ãçæããããšç¶æ³ãçºçããå¯èœæ§ãããããã¡ããããŒã¿ã®äžå®å šæ§ã¯èª€ã£ãåäœã«ã€ãªãããŸãã
PIC32ã§ã®TNKernelå²ã蟌ã¿
TNKernelã«ã¯PIC32ã®äžã«2çš®é¡ã®å²ã蟌ã¿ããããŸãã
- ã·ã¹ãã å²ã蟌ã¿ïŒã«ãŒãã«ãµãŒãã¹ãåŒãèµ·ããå¯èœæ§ããããISRã®çŽåŸã«ã³ã³ããã¹ãã¹ã€ãããçºçããå¯èœæ§ããããŸãã ãã®ãããªå²ã蟌ã¿ãåŒã³åºããããšãã«ãŒãã«ã¯çŸåšã®ã¹ã¬ããã®ã¹ã¿ãã¯ã«å®å šãªã³ã³ããã¹ããä¿åããŸã
- ãŠãŒã¶ãŒå²ã蟌ã¿ïŒã«ãŒãã«ãµãŒãã¹ãåŒã³åºãããšãã§ããŸããã ãã®ãããªå²ã蟌ã¿ãçæããããšãã«ãŒãã«ã¯äœã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸããã
çŸåšãã·ã¹ãã å²ã蟌ã¿ã«ã®ã¿é¢å¿ããããŸãã ãŸããTNKernelã«ã¯ãã®ã¿ã€ãã®å²ã蟌ã¿ã«å¯Ÿããå¶éããããŸããã¢ããªã±ãŒã·ã§ã³å ã®ãã¹ãŠã®ã·ã¹ãã å²ã蟌ã¿ã¯åãåªå 床ãæã€å¿ èŠãããããããããã®å²ã蟌ã¿ã¯ãã¹ãã§ããŸããã
å°ããªãªãã€ã³ããŒãšããŠãå²ã蟌ã¿ãçæããããšãã«äœãèµ·ãããã次ã«ç€ºããŸãã
- çŸåšã®ã¹ã¬ããã®ã³ã³ããã¹ãã¯ãã¹ããªãŒã ã¹ã¿ãã¯ã«æ ŒçŽãããŸãã
- ISRãå¶åŸ¡ããŸãã
ããã§ISRãã¢ã¯ãã£ãã«ãªããã¹ã¿ãã¯ã®äœ¿çšã¯æ¬¡ã®ãšããã§ãã

ãã§ã«è¿°ã¹ãããã«ããã®ã¢ãããŒãã§ã¯ã¹ã¬ããã«å¿ èŠãªã¹ã¿ãã¯ãµã€ãºãå€§å¹ ã«å¢å ããŸããåã¹ã¬ããã¯ã次ã®èŠçŽ ãå容ã§ãã倧ããã§ãªããã°ãªããŸããã
- ç¬èªã®ã¹ããªãŒã ããŒã¿ã
- ã¹ããªãŒã ã³ã³ããã¹ãïŒãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ïŒ;
- ææªã®å Žåã®ãã¹ãã«åºã¥ããã¹ãŠã®ISRã®ããŒã¿ã
ISRã¹ã¿ãã¯ã«ã¹ã¬ããã®æ°ãæããå¿ èŠã¯ãããŸããããäžè¬çã«èšã£ãŠãç§ã¯ISRã¹ã¿ãã¯ã«å¯Ÿå¿ããæºåãã§ããŠããŸããã
ã³ã³ããã¹ãåãæ¿ãæã®äžæ
ãããŠãã³ã³ããã¹ãã®åãæ¿ãäžã«å²ã蟌ã¿ãçæãããå Žåãã€ãŸã çŸåšã®ã¹ã¬ããã®ã³ã³ããã¹ãã¯ã¹ã¿ãã¯ã«ä¿åãããããã¹ã¿ãã¯ãã埩å ãããŸããïŒ
ããªããæšæž¬ãããšæãïŒãªããªã ã³ã³ããã¹ãã®ä¿å/埩å ããã»ã¹äžã®äžæã¯çŠæ¢ãããŠããŸãããã³ã³ããã¹ãã¯2åä¿åãããŸãã ããã«ïŒ

ãã®ãããã«ãŒãã«ãã¹ã¬ããBããã¹ã¬ããAã«åãæ¿ããããšã決å®ãããšã次ã®ããã«ãªããŸãã
- ã³ã³ããã¹ãã¯ã¹ã¬ããBã®ã¹ã¿ãã¯ã«ä¿åãããŸãã
- ãã®ããã»ã¹ã®éäžã§ãäžæãçºçããŸãã
- ã¹ã¬ããBã®ã¹ã¿ãã¯ã§ã¯ãã¹ããŒã¹ãå¥ã®ã³ã³ããã¹ãã«å²ãåœãŠãããã³ã³ããã¹ããããã«ä¿åãããŸã
- ISRãå¶åŸ¡ãåãããã®ä»äºãããŠçµäºããŸã
- ISRãå®äºãããšãã«ãŒãã«ã¯ã©ã®ã¹ã¬ãããå¶åŸ¡ãæž¡ãå¿ èŠããããã確èªããŸãïŒããã¯ã¹ã¬ããAã§ããå²ã蟌ã¿ãçºçããåã«ã¹ã¬ããAã«åãæ¿ãããã£ãããšãæãåºããŠãã ããïŒ
- äžæã®çŠæ¢
- ã¹ã¿ãã¯ãã€ã³ã¿ãŒãšãã€ã³ã¿ãŒãçŸåšã®ã¹ã¬ããã®ãã³ãã«ã«åãæ¿ããŸã
- å²ã蟌ã¿ãèš±å¯
- ã³ã³ããã¹ãã¯ã¹ã¿ãã¯ãã埩å ãããŸãïŒã€ãŸããã¿ã¹ã¯Aã®ã¹ã¿ãã¯ã®æäžéšããïŒ
次ã®å³ã衚瀺ãããŸãã
åç §ïŒã³ã³ããã¹ãã¯ã¹ããªãŒã Bã®ã¹ã¿ãã¯ã«2åä¿åãããŸããå®éãã¹ã¿ãã¯ããã£ã±ãã§ãªãå Žåãããã¯çœå®³ã§ã¯ãããŸããã ãã®äºéä¿åãããã³ã³ããã¹ãã¯ãã¹ã¬ããBãå¶åŸ¡ãååŸãããšããã«2å埩å ãããŸãã ããšãã°ãã¹ã¬ããAãäœããåŸ ã¡ãã«ãŒãã«ãå¶åŸ¡ãã¹ã¬ããBã«æ»ããšä»®å®ããŸãã
- ã³ã³ããã¹ãã¯ã¹ããªãŒã Aã¹ã¿ãã¯ã«ä¿åãããŸãã
- å²ã蟌ã¿ã®ç¡å¹åãã¹ã¿ãã¯ãã€ã³ã¿ãŒã®åãæ¿ããªã©ãå²ã蟌ã¿ã®æå¹åã
- ã³ã³ããã¹ãã¯ãã¹ã¬ããBã®ã¹ã¿ãã¯ãã埩å ãããŸãã
å®éãã¹ã¬ããAã«åãæ¿ããåã«ã¹ã¬ããBã®ã¹ã¿ãã¯ã«ã³ã³ããã¹ããä¿åãããæç¹ã«æ»ã£ãŠããŸãããããã£ãŠãã³ã³ããã¹ãã®ä¿åãç¶ããŸãã
- ã¹ããªãŒã Bã¹ã¿ãã¯ãžã®ã³ã³ããã¹ãã®ä¿åãçµäºããŸãã
- ã¢ã¯ãã£ãåããå¿ èŠãããã¹ããªãŒã ãååŸããŸãïŒå®éãæ¢ã«ã¢ã¯ãã£ãåãããŠããŸãïŒã¹ããªãŒã BïŒã
- ã³ã³ããã¹ããå ã«æ»ããŸãã
ãã®åŸãã¹ã¬ããBã¯ãäœãèµ·ãããªãã£ããã®ããã«æ©èœãç¶ããŸãã

ã芧ã®ãšãããå®éã«ã¯äœãç Žãããšã¯ãããŸããã§ãããããã®èª¿æ»ããéèŠãªçµè«ãäžãå¿ èŠããããŸããåã¹ããªãŒã ã®ã³ã³ããã¹ãã«å«ãŸããã¹ãã§ãããšããä»®å®ã¯æ£ãããããŸããã§ããã å°ãªããšãã1ã€ã§ã¯ãªã2ã€ã®ã³ã³ããã¹ãã«å¯Ÿå¿ããå¿ èŠããããŸãã
èŠããŠããããã«ãTNKernelã®ãã¹ãŠã®ã·ã¹ãã å²ã蟌ã¿ã¯åãåªå 床ãæã€å¿ èŠãããããããã¹ãããããšã¯ã§ããŸãããã€ãŸããã³ã³ããã¹ãã2å以äžä¿åã§ããªãããšãæå³ããŸãã
ãã®å Žåãæçµçãªçµè«ã¯æ¬¡ã®ãšããã§ããåã¹ã¬ããã®ã¹ã¿ãã¯ã«ã¯æ¬¡ã®ãã®ãå«ãŸããŠããå¿ èŠããããŸãã
- ç¬èªã®ã¹ããªãŒã ããŒã¿ã
- ã¹ããªãŒã ã³ã³ããã¹ãïŒãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ïŒ;
- ã³ã³ããã¹ããä¿åããããšãã«äžæãçºçããå Žåã®2çªç®ã®ã³ã³ããã¹ãã
- ææªã®å Žåã®ãã¹ãã«åºã¥ããã¹ãŠã®ISRã®ããŒã¿ã
ãã...åã¹ããªãŒã ã«ããã«136ãã€ããç¹°ãè¿ããŸãããã¹ã¬ããæ°ã§ä¹ç®ããŸãã7ã¹ã¬ããã®å Žåãããã¯ã»ãŒ1ãããã€ãã§ã32 kBã®ããã«3ïŒ ã§ãã
ããã£ã ãããç§ã¯ãããããããã®ãããªç¶æ³ã«åæããã ããããç§ãã¡ã®æçµçãªçµè«ã¯ãå®éã«ã¯ãããã¯æçµçã§ã¯ãããŸããããã¹ãŠã®ããæªåãã
ããæ·±ãæã
äºéã³ã³ããã¹ããããæ·±ãä¿åããããã»ã¹ã詳ãã調ã¹ãŠã¿ãŸãããïŒååã®èª¿æ»ã®åŸã§ããã¹ã¬ããã¹ã¿ãã¯ã«ã³ã³ããã¹ããäœåä¿åãããã®ãã説æããããšã¯ã§ããŸããã ïŒãããã³å¥ã®ã·ã¹ãã å²ã蟌ã¿ãçºçããå ŽåãçŸåšã®ISRãå¶åŸ¡ãè¿ããåŸã«åŠçãããŸãã
ããäžåºŠãã®å³ãèŠãŠã¿ãŸããããISRã¯ãã§ã«å¶åŸ¡ãè¿ããŠããã®ã§ãã¹ããªãŒã Aã«åãæ¿ããŸããã
ãã®æç¹ã§ãããã»ããµã®å²ã蟌ã¿ã¬ãã«ãåã³äžããããã³ã³ããã¹ããã¹ã¬ããBã¹ã¿ãã¯ã«2åä¿åãããŸãã
次ã¯äœã ãšæããŸããïŒ
ããã§ããã¹ããªãŒã Bã«åãæ¿ããŠãã³ã³ããã¹ãã埩å ããŠãããšãã«ãå¥ã®å²ã蟌ã¿ãçºçããå¯èœæ§ããããŸããèæ ®ããŠãã ããïŒ

ã¯ããã³ã³ããã¹ãã¯ãã§ã«3åã¹ã¬ããã¹ã¿ãã¯ã«ä¿åãããŠããŸããããã«æªãããšã«ãåãå²ã蟌ã¿ã§ããå¯èœæ§ããããŸããåãå²ã蟌ã¿ã§ã¹ã¬ããã¹ã¿ãã¯ã®ã³ã³ããã¹ããæ°åä¿åã§ããŸãã
ãããã£ãŠãå²ã蟌ã¿ãå®æçã«çºçããã¹ã¬ãããååŸã«åãæ¿ããã®ãšãŸã£ããåãé床ã§éãæªããã°ãã³ã³ããã¹ãã¯ã¹ããªãŒã ã¹ã¿ãã¯ã«äœåºŠãä¿åãããæçµçã«ã¯ã¹ã¿ãã¯ãªãŒããŒãããŒã
ããã¯ãPIC32ã§ã®TNKernelããŒãã®äœæè ã«ãã£ãŠæããã«èæ ®ãããŠããŸããã§ããã
ãããŠããããŸãã«ã¢ããã°ä¿¡å·ã枬å®ããããã€ã¹ã§èµ·ãã£ãããšã§ããADCå²ã蟌ã¿ã¯ãã®ãããªãæåãããåšæ³¢æ°ã§æ£ç¢ºã«çæãããŸãããèµ·ãã£ãããšã¯æ¬¡ã®ãšããã§ãã
- ADCåšèŸºæ©åšã¯æ¬¡ã®æž¬å®ãå®äºããå²ã蟌ã¿ãçæããŸãã
- ISR , , , - ;
- ISR , (.. , );
- ;
- , - . , .
- 2.
ãã¡ãããããã¯ADCå²ã蟌ã¿ãéåžžã«é »ç¹ã«çæãããããšã§ãããã·ã¹ãã ã®åäœã¯ãŸã£ããåãå ¥ããããŸãããæ£ããåäœïŒãã®ãããªé »ç¹ãªå²ã蟌ã¿ã®çæãåæ¢ããããŸã§ãã¹ã¬ããã¯ïŒäžåºŠã«ïŒå¶åŸ¡ãåä¿¡ããªããªããŸããã¹ã¿ãã¯ã¯ä¿åãããã³ã³ããã¹ãã®æã§æºããããã¹ãã§ã¯ãªããå²ã蟌ã¿ãé »ç¹ã«çæãããªããªããšãã·ã¹ãã ã¯éãã«åäœãç¶ããŸãã
ãããŠãã1ã€ã®çµæïŒãã®ãããªå®æçãªå²ã蟌ã¿ããªãå Žåã§ããã¢ããªã±ãŒã·ã§ã³ã«ååšããããŸããŸãªå²ã蟌ã¿ãäžå¹žãªç¬éã«çºçããŠãã³ã³ããã¹ããäœåºŠãä¿åãããå¯èœæ§ããŒãã§ã¯ãªããŸãŸã§ããçµã¿èŸŒã¿ã·ã¹ãã ã¯ãå€ãã®å ŽåãæéïŒæ°å¹Žããã³æ°å¹ŽïŒã«ãããé£ç¶åäœçšã«èšèšãããŠããŸããããšãã°ãè»ã®ã¢ã©ãŒã ããªã³ããŒãã³ã³ãã¥ãŒã¿ãŒãªã©ã§ãããããŠãããã€ã¹ã®åäœæéãç¡éã«ãªãåŸåãããå Žåããã®ãããªã€ãã³ãã®çºçã®å¯èœæ§ã¯äžèŽããåŸåããããŸããé ããæ©ãããããã¯èµ·ãã£ãŠããŸãããã¡ãããããã¯åãå ¥ããããªãã®ã§ãç©äºã®çŸåšã®ç¶æ ãé¢ããããšã¯ã§ããŸããã
è¯ãïŒå°ãªããšãä»ã¯åé¡ã®åå ãç¥ã£ãŠããŸãã次ã®è³ªåïŒãã®çç±ãæé€ããæ¹æ³ïŒ
ãããããæéãã€æãããŒãã£ãªããã¯ã¯ãã³ã³ããã¹ãã®ä¿å/埩å äžã®å²ã蟌ã¿ãåã«çŠæ¢ããããšã§ããã¯ããããã¯åé¡ã解決ããŸãããããã¯éåžžã«éåžžã«æªã解決çã§ãïŒã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã¯ã§ããã ãçãããå¿ èŠãããããã®ãããªé·æéã®å²ã蟌ã¿ãçŠæ¢ããããšã¯ã»ãšãã©è¯ãèãã§ã¯ãããŸããã
ã¯ããã«åªãããœãªã¥ãŒã·ã§ã³ã¯ãå²ã蟌ã¿çšã«å¥ã®ã¹ã¿ãã¯ã䜿çšããããšã§ãã
TNKernelãæ¹åããããšããŠããŸã
Anders Montonenã«ããPIC32ã®äžã«ã¯å¥ã®TNKernelããŒãããããå²ã蟌ã¿çšã«å¥ã®ã¹ã¿ãã¯ã䜿çšããŸãããããããã®ããŒãã«ã¯ãAlex Borisovã®ããŒãã«ãã䟿å©ãªæ©èœã¯ãããŸãããã·ã¹ãã å²ã蟌ã¿ã宣èšããããã®äŸ¿å©ãªSyshnyãã¯ããã·ã¹ãã ãã£ãã¯ãæäœããããã®ãµãŒãã¹ãªã©ã§ãã
ããã§ãç§ã¯ããããã©ãŒã¯ããå¿ èŠãªãã®ãå®è£ ããããšã«ããŸããããã¡ãããã«ãŒãã«ã§ãã®ãããªå€æŽãè¡ãããã«ã¯ããã®ä»çµã¿ãååã«ç解ããå¿ èŠããããŸããããããŠãTNKernelã³ãŒããå匷ããã°ããã»ã©ãããã奜ãã§ã¯ãªããªããŸãããTNKernelã¯ãã²ããŸãããŠæžããããããžã§ã¯ãã®å°è±¡ãäžããŸããéè€ããã³ãŒããå€ããæŽåæ§ããããŸããã
æªãå®è£ äŸ
ã«ãŒã«ã1ã€ã®å ¥å£ç¹ã1ã€ã®åºå£ç¹ãã®éå
ã«ãŒãã«ã®ã©ãã«ã§ãèŠãããæãäžè¬çãªäŸã¯ã次ã®ãããªã³ãŒãã§ãã
int my_function(void) { tn_disable_interrupt(); //-- do something if (error()){ //-- do something tn_enable_interrupt(); return ERROR; } //-- do something tn_enable_interrupt(); return SUCCESS; }
è€æ°ã®æŒç®å
return
ããããããã«æ»ãåã«ç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠãããå Žåã¯ããã®ãããªã³ãŒããåé¡ã®éµã«ãªããŸãã次ã®ããã«æžãæããããšããå§ãããŸãã
int my_function(void) { int rc = SUCCESS; tn_disable_interrupt(); if (error()){ rc = ERROR; } else { //-- so something } tn_enable_interrupt(); return rc; }
ããŠãæ»ãåã«å²ã蟌ã¿ãèš±å¯ããå¿ èŠãããããšãèŠããŠããå¿ èŠã¯ãããŸãããã³ã³ãã€ã©ã«äœæ¥ãä»»ããŠãã ããã
ããªãã¯çµæã®ããã«é ãã«è¡ãå¿ èŠã¯ãããŸããïŒçŸæç¹ã§ææ°ã®TNKernel 2.7ããã®æ©èœã¯ããã«ãããŸãïŒ
int tn_sys_tslice_ticks(int priority,int value) { TN_INTSAVE_DATA TN_CHECK_NON_INT_CONTEXT tn_disable_interrupt(); if(priority <= 0 || priority >= TN_NUM_PRIORITY-1 || value < 0 || value > MAX_TIME_SLICE) return TERR_WRONG_PARAM; tn_tslice_ticks[priority] = value; tn_enable_interrupt(); return TERR_NO_ERR; }
åç §ïŒééã£ããã©ã¡ãŒã¿ãŒãé¢æ°ã«æž¡ããããšãé¢æ°ã¯æ»ã
TERR_WRONG_PARAM
ãå²ã蟌ã¿ã¯çŠæ¢ããããŸãŸã«ãªããŸãã1ã€ã®ãšã³ããªãã€ã³ãã1ã€ã®åºå£ãã€ã³ãã®ã«ãŒã«ã«åŸãã°ããã®ãšã©ãŒã¯çºçããªãã£ãå¯èœæ§ãé«ããªããŸãã
DRYååã®éå
ïŒç¹°ãè¿ããŠã¯ãããŸããïŒãªãªãžãã«ã®TNKernel 2.7ã³ãŒãã«ã¯ã倧éã®ã³ãŒãã®éè€ãå«ãŸããŠããŸããå€ãã®é¡äŒŒããããšã¯ãåçŽãªã³ããŒãéããŠç°ãªãå Žæã§è¡ãããŸãã
ããã€ãã®é¡äŒŒãããµãŒãã¹ïŒããšãã°ãã¡ãã»ãŒãžãéä¿¡ãããµãŒãã¹ïŒã¹ããªãŒã ãããåŸ æ©ããã«ã¹ããªãŒã ããããŸãã¯å²ã蟌ã¿ããïŒãããå Žåããããã¯3ã€ã®éåžžã«é¡äŒŒããé¢æ°ã§ããã1-2è¡ãç°ãªããç©äºãäžè¬åããè©Šã¿ã¯ãããŸããã
ã¹ããªãŒã ç¶æ ã®åãæ¿ãã¯éåžžã«å šäœçã«å®è£ ãããŠããŸããããšãã°ãã¹ã¬ãããRunnableããWaitã«ç§»åããå¿ èŠãããå Žåã1ã€ã®ãã©ã°ãã¯ãªã¢ããŠå¥ã®ãã©ã°ãèšå®ããã ãã§ã¯ååã§ã¯ãããŸãããã¹ã¬ãããååšããéå§ãã¥ãŒãããåé€ããå¿ èŠããããŸããåŸ æ©ãåŸ æ©ãã¥ãŒãžã®ã¹ã¬ããã®è¿œå ïŒå¿ èŠãªå ŽåïŒãã¿ã€ã ã¢ãŠãã®èšå®ïŒå¿ èŠãªå ŽåïŒãªã© TNKernel 2.7ã«ã¯ããã®ããã®äžè¬çãªã¡ã«ããºã ã¯ãããŸãããããããã®å Žåã«ãã³ãŒãã¯ããã«èšè¿°ãããŠããŸãã
ãããŸã§ã®éããããã®ããšãå®è£ ããæ£ããæ¹æ³ã¯ãç¶æ ããšã«3ã€ã®é¢æ°ãèšè¿°ããããšã§ãã
- æå®ãããç¶æ ã§ã¹ããªãŒã ãå ¥åããŸãã
- ã»ããç¶æ ããã¹ããªãŒã ãæšå®ããã«ã¯;
- ã¹ããªãŒã ãæå®ãããç¶æ ã«ãããã©ããã確èªããŸãã
çŸåšãããç¶æ ããå¥ã®ç¶æ ã«ã¹ããªãŒã ã転éããå¿ èŠãããå Žåãéåžžã¯2ã€ã®é¢æ°ãåŒã³åºãå¿ èŠããããŸãã1ã€ã¯å€ãç¶æ ããã¹ããªãŒã ãåãåºãããã1ã€ã¯æ°ããç¶æ ã«å ¥ãé¢æ°ã§ããã·ã³ãã«ã§ä¿¡é Œæ§ã®é«ãã
DRYã«ãŒã«ã®å®æçãªéåã®çµæãšããŠãäœããå€æŽããå¿ èŠãããå Žåãããã€ãã®å Žæã§ã³ãŒããç·šéããå¿ èŠããããŸããèšããŸã§ããªããããã¯æªè³ªãªè¡çºã§ãã
èŠããã«ãTNKernelã«ã¯ããŸããŸãªå®è£ ãå¿ èŠãªãã®ãå±±ã»ã©ãããŸãã
培åºçã«ãªãã¡ã¯ã¿ãªã³ã°ããããšã«ããŸãããäœãå£ããªãããã«ããããã«ãã«ãŒãã«ã®åäœãã¹ãã®å®è£ ãéå§ããŸããããããŠããã«ãTNKernelããŸã£ãããã¹ããããŠããªãããšãæããã«ãªããŸãããã«ãŒãã«èªäœã«äžå¿«ãªãã°ããããŸãïŒ
çºèŠããä¿®æ£ããããã°ã«é¢ããç¹å®ã®æ å ±ã«ã€ããŠã¯ãTNKernelãåå®è£ ããçç±ã
äŒãïŒTNeo
ããæç¹ã§ãç§ããã£ãŠããããšãããªãã¡ã¯ã¿ãªã³ã°ãã®ç¯å²ãã¯ããã«è¶ ããŠããããšãæããã«ãªããŸãããå®éãç§ã¯ã»ãšãã©ãã¹ãŠãå®å šã«æžãçŽããŸãããããã«ãTNKernel APIã«ã¯é·ãéæ°ã«ãªã£ãŠããããšãããã€ããã£ãã®ã§ãAPIãå°ãå€æŽããŸããããŸããèŠéããããšãããã®ã§ãããããå®è£ ããŸãããã¿ã€ããŒãã¹ã¿ãã¯ã®ãœãããŠã§ã¢å¶åŸ¡ãªãŒããŒãããŒãè€æ°ã®ãã¥ãŒããã®ã¡ãã»ãŒãžãåŸ æ©ããæ©èœãªã©ã§ãã
ååã«ã€ããŠã¯ããªãåããèããŠããŸãããTNKernelãšã®çŽæ¥æ¥ç¶ã瀺ãããããæ°é®®ã§ã¯ãŒã«ãªãã®ãè¿œå ãããã£ãã®ã§ãããããã£ãŠãæåã®ååã¯TNeoKernelã§ããã
ãããããã°ããããŠãããèªäœã¯ç°¡æœãªTNeoã«çž®å°ãããŸããã
TNeoã«ã¯ãRTOSçšã®æšæºæ©èœã»ããã«å ããŠãã©ãã«ããªã䟿å©ãªæ©èœããããŸããã»ãšãã©ã®æ©èœã¯ãªãã·ã§ã³ã§ãããããããããç¡å¹ã«ããŠã¡ã¢ãªãç¯çŽããããã©ãŒãã³ã¹ããããã«åäžãããããšãã§ããŸãã
- ã¿ã¹ã¯ããŸãã¯ã¹ã¬ããïŒã«ãŒãã«ãäžè¬çã«æžãããæãåºæ¬çãªæ©èœã
- ãã¥ãŒããã¯ã¹ïŒå
±æãªãœãŒã¹ãä¿è·ãããªããžã§ã¯ãïŒ
- ååž°çãã¥ãŒããã¯ã¹ïŒãªãã·ã§ã³ããã¥ãŒããã¯ã¹ã¯ãã¹ããããããã¯ãèš±å¯ããŸã
- ãããããã¯ã®å®çŸ©ïŒãããããã¯ãçºçããå Žåãã«ãŒãã«ã¯ä»»æã®ã³ãŒã«ããã¯é¢æ°ãåŒã³åºãããšã§ãããéç¥ã§ããŸã
- ã»ããã©ïŒã¿ã¹ã¯ãåæããããã®ãªããžã§ã¯ã
- åºå®ãµã€ãºã®ã¡ã¢ãªãããã¯ïŒã·ã³ãã«ã§ç¢ºå®çãªã¡ã¢ãªãããŒãžã£
- : , , , ;
- : - : ,
- : FIFO ,
- : .
- : RAM
- : ,
- åçãã£ãã¯ïŒã·ã¹ãã ã«äœã®é¢ä¿ããªãå Žåãã·ã¹ãã ãã£ãã¯ã®å®æçãªåŠçã«æ°ãåãããªã
- ãããã¡ã€ã©ãŒïŒåã¹ã¬ãããå®è¡ãããŠããæéãæ倧å®è¡æéãããã³ãã®ä»ã®æ å ±ã確èªã§ããŸã
ãããžã§ã¯ãã¯GitHubïŒTNeoã§ãã¹ããããŠããŸãã
çŸåšãã«ãŒãã«ã¯æ¬¡ã®ã¢ãŒããã¯ãã£ã«ç§»æ€ãããŠããŸãã
- ARM Cortex-Mã³ã¢ïŒCortex-M0 / M0 + / M1 / M3 / M4 / M4FïŒãµããŒããããããŒã«ãã§ãŒã³ïŒGCCãKeil RealViewãclangãIARïŒ
- ãã€ã¯ããããïŒPIC32MX / PIC24 / dsPIC
å®å šãªããã¥ã¡ã³ãã¯ãhtmlãšpdfã®2ã€ã®ããŒãžã§ã³ã§å ¥æã§ããŸãã
- æåŸã®å®å®ããTNeoïŒhtmlãpdf
- çŸåšã®éçºTNeoããŒã¿çïŒhtmlãpdf
- å€æŽå±¥æŽ
TNeoã®å®è£
ãã¡ããã1ã€ã®èšäºã§ã«ãŒãã«å šäœã®å®è£ ãã«ããŒããããšã¯éåžžã«å°é£ã§ãã代ããã«ãèªåã«ã¯ã¯ã£ããããŠããªãã£ãããšãæãåºããŠããããã®ããšã«éäžããããšããŸãã
ãããããŸã第äžã«ã1ã€ã®å éšæ§é ããªã³ã¯ãªã¹ããèæ ®ããå¿ èŠããããŸãã
é¢é£ãªã¹ã
ãªã³ã¯ãªã¹ãã¯ããç¥ãããããŒã¿æ§é ã§ãããèªè ã¯ããããããããã§ã«ç¥ã£ãŠããã§ãããããã ããå®å šãæãããã«ãTNeoã§ã®ãªã³ã¯ãªã¹ãã®å®è£ ãèŠãŠã¿ãŸãããã
ãªã³ã¯ãªã¹ãã¯ãTNeoã®ããããå Žæã§äœ¿çšãããŸããããå ·äœçã«ã¯ã埪ç°åæ¹åãªã³ã¯ãªã¹ãã䜿çšãããŸããCã®æ§é ã¯æ¬¡ã®ãšããã§ãã
/** * Circular doubly linked list item, for internal kernel usage. */ struct TN_ListItem { /// /// pointer to previous item struct TN_ListItem *prev; /// /// pointer to next item struct TN_ListItem *next; };
src / core / tn_list.cã§å®£èšãããŠããŸãã
ã芧ã®ãšãããæ§é ã«ã¯åãæ§é ã®ã€ã³ã¹ã¿ã³ã¹ãžã®ãã€ã³ã¿ãå«ãŸããŠããŸããã€ãŸããåã®èŠçŽ ãšæ¬¡ã®èŠçŽ ã§ãããã®ãããªæ§é ã®ãã§ãŒã³ãç·šæããŠã次ã®ããã«æ¥ç¶ã§ããŸãã

ããã¯ãã°ãããããšã§ãããããŸã䜿ãéããããŸãããåãªããžã§ã¯ãã«ããã€ãã®æçšãªããŒã¿ãå¿ èŠã§ãããïŒ
解決çã¯
struct TN_ListItem
ãã€ã³ã¹ã¿ã³ã¹ããã€ã³ããããå¥ã®æ§é ã«åã蟌ãããšã§ããããšãã°ã次ã®ãããªæ§é ããããšããŸã
MyBlock
ïŒ
struct MyBlock { int field1; int field2; int field3; };
ãããŠããã®æ§é ã®ã€ã³ã¹ã¿ã³ã¹ã®ã·ãŒã±ã³ã¹ãæ§ç¯ã§ããããã«ããããšæããŸãããŸã第äžã«ãç§ãã¡ã¯
struct TN_ListItem
ãããããã«çµã¿èŸŒã¿ãŸãã
ãã®äŸ
struct TN_ListItem
ã§ã¯ãå é ã«é 眮ããã®ãè«ççã§ãããå é ã ãã§ãªããã©ãã«ã§ãé 眮ã§ãã
struct MyBlock
ãã®ã匷調ãã
struct TN_ListItem
ããã«ãäžå€®ã«é 眮ããŸãããã
struct MyBlock { int field1; int field2; //-- say, embed it here. struct TN_ListItem list_item; int field3; };
OKããããŠä»ããã€ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãïŒ
//-- blocks to put in the list struct MyBlock block_first = { /* ... */ }; struct MyBlock block_second = { /* ... */ }; struct MyBlock block_third = { /* ... */ };
ãããŠä»ãããäžã€ã®éèŠãªãã€ã³ãïŒãªã¹ãèªäœãäœæããŸããããã¯ç©ºã§ã空ã§ããããŸãããããã¯åãæ§é ã®åãªãã€ã³ã¹ã¿ã³ã¹ã§ããã
struct TN_ListItem
ã©ãã«ãåã蟌ãŸããŠããŸããã
//-- list head struct TN_ListItem my_blocks;
ãªã¹ãã空ã®å Žåãåã®èŠçŽ ãšæ¬¡ã®èŠçŽ ãžã®ãã€ã³ã¿ã®äž¡æ¹ãèªåèªèº«ãæããŸã
my_blocks
ã
ããã§ããªã¹ãã次ã®ããã«æŽçã§ããŸãã

次ã®ãããªã³ãŒãã䜿çšããŠäœæã§ããŸãã
//-- , , // . . my_blocks.next = &block_first.list_item; my_blocks.prev = &block_third.list_item; block_first.list_item.next = &block_second.list_item; block_first.list_item.prev = &my_blocks; block_second.list_item.next = &block_third.list_item; block_second.list_item.prev = &block_first.list_item; block_third.list_item.next = &my_blocks; block_third.list_item.prev = &block_second.list_item;
ããã¯çŽ æŽãããããšã§ãããäžèšã®ããšããããŸã ã§
TN_ListItem
ã¯ãªããã®ãªã¹ããããããšãããã
MyBlock
ãŸããããããã¢ã€ãã¢ã¯ãéå§
MyBlock
ããéå§ãŸã§ã®ãªãã»ãã
list_item
ããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§åãã§ãããšããããšã§ã
MyBlock
ãã§ãããããžã®ãã€ã³ã¿ããã
TN_ListItem
ããã®ã€ã³ã¹ã¿ã³ã¹ãçµã¿èŸŒãŸããŠããããšãããã£ãŠããå Žå
MyBlock
ããã€ã³ã¿ããç¹å®ã®ãªãã»ãããæžç®ãããžã®ãã€ã³ã¿ãååŸã§ããŸã
MyBlock
ã
ããã«ã¯ç¹å¥ãªãã¯ãããããŸãïŒ
container_of()
ïŒsrc / core / internal / _tn_sys.hã§å®çŸ©ãããŠããŸãïŒïŒ
#if !defined(container_of) /* given a pointer @ptr to the field @member embedded into type (usually * struct) @type, return pointer to the embedding instance of @type. */ #define container_of(ptr, type, member) \ ((type *)((char *)(ptr)-(char *)(&((type *)0)->member))) #endif
ã®ããã«ãã€ã³ã¿ãæã£ãŠãããã
TN_ListItem
ã
MyBlock
次ã®ããã«å€éšãžã®ãã€ã³ã¿ãååŸããŸãã
struct TN_ListItem *p_list_item = /* ... */; struct MyBlock *p_my_block = container_of(p_list_item, struct MyBlock, list_item);
ããã§ãããšãã°ããªã¹ãå ã®ãã¹ãŠã®èŠçŽ ãèµ°æ»ã§ããŸã
my_blocks
ã
//-- loop cursor struct TN_ListItem *p_cur; //-- my_blocks for (p_cur = my_blocks.next; p_cur != &my_blocks; p_cur = p_cur->next) { struct MyBlock *p_cur_block = container_of(p_cur, struct MyBlock, list_item); //-- , p_cur_block MyBlock }
ãã®ã³ãŒãã¯æ©èœããŸãããããæ··ä¹±ãããªã¹ãã®å®è£ ã®è©³çŽ°ã§ãªãŒããŒããŒããããŸãããªã¹ããã¯ããŒã«ããããã®ç¹å¥ãªãã¯ããçšæããããšããå§ãããŸãïŒsrc / core / internal / _tn_list.hãã¡ã€ã«ã§
_tn_list_for_each_entry()
å®çŸ©ãããŸãã
次ã«ããã¹ãŠã®è©³çŽ°ãé衚瀺ã«ããŠãã€ã³ã¹ã¿ã³ã¹ã®ãªã¹ãã次ã®
MyBlock
ããã«ç§»åã§ããŸãã
struct MyBlock *p_cur_block; _tn_list_for_each_entry( p_cur_block, struct MyBlock, &my_blocks, list_item ) { //-- , p_cur_block MyBlock }
çµæãšããŠãããã¯ãªããžã§ã¯ãã®ãªã¹ããäœæããéåžžã«äŸ¿å©ãªæ¹æ³ã§ãããããŠããã¡ãããåããªããžã§ã¯ããè€æ°ã®ãªã¹ãã«å«ããããšãã§ããŸãããã®ãããæ§é ã«ã¯è€æ°ã®çµã¿èŸŒã¿ã€ã³ã¹ã¿ã³ã¹ãå¿ èŠ
struct TN_ListItem
ã§ãããã®ãªããžã§ã¯ããå«ããäºå®ã®ãªã¹ãããšã«ã
Hacker Newsã®å ã®èšäºïŒè±èªïŒãžã®ãªã³ã¯ãå ¬éããåŸãèªè ã®1人ã質åããŸããããªã³ã¯ãªã¹ã
struct TN_ListItem
ã¯ä»ã®æ§é ã«åã蟌ãããšã§å®è£ ãããã®ã¯ãªãã§ããã
struct TN_ListItem { TN_ListItem *prev; TN_ListItem *next; void *data; //-- }
ãã®è³ªåã¯èå³æ·±ãã®ã§ãèšäºèªäœã«åçãå«ããããšã«ããŸãã
ãTNeoã¯ããŒãããã¡ã¢ãªãå²ãåœãŠãŸããããã€ã³ã¿ãç¹å®ã®ã«ãŒãã«ãµãŒãã¹ã«ãã©ã¡ãŒã¿ãšããŠæž¡ããããªããžã§ã¯ãã§ã®ã¿æ©èœããŸããå®éãããã¯éåžžã«åªããŠããŸããå€ãã®å Žåãçµã¿èŸŒã¿ã·ã¹ãã ã¯æããŸã£ãã䜿çšããŸããã圌女ã®è¡åã¯ååã«æ±ºå®ãããŠããŸããã
ãããã£ãŠãããšãã°ãã¿ã¹ã¯ããã¥ãŒããã¯ã¹ãäºæããããã«ãªããšããã®ã¿ã¹ã¯ã¯ãã®ç¹å®ã®ãã¥ãŒããã¯ã¹ãåŸ æ©ããŠããã¿ã¹ã¯ã®ãªã¹ãã«è¿œå ããããã®æäœã®è€éãã¯OïŒ1ïŒã§ããåžžã«äžå®ã®ïŒãããŠãã¡ãªã¿ã«å°ããªïŒæéã§å®è¡ãããŸãã
ã¢ãããŒãcã䜿çšããå Žå
void *data;
ã2ã€ã®ãªãã·ã§ã³ããããŸãã
- - , -
struct TN_ListItem
( , , - ); -
struct TN_ListItem
( ) , .
. , , Linux (. «Linux Kernel Development» by Robert Love). helper- ( ) Linux, : , GCC- ,
typeof()
, .. TNeo GCC.
, TNeo :
- : (, )
- , ( )
- , ,
- ç
()
ã¿ã¹ã¯ããŸãã¯ã¹ã¬ããã¯ã·ã¹ãã ã®æãéèŠãªéšåã§ããçµå±ã®ãšãããããã¯ãŸãã«RTOSãäžè¬çã«ååšãããã®ã§ããæ¯èŒçåçŽãªãã€ã¯ãã³ã³ãããŒã©ãŒåãã®TNeoããã³ãã®ä»ã®RTOSã®ã³ã³ããã¹ãã§ã¯ãã¿ã¹ã¯ã¯ãïŒããããïŒä»ã®ã¿ã¹ã¯ãšäžŠè¡ããŠå®è¡ããããµãã«ãŒãã³ã§ãã
äžè¬çã«ãã¹ã¬ãããšããçšèªã奜ã¿ãŸãããTNKernelã§ã¯ã¿ã¹ã¯ãšããçšèªã䜿çšããŠãããããTNeoã§ã¯ã¿ã¹ã¯ãšããçšèªã䜿çšããŠäºææ§ãç¶æããŠããŸãããã®èšäºã§ã¯ãäž¡æ¹ã®çšèªãåãæå³ã§äœ¿çšããŸãã
ã·ã¹ãã å ã®æ¢åã®åã¿ã¹ã¯ã«ã¯
struct TN_Task
ãsrc / core / tn_tasks.hãã¡ã€ã«ã§å®£èšãããç¬èªã®èšè¿°åããããŸããããã¯ããªã倧ããªæ§é ã§ãã
ã¿ã¹ã¯èšè¿°åã®æåã®èŠçŽ ã¯ãã¿ã¹ã¯ã¹ã¿ãã¯ã®æäžéšãžã®ãã€ã³ã¿ãŒã§ãã
stack_cur_pt
ããã®äºå®ã¯ãã¢ã»ã³ãã©ã³ã³ããã¹ãã¹ã€ããã³ã°ã«ãŒãã³ã§ç©æ¥µçã«äœ¿çšãããŠããŸããã¿ã¹ã¯ãã³ãã«ãžã®ãã€ã³ã¿ãããã°ãåçŽã«ãªãã€ã¬ã¯ãããããšãã§ããçµæã®å€ã¯ã¿ã¹ã¯ã¹ã¿ãã¯ã®æäžéšãæããŸããããªãå¿«é©ã§ãã
çŸåšããã³æ¬¡ã®ã¿ã¹ã¯
ã«ãŒãã«ã«ã¯2ã€ã®ãã€ã³ã¿ãŒããããŸããçŸåšå®è¡äžã®ã¿ã¹ã¯ãšã次ã«éå§ãããã¿ã¹ã¯ã§ãã
äžã®src /ã³ã¢/å éš/ _tn_sys.hïŒ
/// task that is running now extern struct TN_Task *_tn_curr_run_task; /// task that should run as soon as possible (if it isn't equal to /// _tn_curr_run_task, context switch is needed) extern struct TN_Task *_tn_next_task_to_run;
ã³ã¡ã³ããããããããã«ãããããç°ãªãèšè¿°åãæããŠããå Žåã¯ãã³ã³ããã¹ããã§ããã ãæ©ãåãæ¿ããå¿ èŠããããŸãã
ã¿ã¹ã¯ã®åªå é äœãšèµ·åãã¥ãŒ
ã¿ã¹ã¯ã«ã¯ç°ãªãåªå é äœããããŸãã䜿çšå¯èœãªåªå é äœã®æ倧æ°ã¯ãããã»ããµã¯ãŒãã®æ¬¡å ã«ãã£ãŠæ±ºãŸããŸãã16ããããã€ã¯ãã³ã³ãããŒã©ãŒã§ã¯16ã®åªå é äœãããã32ãããã®åªå é äœã§ã¯32ã§ãããããçç±ã§æããã«ãªãã®ã§ãäžè¬çã«èšãã°ãç§ã¯ã¢ããªã±ãŒã·ã§ã³ã«ãã以äžå¿ èŠãšããŸããã 5ã€ãŸãã¯6ã€ã®åªå é äœãããã
åªå 床ããšã«ããã®åªå 床ãæã€å®è¡å¯èœã¿ã¹ã¯ã®ãªã³ã¯ãªã¹ãããããŸãã
äžã®src /ã³ã¢/å éš/ _tn_sys.hïŒ
/// list of all ready to run (TN_TASK_STATE_RUNNABLE) tasks extern struct TN_ListItem _tn_tasks_ready_list[TN_PRIORITIES_CNT];
TN_PRIORITIES_CNT
ãŠãŒã¶ãŒèšå®å¯èœãªå€ã¯ã©ãã«ãããŸããïŒãã¡ãããæ倧å€ãè¶ ããããšã¯ã§ããŸããïŒã
ã¿ã¹ã¯èšè¿°åã«ã¯ã
struct TN_ListItem
次ã®ã¿ã¹ã¯ãªã¹ãã®ããããã«è¿œå ãããã€ã³ã¹ã¿ã³ã¹ããããŸãã
/** * Task */ struct TN_Task { /* ... */ /// queue is used to include task in ready/wait lists struct TN_ListItem task_queue; /* ... */ }
ã«ãŒãã«ã«ã¯ãåãããã1ã€ã®åªå 床ã«å¯Ÿå¿ããããããã¹ã¯ïŒ1ã¯ãŒããµã€ãºïŒããããŸããããããèšå®ãããŠããå Žåãããã¯ã察å¿ããåªå 床ãæã€ã¿ã¹ã¯ãéå§ããæºåãã·ã¹ãã ã«ããããšãæå³ããŸãã
/// bitmask of priorities with runnable tasks. /// lowest priority bit (1 << (TN_PRIORITIES_CNT - 1)) should always be set, /// since this priority is used by idle task which should be always runnable, /// by design. extern volatile unsigned int _tn_ready_to_run_bmp;
ãã®ãããã«ãŒãã«ã¯ã©ã®ã¿ã¹ã¯ã転éããå¿ èŠãããããå€æããå¿ èŠãããå Žåãã¢ãŒããã¯ãã£ãå®è¡ããŸã-ã®ç¹å®ã®find-first-setåœä»€ãå®è¡ã
_tn_ready_to_run_bmp
ãããã«éå§ããæºåãã§ãããã¹ãŠã®ã¿ã¹ã¯ããæé«ã®åªå 床ãååŸããŸã 次ã«ã察å¿ããåªå 床ã®ã¿ã¹ã¯ãªã¹ãããæåã®ã¿ã¹ã¯ãååŸããããã«å¶åŸ¡ã移ããŸãã
ãã¡ãããã¿ã¹ã¯ãRunnableç¶æ ïŒå®è¡æºåå®äºïŒã«åºå ¥ãããå Žåã察å¿ããããããæäŸããŸãã
_tn_ready_to_run_bmp
ãããã¯éåžžã«ç°¡åã§ããäžè¬çã«ããã¹ãŠãé«éã§ãã
ã¿ã¹ã¯ã³ã³ããã¹ã
ã¿ã¹ã¯ãçŸåšå®è¡ãããŠããªãå Žåããã®ã³ã³ããã¹ãïŒãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ãšãã¿ã¹ã¯ãç¶è¡ããããã°ã©ã ã¡ã¢ãªå ã®ã¢ãã¬ã¹ïŒãã¹ã¿ãã¯ã«æ ŒçŽãããããšãæãåºããŠãã ããããŸã
stack_cur_ptr
ãã¿ã¹ã¯èšè¿°åã§ã¯ããã®ä¿åãããã³ã³ããã¹ãã®æäžéšãæ£ç¢ºã«æããŸãã
ã«ãŒãã«ããµããŒãããåã¢ãŒããã¯ãã£ïŒMIPSãARM Cortex-Mãªã©ïŒã«ã¯ãç¹å®ã®ã³ã³ãã¹ãæ§é ããããŸãããããã®ãã¹ãŠã®ã¬ãžã¹ã¿ãã¹ã¿ãã¯äžã«ã©ã®ããã«é 眮ãããŠããããã¿ã¹ã¯ãäœæãããéå§ã®æºåãå®äºãããšãã¹ã¿ãã¯ã®å é ã«ãåæåãã³ã³ããã¹ããå ¥åããããããã¿ã¹ã¯ãæçµçã«å¶åŸ¡ãååŸãããšããã®åæåã³ã³ããã¹ãã埩å ãããŸãããããã£ãŠãåã¿ã¹ã¯ã¯åé¢ãããã¯ãªãŒã³ãªç°å¢ã§å®è¡ãããŸãã
ã¿ã¹ã¯ç¶æ
ã¿ã¹ã¯ã¯ã次ã®ããããã®ç¶æ ã«ãªããŸãã
- å®è¡å¯èœïŒã¿ã¹ã¯ãå®è¡ããæºåãã§ããŠããŸãïŒããã¯ãã¿ã¹ã¯ãçŸåšå®éã«å®è¡ãããŠããããšãæå³ãããã®ã§ã¯ãããŸããïŒ
- åŸ æ©ïŒã¿ã¹ã¯ã¯äœãïŒãã¥ãŒããã¥ãŒããã¯ã¹ãã»ããã©ãªã©ããã®ã¡ãã»ãŒãžïŒãåŸ ã£ãŠããŸã
- äžæåæ¢ïŒã¿ã¹ã¯ã¯å¥ã®ã¿ã¹ã¯ã«ãã£ãŠäžæåæ¢ãããŸãã
- åŸ æ©+äžæïŒã¿ã¹ã¯ã¯åŸ æ©ç¶æ ã«ããããã®åŸãå¥ã®ã¿ã¹ã¯ã«ãã£ãŠäžæãããŸãã
- äŒæ¢ç¶æ
ïŒã¿ã¹ã¯ã¯äœæåŸã«ãŸã ã¢ã¯ãã£ãã«ãªã£ãŠããªãããåŒã³åºãã«ãã£ãŠç Žæ£ãããŠããŸã
tn_task_terminate
ã次åã¿ã¹ã¯ãã¢ã¯ãã£ãåããããšã以åã®ç¶æ ã¯ãŒãã«ãªã»ãããããã¯ãªãŒã³ãªç°å¢ã§èµ·åãããŸãã
ã¿ã¹ã¯ãç¶æ ãé¢ããããéã«ãã®ç¶æ ã«å ¥ããšãå®è¡ããå¿ èŠãããç¹å®ã®ã¢ã¯ã·ã§ã³ã»ããããããŸãã äŸïŒ
- Dormant, , ,
- Runnable,
_tn_ready_to_run_bmp
, - Runnable, , -
_tn_ready_to_run_bmp
, , - Wait, ( ), ,
- ã¿ã¹ã¯ãåŸ æ©ç¶æ ãçµäºãããšãåŸ æ©ãã¥ãŒããã¿ã¹ã¯ãåé€ãïŒãã®ãããªãã¥ãŒã«ããå ŽåïŒãã¿ã€ããŒããªã»ããããŸãïŒèšå®ãããŠããå ŽåïŒ
- ç
å®éãããšãã°ãã¿ã¹ã¯ãRunnableç¶æ ãé¢ãããšããã¿ã¹ã¯ãæ°ããç¶æ ã«ãªãã®ãå¿é ããå¿ èŠã¯ãããŸãããäžæåæ¢ïŒäŒç ïŒåé¡ã§ã¯ãããŸãããã©ã®å Žåã§ããåžžã«èµ·åãã¥ãŒããåé€ããŠãæ®ãã®å¿ èŠãªã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠããããŸãã
ãããå®è£ ããç°¡åã§ä¿¡é Œæ§ã®é«ãæ¹æ³ã¯ãç¶æ ããšã«3ã€ã®é¢æ°ãèšè¿°ããããšã§ãã
- ç¹å®ã®ç¶æ ã§ã¿ã¹ã¯ãå ¥åããŸãã
- æå®ãããç¶æ ããã¿ã¹ã¯ãåãåºããŸãã
- ã¿ã¹ã¯ãæå®ãããç¶æ ã«ãããã©ããã確èªããŸãã
ãããã£ãŠãsrc / core / tn_tasks.cãã¡ã€ã«ã«ã¯æ¬¡ã®é¢æ°ããããŸãã
void _tn_task_set_runnable(struct TN_Task * task) { /* ... */ } void _tn_task_clear_runnable(struct TN_Task * task) { /* ... */ } void _tn_task_set_waiting( struct TN_Task *task, struct TN_ListItem *wait_que, enum TN_WaitReason wait_reason, TN_TickCnt timeout ) { /* ... */ } void _tn_task_clear_waiting(struct TN_Task *task, enum TN_RCode wait_rc) { /* ... */ } //-- etc.
ãŸããããç¶æ ããå¥ã®ç¶æ ã«ã¿ã¹ã¯ã転éããå¿ èŠãããå Žåãéåžžã¯æ¬¡ã®ããã«èŠçŽãããŸãã
_tn_task_clear_dormant(task); _tn_task_set_runnable(task);
ãããŠããã¹ãŠã®å æ¿ã解決ãããããšã確信ã§ããŸãããã£ãããïŒ
ã¿ã¹ã¯äœæ
ã¿ã¹ã¯ãå®äºããå¿ èŠããããã®ã1ã€ãããŸããã¹ã¿ãã¯çšã®ã¹ããŒã¹ã§ãããã®ãããã¿ã¹ã¯ãäœæããåã«ããã®ã¿ã¹ã¯ã®ã¹ã¿ãã¯ãšããŠäœ¿çšãããé åãå²ãåœãŠããã®é åãæ®ãã®ãã®ãšãšãã«ã«æž¡ãå¿ èŠããã
tn_task_create()
ãŸãã
ã«ãŒãã«ã¯ãã¿ã¹ã¯ã¹ã¿ãã¯ã®å é ããã®é åã®å é ïŒãŸãã¯ã¢ãŒããã¯ãã£ã«å¿ããŠæ«å°ŸïŒã«èšå®ããã¿ã¹ã¯ãäŒç ç¶æ ã«ããŸããçŸæç¹ã§ã¯ã圌女ã¯ãŸã æã¡äžãã®æºåãã§ããŠããŸããããŠãŒã¶ãŒãåŒã³åºããš
tn_task_activate()
ïŒãŸãã¯ãã©ã°
TN_TASK_CREATE_OPT_START
ãæž¡ãããå Žå
tn_task_create()
ïŒãã«ãŒãã«ã¯æ¬¡ã®ããã«åäœããŸãã
- äŒæ¢ç¶æ ããã¿ã¹ã¯ãåé€ããŸãããã§ã«ãåãã®ãšããããã®æç¹ã§ã¿ã¹ã¯ã¹ã¿ãã¯ã¯ã¯ãªãŒã³ã³ã³ããã¹ãã§åæåãããŸãã
- ã¿ã¹ã¯ãå®è¡å¯èœç¶æ ã«ããŸãããã§ã«ãåãã®ãšããããã®æç¹ã§ãã¿ã¹ã¯ã¯å¯Ÿå¿ããå®è¡ãã¥ãŒã®æåŸã«é 眮ãããŸãã
ããã§ãã¹ã±ãžã¥ãŒã©ããã®ã¿ã¹ã¯ãåŠçããå¿ èŠã«å¿ããŠå®è¡ããŸãã
ã¿ã¹ã¯ã®éå§æ¹æ³ãèŠãŠã¿ãŸãããã
ã¿ã¹ã¯èµ·å
ãã¡ãããã¿ã¹ã¯ãå®è¡ããããã«å¿ èŠãªæé ã®æ£ç¢ºãªã·ãŒã±ã³ã¹ã¯ãã¢ãŒããã¯ãã£ã«ãã£ãŠç°ãªããŸãããã ããäžè¬çãªèãæ¹ãšããŠãã«ãŒãã«ã¯æ¬¡ã®ããã«æ©èœããŸãã
- æã瀺ãã¿ã¹ã¯ãã³ãã«ããã¹ã¿ãã¯ãã€ã³ã¿ãŒãååŸ
_tn_next_task_to_run
ããçŸåšã®ã¹ã¿ãã¯ãã€ã³ã¿ãŒãšããŠèšå®ããŸãã - å®è¡ãã
_tn_curr_run_task = _tn_next_task_to_run;
; - ã¹ã¿ãã¯ãããã¹ãŠã®ã¬ãžã¹ã¿ã®å€ã次ã ã«ããŒãããŸãïŒã¹ã¿ãã¯ãã€ã³ã¿ãã¿ã¹ã¯ã¹ã¿ãã¯ã®æäžéšã«èšå®ãããããšãæãåºããŠãã ããïŒããšããããã¢ãã¬ã¹ã¯ããã°ã©ã ã¡ã¢ãªã«ãããŒããããã¿ã¹ã¯ãåéããå¿ èŠããããŸãã
- å¶åŸ¡ãã¿ã¹ã¯ã«è»¢éããŸãã
ã«ãŒãã«ãã¿ã¹ã¯ã«å¶åŸ¡ãã©ã®ããã«æ£ç¢ºã«è»¢éãããã¯ããã§ã«ã¢ãŒããã¯ãã£ã«å®å šã«äŸåããŠããŸããããšãã°ãMIPSã§ã¯ãããã°ã©ã ã«ãŠã³ã¿ãŒã¿ã¹ã¯ãEPCã¬ãžã¹ã¿ïŒäŸå€ããã°ã©ã ã«ãŠã³ã¿ãŒïŒã«ä¿åããåœä»€ãå®è¡ãã
eret
ïŒäŸå€ããæ»ãïŒå¿ èŠããããŸããã€ãŸããã³ã¢ã¯ããã»ããµããã ãŸããããéåžžã®ãå²ã蟌ã¿ããæ»ã£ãŠãããã®ããã«åäœããŸããå®è¡åŸ
eret
ãçŸåšã®PCïŒããã°ã©ã ã«ãŠã³ã¿ãŒïŒã¯EPCã«ä¿åãããŠããå€ã«èšå®ãããå®éãã¿ã¹ã¯ã¯å®è¡ãç¶ç¶ããŸãã
ã³ã³ããã¹ãã¹ã€ãã
ã«ãŒãã«ãçŸåšã®ã¿ã¹ã¯ã®å®è¡ãäžæåæ¢ãã次ã®ã¿ã¹ã¯ã«å¶åŸ¡ã移ãããã»ã¹ã¯ããã³ã³ããã¹ãã¹ã€ããã³ã°ããšåŒã°ããŸãããã®æé ã¯ãåžžã«æäœã®åªå 床ãæã€ç¹å¥ãªISRã§å®è¡ãããŸãããã®ãããã³ã³ããã¹ããåãæ¿ããå¿ èŠãããå Žåãã«ãŒãã«ã¯å¯Ÿå¿ããå²ã蟌ã¿ããããèšå®ããŸãããŠãŒã¶ãŒã¿ã¹ã¯ãçŸåšå®è¡ãããŠããå Žåãã³ã³ããã¹ããåãæ¿ããISRã¯ãããã§ããã»ããµã«ãã£ãŠåŒã³åºãããŸãããã®ããããïŒå²ã蟌ã¿ã®åªå é äœã«é¢ä¿ãªãïŒä»ã®ISRããèšå®ãããŠããå Žåãã³ã³ããã¹ãåãæ¿ãã¯åŸã§éå§ãããŸãïŒçŸåšå®è¡äžã®ãã¹ãŠã®ISRãå¶åŸ¡ãè¿ããŸãã
ãã¡ãããã³ã³ããã¹ãã®åãæ¿ãã«äœ¿çšãããç¹å®ã®å²ã蟌ã¿ã¯ãã¢ãŒããã¯ãã£ã«ãã£ãŠç°ãªããŸããäŸãã°ãARMäžã®Cortex-Mäžã®OSã®ã³ã³ããã¹ãã¹ã€ããã®ããã«æäŸãããç¹å¥ãªäŸå€ãããPIC32ã³ã¢ãœãããŠã§ã¢å²ã蟌ã¿0ã䜿çšããŸã
PendSV
ã
ã«ãŒãã«ISRã¹ã€ããã³ã°ã³ã³ããã¹ããåŒã³åºããããšã次ã®ããšãè¡ããŸãã
- ãã¹ãŠã®ã¬ãžã¹ã¿ã®å€ãçŸåšã®ã¿ã¹ã¯ã®ã¹ã¿ãã¯ã«1ã€ãã€ä¿åããŸãããšããããã¢ãã¬ã¹ã¯ã¿ã¹ã¯ãäžæãããããã°ã©ã ã¡ã¢ãªã«ä¿åãããŸãã
- ãã¹ãŠã®ã¬ãžã¹ã¿ãã¹ã¿ãã¯ã«ä¿åããããšãã«ãŒãã«ã¯çŸåšã®ã¹ã¿ãã¯ãã€ã³ã¿ãŒãçŸåšã®ã¿ã¹ã¯ã®ãã³ãã«ã«ä¿åããŸãã
- ããããããªã³ã³ã³ããã¹ãã¹ã€ãããã³ãã©ãŒãå®è¡ããŸãïŒãããã®æ©èœã®ãããããæå¹ã«ãªã£ãŠããå Žåããããã¡ã€ã©ãŒããã³ã¹ã¿ãã¯ãªãŒããŒãããŒãããã°ã©ã ã§å¶åŸ¡ããããã«å¿ èŠã§ãïŒã
- 次ã«ãåã®ã»ã¯ã·ã§ã³ãã¿ã¹ã¯ã®èµ·åãã§ç€ºããã·ãŒã±ã³ã¹ã«é²ã¿ãŸãã
ã³ã³ããã¹ãã®åãæ¿ãã¯ãçŸåšã®ã¿ã¹ã¯ãããåªå 床ã®é«ãã¿ã¹ã¯ãå®è¡å¯èœã«ãªããšçºçããŸãããŸãã¯ãçŸåšã®ã¿ã¹ã¯ãåŸ æ©ç¶æ ã«ãªã£ããšãã
ããšãã°ãåªå 床ã®äœãéä¿¡æ©ãšåªå 床ã®é«ãåä¿¡æ©ã®2ã€ã®ã¿ã¹ã¯ããããšããŸããåä¿¡è ã¯ãã¥ãŒããã¡ãã»ãŒãžãååŸããããšããããããã¥ãŒã空ã®å Žåãã¿ã¹ã¯ã¯åŸ æ©ç¶æ ã«ãªããŸããå®è¡ã§ããªããªã£ããããã«ãŒãã«ã¯åªå 床ã®äœãTransmitterã¿ã¹ã¯ã«ç§»è¡ããŸãã
å³ãããããããã«ãäœåªå 床ã®Transmitterã¿ã¹ã¯ãserviceãåŒã³åºããŠã¡ãã»ãŒãžãéä¿¡ãããš
tn_queue_send()
ããã®ã¿ã¹ã¯ã¯é«åªå 床ã®Receiverãåªå ããŠã«ãŒãã«ã«ãã£ãŠããã·ã¥ãããŸãããã®ããã
tn_queue_send()
éä¿¡æ©ã«æ»ããŸã§ã«ãå€ãã®ããšãèµ·ãããŸããã
- ã³ã³ããã¹ãã¯Receiverã«åãæ¿ãããŸãã
- åä¿¡è ã¯ã¡ãã»ãŒãžãåä¿¡ããŠââåŠçããŸãã
- åä¿¡è ã¯æ¬¡ã®ã¡ãã»ãŒãžã®åä¿¡ãè©Šã¿ãåŸ æ©ç¶æ ã«å ¥ããŸãã
- ã³ã³ããã¹ãã¯éä¿¡æ©ã«æ»ããŸãã
ãããã£ãŠãã·ã¹ãã ã®å¿çæ§ã¯éåžžã«é«ããªããŸããã¿ã¹ã¯ã«é©åãªåªå 床ãèšå®ãããšãã€ãã³ãã¯éåžžã«è¿ éã«åŠçãããŸãã
ã¿ã¹ã¯ã¢ã€ãã«
TNeoã«ã¯1ã€ã®ç¹å¥ãªã¿ã¹ã¯ããããŸãïŒã¢ã€ãã«ãæãäœãåªå 床ãæã¡ïŒãŠãŒã¶ãŒã¿ã¹ã¯ã«ããã»ã©äœãåªå 床ãèšå®ããããšã¯ã§ããŸããïŒãåžžã«å®è¡ããæºåãã§ããŠããå¿ èŠããããŸãããããã£ãŠã
_tn_ready_to_run_bmp
åžžã«å°ãªããšã1ã€ã®ããããèšå®ãããŸããæããã«ãå®è¡ããæºåãã§ããŠããä»ã®ã¿ã¹ã¯ããªãå Žåãã«ãŒãã«ã¯ãã®ã¿ã¹ã¯ã«å¶åŸ¡ãæž¡ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯ãã¢ã€ãã«ã¿ã¹ã¯ããç¶ç¶çã«åŒã³åºãããã³ãŒã«ããã¯é¢æ°ãå®è£ ã§ããŸããããã¯ãããŸããŸãªäŸ¿å©ãªç®çã«äœ¿çšã§ããŸãã
- MCUã¹ãªãŒããã·ã¹ãã ã«äœã®é¢ä¿ããªãå Žåãæ¶è²»é»åãåæžããããã«ãããã»ããµãã¹ãªãŒãã«åãæ¿ããã®ãçã«ããªã£ãŠããŸãããã¡ãããã¢ããªã±ãŒã·ã§ã³ã¯ããã»ããµãã¹ãªãŒããçµäºããããã®æ¡ä»¶ãèšå®ããå¿ èŠããããŸããã»ãšãã©ã®å Žåãããã¯äœããã®å²ã蟌ã¿ã§ãã
- ã·ã¹ãã è² è·ã®èšç®ãæãåçŽãªå®è£ ïŒç¡éã«ãŒãã§å€æ°ã®å€ãã€ã³ã¯ãªã¡ã³ãããã ãã§ããå€ã®å€åãéãã»ã©ãã·ã¹ãã ã®è² è·ã¯å°ãããªããŸãã
ãªããªã ã¢ã€ãã«ã¿ã¹ã¯ã¯åžžã«éå§ããæºåãã§ããŠããå¿ èŠããããŸããã¿ã¹ã¯ãåŸ æ©ç¶æ ã«ããããšãã§ãããã®ã³ãŒã«ããã¯ããã«ãŒãã«ãµãŒãã¹ãåŒã³åºãããšã¯çŠæ¢ãããŠããŸãã
ã¿ã€ããŒ
ã«ãŒãã«ã«ã¯æéã®æŠå¿µãå¿ èŠã§ããéçãã£ãã¯ãšåçãã£ãã¯ã® 2ã€ã®ã¹ããŒã ã䜿çšã§ããŸãã
éçãã£ãã¯
éçãã£ãã¯ã¯ãã¿ã€ã ã¢ãŠããå®è£ ããæãç°¡åãªæ¹æ³ã§ããå®æçãªééã§å²ã蟌ã¿ãçæããããŒããŠã§ã¢ã¿ã€ããŒãå¿ èŠã§ãããã®èšäºã§ã¯ããã®ãããªã¿ã€ããŒãã·ã¹ãã ã¿ã€ããŒãšåŒã³ãŸãããã®ã¿ã€ããŒã®æéã¯ãŠãŒã¶ãŒå®çŸ©ã§ãïŒç§ã¯åžžã«1 msã䜿çšããŸãããããã¡ãããä»»æã®æéãèšå®ã§ããŸãïŒããã®ã¿ã€ããŒã®ISRã§ã¯ãç¹å¥ãªã«ãŒãã«ãµãŒãã¹ãåŒã³åºãã ãã§ãã
//-- example for PIC32, hardware timer 5 interrupt: tn_p32_soft_isr(_TIMER_5_VECTOR) { INTClearFlag(INT_T5); tn_tick_int_processing(); }
tn_tick_int_processing()
åŒã³åºããããã³ã«ãã·ã¹ãã ãã£ãã¯ãçºçãããšèšããŸãããã®é¢æ°å ã§ãã«ãŒãã«ã¯ãäœããã®ã¿ã€ããŒã®ã³ãŒã«ããã¯ãåŒã³åºãæéã§ãããã©ããã確èªããããã§ããå Žåã¯åŒã³åºããŸãã
ã¿ã€ããŒã®æãåçŽãªå®è£ ã¯æ¬¡ã®ããã«ãªããŸãããã¹ãŠã®ã¢ã¯ãã£ãã¿ã€ããŒã®ãªã³ã¯ãªã¹ãããããã·ã¹ãã ãã£ãã¯ããšã«ã¿ã€ããŒã®ãªã¹ãå šäœã調ã¹ãåã¿ã€ããŒã«å¯ŸããŠæ¬¡ã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
- ã¿ã€ã ã¢ãŠãå€ã1æžãããŸãã
- æ°ããå€ããŒãã®å Žåããã®ã¿ã€ããŒããªã¹ãããåé€ãïŒã€ãŸããã¿ã€ããŒãéã¢ã¯ãã£ãã«ãïŒãã¿ã€ããŒã³ãŒã«ããã¯ãéå§ããŸãã
ãã®ã¢ãããŒãã«ã¯é倧ãªæ¬ ç¹ããããŸãã
- ã³ãŒã«ããã¯ããã¿ã€ããŒã管çããããšã¯ã§ããŸãããããšãã°ãæ°ããã¿ã€ããŒãè¿œå ãããšãã¿ã€ããŒã®ãªã¹ããå€æŽãããŸãã ããããä»¥æ¥ , ;
- : .
ãããããæåŸã®ãã€ã³ãã¯çµã¿èŸŒã¿ã·ã¹ãã ã§ã¯ããã»ã©éèŠã§ã¯ãããŸããã誰ãããã®ãããªå€æ°ã®ã¿ã€ããŒãå¿ èŠãšããããšã¯ãŸããããŸããããã ããæåã®ãã€ã³ãã¯éåžžã«éèŠã§ããã¿ã€ããŒã³ãŒã«ããã¯ããã¿ã€ããŒãè¿œå ïŒãŸãã¯åæ§æïŒã§ããããã«ãããã®ã§ãã
ãããã£ãŠãTNeoã¯ããå·§åŠãªã¢ãããŒããåããŸããåºæ¬çãªèãæ¹ã¯Linuxã«ãŒãã«ããåãããŠããŸãããïŒ1ïŒçµã¿èŸŒã¿ã·ã¹ãã ã¯Linuxãèšè¿°ãããŠãããã·ã³ããããªãœãŒã¹ãå€§å¹ ã«å°ãªããããïŒ2ïŒTNeoã¯Linuxã®ã¹ã±ãŒãªã³ã°ãšåæ§ã«ã¹ã±ãŒãªã³ã°ããå¿ èŠããããŸãããLinuxããã€ã¹ãã©ã€ããŒã第3çã®Linuxã¿ã€ããŒã«ã€ããŠèªãããšãã§ããŸãã
- æéãé
延ãããã³é
延äœæ¥
- ã«ãŒãã«ã¿ã€ããŒ
- ã«ãŒãã«ã¿ã€ããŒã®å®è£
- ã«ãŒãã«ã¿ã€ããŒã®å®è£
- ã«ãŒãã«ã¿ã€ããŒ
ãã®æ¬ã¯ããªã³ã¯http://lwn.net/Kernel/LDD3/ ã§èª°ã§ãå©çšã§ããŸã
ããã®ãããTNeoã§ã®ã¿ã€ããŒã®å®è£ ã«ç®ãåããŸãã
Nã®ã«ã¹ã¿ã å€ããããããã¯2ã®ã¹ãä¹ã§ãªããã°ãªããŸãããéåžžã®å€ã¯4ã8ããŸãã¯16ã§ãããªã¹ãã®é åïŒãããããã£ãã¯ãªã¹ãïŒãããããã®é åã¯Nåã®èŠçŽ ã§æ§æãããŠããŸããã€ãŸããNåã®ãã£ãã¯ãªã¹ãããããŸãã
ã·ã¹ãã ã®æ°ã1ããïŒN-1ïŒã«ãªã£ãåŸã«ã¿ã€ããŒãåãããšããã®ã¿ã€ããŒã¯ãããã®ãã£ãã¯ãªã¹ãã®1ã€ã«è¿œå ãããŸãããã£ãã¯ãªã¹ãçªå·ã¯ãé©åãªãã¹ã¯ãã¿ã€ã ã¢ãŠãã«ãªãŒããŒã¬ã€ããã ãã§èšç®ãããŸãïŒããããNã2ã®ã¹ãä¹ã§ãªããã°ãªããªãçç±ã§ãïŒãã¿ã€ããŒãåŸã§æéåãã«ãªããšãããžã§ããªãã¯ããªã¹ãã«è¿œå ãããŸãã
ãã¡ããããã¹ã¯ã¯Nã«å¯Ÿå¿ããŸããããšãã°ãN = 4ã®å Žåããã¹ã¯ã䜿çšãããŸã
0b0011
; N = 8ã®å Žåããã¹ã¯ã䜿çšãããŸã
0b0111
ã
Nçªç®ã®ã·ã¹ãã ãã£ãã¯ããšã«ãã«ãŒãã«ã¯ãå ±éããªã¹ãã®ãã¹ãŠã®ã¿ã€ããŒãééããåã¿ã€ããŒã«å¯ŸããŠæ¬¡ã®ã¢ã¯ã·ã§ã³ãå®è¡ããŸãã
- ã¿ã€ã ã¢ãŠãã¯Næžå°ããŸãã
- çµæã®ã¿ã€ã ã¢ãŠããNããå°ããå Žåãã¿ã€ããŒã¯å¯Ÿå¿ãããã£ãã¯ãªã¹ãã«ç§»åããŸãã
ãããŠãã·ã¹ãã ãã£ãã¯ããšã«ã察å¿ãã1ã€ã®ãã£ãã¯ãªã¹ãã調ã¹ããã®ãªã¹ããããã¹ãŠã®ã¿ã€ããŒãç¡æ¡ä»¶ã«ã³ãŒã«ããã¯ããŸãããã®ãœãªã¥ãŒã·ã§ã³ã¯ãäžèšã§èª¬æããæãåçŽãªãã®ãããå¹ççã§ããã¿ã€ããŒã®ãªã¹ãå šäœãNãã£ãã¯ã§1åã ãééããå¿ èŠããããæ®ãã®å Žåã¯ããªã¹ããæ¢ã«æºåãããŠãããã¹ãŠã®ã¿ã€ããŒãç¡æ¡ä»¶ã§ãã·ã¥ãŒããããŸãã
æ°é ãã®ããèªè ã¯çåã«æããããããŸãããå®éã«Nåã®ãªã¹ããããã®ã«ããªãïŒN-1ïŒãã£ãã¯ãªã¹ãã®ã¿ã䜿çšããã®ã§ãããããããã¯ãã¿ã€ããŒã³ãŒã«ããã¯ããã¿ã€ããŒãå€æŽã§ããããã«ãããã ãã ããã§ãã Nåã®ãªã¹ãã䜿çšããã¿ã€ã ã¢ãŠããNã«çããã¿ã€ããŒããŠãŒã¶ãŒãè¿œå ãããšãçŸåšå®è¡äžã®ãªã¹ãã«æ°ããã¿ã€ããŒãè¿œå ãããŸããããã¯ã§ããŸããã
ïŒN-1ïŒãªã¹ãã䜿çšããå ŽåãçŸåšæž¡ãããŠãããã£ãã¯ãªã¹ãã«æ°ããã¿ã€ããŒãè¿œå ã§ããªãããšãä¿èšŒããŸãïŒã¡ãªã¿ã«ããã®ãªã¹ãããã¿ã€ããŒãåé€ã§ããŸãããããã«ããåé¡ã¯çºçããŸããïŒ ã
ãã®ã¿ã€ããŒã®å®è£ ã¯å€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ååã«åãå ¥ããããŸãããæã«ã¯çæ³çã§ã¯ãããŸããïŒããã€ã¹ãã»ãšãã©äœãããªãã§ã»ãšãã©ã®æéãè²»ãããŠããå ŽåãMCUã¯å®æçã«èµ·åããŠã·ã¹ãã ãã£ãã¯ãåŠçããå¿ èŠããããŸããããŠãç ãã«æ»ããŸãããã®ããã«ãåçãã£ãã¯ãå®è£ ãããŸããã
åçãã£ãã¯
åºæ¬çãªèãæ¹ã¯ãç¡é§ãªåŒã³åºããåãé€ãããšã§ã
tn_tick_int_processing()
ãã«ãŒãã«ã100ã·ã¹ãã ãã£ãã¯ãä»ããŠã¿ã¹ã¯ãèµ·åããå¿ èŠãããå Žåãã·ã¹ãã ãã£ãã¯ã®
tn_tick_int_processing()
100åšæåŸã«æ£ç¢ºã«åŒã³åºãå¿ èŠããããŸãïŒãã¡ãããå€éšéåæã€ãã³ããçºçããŠãããå€æŽããå¯èœæ§ããããŸãïŒã
ãããè¡ãã«ã¯ãã«ãŒãã«ãã¢ããªã±ãŒã·ã§ã³ãšãã£ããã§ããå¿ èŠããããŸãã
tn_tick_int_processing()
Nãã£ãã¯ãä»ããŠæ¬¡ã®åŒã³åºããã¹ã±ãžã¥ãŒã«ããã«ã¯ã- æéãå°ããïŒã€ãŸããçŸåšã®ã·ã¹ãã ã®ãã£ãã¯æ°ãååŸããïŒã
ãããã£ãŠãåçãã£ãã¯ã¢ãŒããã¢ã¯ãã£ãïŒ
TN_DYNAMIC_TICK
1ã«èšå®ïŒã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¯ã·ã¹ãã èµ·åæã«ãããã®ã³ãŒã«ããã¯ãžã®ãã€ã³ã¿ãŒãæäŸããå¿ èŠããããŸãããã¡ããããããã®ã³ãŒã«ããã¯ã®å®éã®å®è£ ã¯ãMCUã®ã¿ã€ãã«å®å šã«äŸåããŸãïŒåãã¢ãŒããã¯ãã£ã§ããç°ãªãåšèŸºæ©åšãªã©ãæã€èšå€§ãªæ°ã®MCUããããŸãïŒããããã£ãŠããããã®ã³ãŒã«ããã¯ã®æ£ããå®è£ ã¯ã¢ããªã±ãŒã·ã§ã³ã«ãããŸãã
ã·ã¹ãã ãèµ·å
æ£åžžã«æ©èœããã«ã¯ãã«ãŒãã«ã«æ¬¡ã®ãã®ãå¿ èŠã§ãã
- ã¢ã€ãã«ã¿ã¹ã¯ã¹ã¿ãã¯çšã®ã¹ããŒã¹ã
- å²ã蟌ã¿ã¹ã¿ãã¯çšã®ã¹ããŒã¹ã
- ã¢ã€ãã«ã¿ã¹ã¯ã®ã³ãŒã«ããã¯ã
- ããçš®ã®ãŠãŒã¶ãŒã¿ã¹ã¯ã
ãã®ãããã·ã¹ãã ãèµ·åããåã«ãã¢ããªã±ãŒã·ã§ã³ã¯Idleã¿ã¹ã¯ã¹ã¿ãã¯ãšå²ã蟌ã¿ã«é åãå²ãåœãŠãIdleã¿ã¹ã¯ã³ãŒã«ããã¯ïŒç©ºã®å ŽåãããïŒãæäŸããå°ãªããšã1ã€ïŒéåžžã¯1ã€ïŒã®ãŠãŒã¶ãŒã¿ã¹ã¯ãäœæããå¿ èŠãããç¹å¥ãªã³ãŒã«ããã¯ãæäŸããå¿ èŠããããŸããããã¯èµ·åãããæåã®ã¿ã¹ã¯ã§ãããç§ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯éåžžã
task_init
ãŸãã¯ãåŒã³åºããŸã
task_conf
ãæããã«ãã¢ããªã±ãŒã·ã§ã³ãåæåããŠããŸããã¢ããªã±ãŒã·ã§ã³ããå¿ èŠããããŸãã
main()
- ãåŒã³åºããŠã·ã¹ãã å²ã蟌ã¿ãç¡å¹ã«ããŸã
tn_arch_int_dis()
ã - ãã€ã¯ãã³ã³ãããŒã©ãŒã®äž»èŠãªåæåãå®è¡ããŸããå°ãªããšããçºæ¯åšã®èšå®ã
- ã·ã¹ãã ã¿ã€ããŒã®å²ã蟌ã¿ãæ§æããŸãïŒISRã®åŒã³åºãå
tn_tick_int_processing()
ïŒã - ãåŒã³åºããŠ
tn_sys_start()
ããã¹ãŠã®å¿ èŠãªæ å ±ãæäŸããŸãïŒã¹ã¿ãã¯ã®é åãžã®ãã€ã³ã¿ãŒããã®ãµã€ãºãããã³ã³ãŒã«ããã¯é¢æ°ã
ã«ãŒãã«ã¯æ¬¡ã®ããšãè¡ããŸãã
- èµ·åãã¥ãŒïŒãªã¹ãã®é
å
_tn_tasks_ready_list
ïŒããã³ã«ãŒãã«ã®å éšç¶æ ã®ä»ã®åŽé¢ãåæåããŸãã - ã¢ã€ãã«ã¿ã¹ã¯ãäœæããŠã¢ã¯ãã£ãã«ããŸãïŒãã®åŸ
_tn_next_task_to_run
ãã¢ã€ãã«ã¿ã¹ã¯ãã³ãã«ããã€ã³ãããŸãïŒã - æåã®ãŠãŒã¶ãŒå®çŸ©ã¿ã¹ã¯ãäœæããã³ã¢ã¯ãã£ãåããããŠãŒã¶ãŒå®çŸ©é¢æ°ãåŒã³åºããŸãïŒãã®åŸ
_tn_next_task_to_run
ãæé«åªå 床ã®ãŠãŒã¶ãŒå®çŸ©ã¿ã¹ã¯ãžã®ãã³ãã«ãæããŸãïŒã _tn_arch_sys_start()
ã³ã³ããã¹ããåãæ¿ããããã®å²ã蟌ã¿ãéå§ããèšè¿°åãæãã¿ã¹ã¯ãžã®æåã®ã³ã³ããã¹ãåãæ¿ããå®è¡ããã¢ãŒããã¯ãã£äŸåã®é¢æ°ãåŒã³åºã_tn_next_task_to_run
ãŸãã
ãã®åŸãã·ã¹ãã ã¯éåžžã©ããåäœããŸãããŠãŒã¶ãŒã¿ã¹ã¯ãå¶åŸ¡ãåãããŠãŒã¶ãŒã¿ã¹ã¯ãå®è¡ã§ãããã¹ãŠã®æäœãå®è¡ã§ããŸããéåžžã圌女ã¯æ¬¡ã®ããšãè¡ããŸãã
- ããŒãäžã®ããŸããŸãªåšèŸºæ©åšïŒLCDãã£ã¹ãã¬ã€ããã©ãã·ã¥ãã©ã€ããªã©ïŒãåæåããŸãã
- ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšããããœãããŠã§ã¢ã¢ãžã¥ãŒã«ãåæåããŸãã
- ä»ã®ãã¹ãŠã®ãŠãŒã¶ãŒã¿ã¹ã¯ãäœæããŸãïŒãã¹ãŠãæ¢ã«åæåãããŠãããããäœæ¥ãéå§ã§ããŸãïŒã
å®è£ ã®è©³çŽ°
ããŠãç§ã¯ããæç¹ã§ãããã¹ãã ãšæããŸããççŽã«èšã£ãŠããã®èšäºã§ã¯å®è£ ã®ãã¹ãŠã®è©³çŽ°ã説æããããšã¯ã§ããŸããã
å šäœåãç解ããããã«å¿ èŠãªæãèå³æ·±ããããã¯ã«è§ŠããããšããŸãããä»ã®ãããã¯ã«ã€ããŠã¯ãèªè ã¯ãœãŒã¹ã³ãŒããç°¡åã«èª¿ã¹ãããšãã§ããŸããç§ã¯ãããæ¬åœã«è¯ãç解ã§ããããã«ããããšããŸããããœãŒã¹ãå©çšå¯èœã§ãïŒãããã䜿çšããŠãã ããïŒ
ã質åãããå Žåã¯ãã³ã¡ã³ãã§ãå°ããã ããã
åäœãã¹ã
éåžžããŠããããã¹ãã«ã€ããŠè©±ããšãã¯ããã¹ããã·ã³ã§å®è¡ããããã¹ããæå³ããŸããããããæ®å¿µãªãããçµã¿èŸŒã¿ã·ã¹ãã ã«äœ¿çšãããã³ã³ãã€ã©ã«ã¯å€ãã®å Žåãšã©ãŒãå«ãŸããŠãããããããŒããŠã§ã¢ã§çŽæ¥ã«ãŒãã«ããã¹ãããããšã«ããŸããããããã£ãŠãã«ãŒãã«ãããã€ã¹äžã§100ïŒ åäœããŠããããšã確èªã§ããŸãã
ãã¹ãã®å®è£ ã®ç°¡åãªæŠèŠïŒ
åªå 床ã®é«ãã¿ã¹ã¯ããã¹ããã£ã¬ã¯ã¿ãŒããããããäœæ¥ãã¿ã¹ã¯ãšããŸããŸãªRTOSãªããžã§ã¯ãïŒã¡ãã»ãŒãžãã¥ãŒããã¥ãŒããã¯ã¹ãªã©ïŒãäœæããäœæ¥ã¿ã¹ã¯ã«äœãããããæ瀺ããŸããäŸïŒ
- ã¿ã¹ã¯Aããã¥ãŒããã¯ã¹M1ããããã¯ããŸã
- ã¿ã¹ã¯Bããã¥ãŒããã¯ã¹M1ããããã¯ããŸã
- ã¿ã¹ã¯Cããã¥ãŒããã¯ã¹M1ããããã¯ããŸã
- ã¿ã¹ã¯Aããã¥ãŒããã¯ã¹M1ãåé€ããŸã
åã¹ãããã®åŸããã¹ããã£ã¬ã¯ã¿ãŒã¯ã¯ãŒã«ãŒãäœæ¥ãè¡ãã®ãåŸ ã¡ããã¹ãŠãèšç»ã©ããã«é²è¡ããŠããããšã確èªããŸããã¿ã¹ã¯ã®ã¹ããŒã¿ã¹ãåªå 床ãã«ãŒãã«ãµãŒãã¹ããæåŸã«è¿ãããå€ããªããžã§ã¯ãã®ããŸããŸãªããããã£ãªã©ã確èªããŸãã
詳现ãã°ãUARTã«è¡šç€ºãããŸããéåžžãåã¹ãããã®åŸã«ã次ã衚瀺ãããŸãã
- ãªãã©ã«ã³ã¡ã³ãã
- ãã¹ããã£ã¬ã¯ã¿ãŒã¯ã圌ãããŠããããšãæžããŸãã
- åäœæ¥ã¿ã¹ã¯ã¯ãå®è¡å 容ãæžã蟌ã¿ãŸãã
- ãã¹ããã£ã¬ã¯ã¿ãŒã¯ãã¹ãŠããã§ãã¯ããã¬ããŒããäœæããŸãã
衚瀺ããããã°ã®äŸã次ã«ç€ºããŸãã
//-- A locks M1 (line 404 in ../source/appl/appl_tntest/appl_tntest_mutex.c) [I]: tnt_item_proceed():2101: ----- Command to task A: lock mutex M1 (0xa0004c40) [I]: tnt_item_proceed():2160: Wait 80 ticks [I]: [Task A]: locking mutex (0xa0004c40).. [I]: [Task A]: mutex (0xa0004c40) locked [I]: [Task A]: waiting for command.. [I]: tnt_item_proceed():2178: Checking: [I]: * Task A: priority=6 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=TN_RC_OK (as expected) [I]: * Task B: priority=5 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=NOT-YET-RECEIVED (as expected) [I]: * Task C: priority=4 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=NOT-YET-RECEIVED (as expected) [I]: * Mutex M1: holder=A (as expected), lock_cnt=1 (as expected), exists=yes (as expected) //-- B tries to lock M1 -> B blocks, A has priority of B (line 413 in ../source/appl/appl_tntest/appl_tntest_mutex.c) [I]: tnt_item_proceed():2101: ----- Command to task B: lock mutex M1 (0xa0004c40) [I]: tnt_item_proceed():2160: Wait 80 ticks [I]: [Task B]: locking mutex (0xa0004c40).. [I]: tnt_item_proceed():2178: Checking: [I]: * Task A: priority=5 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=TN_RC_OK (as expected) [I]: * Task B: priority=5 (as expected), wait_reason=MUTEX_I (as expected), last_retval=NOT-YET-RECEIVED (as expected) [I]: * Task C: priority=4 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=NOT-YET-RECEIVED (as expected) [I]: * Mutex M1: holder=A (as expected), lock_cnt=1 (as expected), exists=yes (as expected) //-- C tries to lock M1 -> B blocks, A has priority of C (line 422 in ../source/appl/appl_tntest/appl_tntest_mutex.c) [I]: tnt_item_proceed():2101: ----- Command to task C: lock mutex M1 (0xa0004c40) [I]: tnt_item_proceed():2160: Wait 80 ticks [I]: [Task C]: locking mutex (0xa0004c40).. [I]: tnt_item_proceed():2178: Checking: [I]: * Task A: priority=4 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=TN_RC_OK (as expected) [I]: * Task B: priority=5 (as expected), wait_reason=MUTEX_I (as expected), last_retval=NOT-YET-RECEIVED (as expected) [I]: * Task C: priority=4 (as expected), wait_reason=MUTEX_I (as expected), last_retval=NOT-YET-RECEIVED (as expected) [I]: * Mutex M1: holder=A (as expected), lock_cnt=1 (as expected), exists=yes (as expected) //-- A deleted M1 -> B and C become runnable and have retval TN_RC_DELETED, A has its base priority (line 431 in ../source/appl/appl_tntest/appl_tntest_mutex.c) [I]: tnt_item_proceed():2101: ----- Command to task A: delete mutex M1 (0xa0004c40) [I]: tnt_item_proceed():2160: Wait 80 ticks [I]: [Task A]: deleting mutex (0xa0004c40).. [I]: [Task C]: mutex (0xa0004c40) locking failed with err=-8 [I]: [Task C]: waiting for command.. [I]: [Task B]: mutex (0xa0004c40) locking failed with err=-8 [I]: [Task B]: waiting for command.. [I]: [Task A]: mutex (0xa0004c40) deleted [I]: [Task A]: waiting for command.. [I]: tnt_item_proceed():2178: Checking: [I]: * Task A: priority=6 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=TN_RC_OK (as expected) [I]: * Task B: priority=5 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=TN_RC_DELETED (as expected) [I]: * Task C: priority=4 (as expected), wait_reason=DQUE_WRECEIVE (as expected), last_retval=TN_RC_DELETED (as expected) [I]: * Mutex M1: holder=NONE (as expected), lock_cnt=0 (as expected), exists=no (as expected)
äœããããŸããããªãå Žåãããã¯ãæåŸ ã©ãããã§ã¯ãªãããšã©ãŒãšè©³çŽ°ã§ãã
äžæåæ¢ããã¿ã¹ã¯ããªã¢ãŒãã¿ã¹ã¯ãåé€ããããªããžã§ã¯ããªã©ã®ç¶æ³ãå«ãã1ã€ã®ãµãã·ã¹ãã ïŒãã¥ãŒããã¯ã¹ããã¥ãŒãªã©ïŒã®ãã¬ãŒã ã¯ãŒã¯å ã§èµ·ãããããã¹ãŠã®ç¶æ³ãã·ãã¥ã¬ãŒãããããšããŸãããããã¯ã«ãŒãã«ãæ¬åœã«å®å®ã«ä¿ã€ã®ã«å€§ãã«åœ¹ç«ã¡ãŸãã
æåŸã®èšè
FreeRTOSã䜿çšããªãã®ã¯ãªãã§ããïŒ
ããŠãããã€ãã®çç±ããããŸãã
ãŸããç§ã¯åœŒãã®ã©ã€ã»ã³ã¹ã奜ãã§ã¯ãããŸãããã©ã€ã»ã³ã¹ã®äžã§ã¯ãFreeRTOSã¯ä»ã®è£œåãšæ¯èŒããããšãçŠããããŠããŸãïŒFreeRTOSã©ã€ã»ã³ã¹ã®æåŸã®æ®µèœãã芧ãã ããã
FreeRTOS may not be used for any competitive or comparative purpose, including the publication of any form of run time or compile time metric, without the express permission of Real Time Engineers Ltd. (this is the norm within the industry and is intended to ensure information accuracy).
ç§ãç¥ãéãã圌ãã¯Microchipãã©ãŒã©ã ã§ã®éåžžã«å€ãè°è«ã®åŸã«ãã®æ¡ä»¶ãè¿œå ããŸããã人ã ã¯ããã€ãã®ã³ã¢ãæ¯èŒããã°ã©ããæçš¿ãããããã®ã°ã©ãã¯FreeRTOSãæ¯æããŸããã§ããã FreeRTOSã®èè ã¯ã枬å®å€ãééã£ãŠãããšè¿°ã¹ãŸããããå¥åŠãªããšã«ããæ£ããã枬å®å€ãæäŸã§ããŸããã§ããã
ã ãããäœããã®åœ¢ã§FreeRTOSãæ®ãã«ãŒãã«ãæžãããšããŠããããã«ã€ããŠæžãããšã¯ã§ããŸãããç§ã¯äœããç解ããŠããªããããããŸããããç§ã®æèŠã§ã¯ãããçš®ã®ãã³ã»ã³ã¹ã§ããç§ã¯ãããã®ãã®ã奜ãã§ã¯ãããŸããã
ãšããã§ãæ°å¹ŽåãååãTNKernelãæšå¥šãããšãã圌ãã¯TNKernelãFreeRTOSããããã£ãšéããšèšã£ãŠããŸããã奜å¥å¿ããTNeoãå®è£ ããåŸããã¡ããããã€ãã®æ¯èŒãè¡ããŸããããæ®å¿µãªãããFreeRTOSã©ã€ã»ã³ã¹ã®ããã«ããããå ¬éããããšã¯ã§ããŸããã
第äºã«ããœãŒã¹ã³ãŒãã奜ãã§ã¯ãããŸããããã¶ãç§ã¯çæ³äž»çŸ©çããããããããŸããããç§ã«ãšã£ãŠãªã¢ã«ã¿ã€ã ã®æ žå¿ã¯ããçšåºŠç¹å¥ãªãããžã§ã¯ãã§ãããå¯èœãªéãçæ³ã«è¿ããã®ã«ãããã®ã§ãã
ã¯ããGitHubã§TNeoã³ãŒãããã§ãã¯ããŠããªããããæªãã®ãã説æãããšãã§ããããããããã¯ãã«ãŒãã«ãããã«æ¹åããã®ã«åœ¹ç«ã€ã§ãããïŒ
第äžã«ãå€ããå°ãªããæ¢æã®TNKernelã®ä»£æ¿åã欲ããã£ãæ¢åã®ã¢ããªã±ãŒã·ã§ã³ãæ°ããã«ãŒãã«ã«ç°¡åã«ç§»æ€ã§ããããã«ããŸããèšäºã®æåã®éšåã§èª¬æãããã€ã¯ãããããã€ã¯ãã³ã³ãããŒã©ãŒçšã®TNKernelã®åé¡ãèæ ®ãããšãããã€ã¹ã«ã¯åžžã«æªå®çŸ©ã®åäœã®å¯èœæ§ããããŸããã
ãããŠæåŸã«ãªããŸããããã³ã¢ã§ã®äœæ¥ã¯éåžžã«ãšããµã€ãã£ã³ã°ãªäœéšã§ãïŒ
ããã«ãããããããFreeRTOSã«ã¯ïŒããããïŒä»ã®ãã¹ãŠã®é¡äŒŒè£œåã«åãåŠå®ã§ããªãå©ç¹ããããŸãïŒããã¯èšå€§ãªæ°ã®ã¢ãŒããã¯ãã£ã«ç§»æ€ãããŠããŸãã幞ããªããšã«ãç§ã¯ããã»ã©å¿ èŠãããŸããã
TNeoã¯ã©ãã§äœ¿çšãããŸããïŒ
, TNeo , TNKernel: , , .. .
Microchip MASTERS 2014, StarLine Cortex-M. , .
TNeo â 16- 32- .
GitHub: TNeo .
, :
- ARM Cortex-M cores: Cortex-M0/M0+/M1/M3/M4/M4F (supported toolchains: GCC, Keil RealView, clang, IAR)
- Microchip: PIC32MX/PIC24/dsPIC
: html pdf.
: How I ended up writing new real-time kernel . .. â , , , «» .