ç§ã¯æ°å¹Žã«ããã£ãŠçµã¿èŸŒã¿ã·ã¹ãã ã«åãçµãã§ããŸãããåœç€Ÿã¯ãèªåè»ãå
é»åšãªã©ã®ãªã³ããŒãã³ã³ãã¥ãŒã¿ãŒãéçºããã³è£œé ããŠããŸãã
åœç€Ÿã®è£œåã§äœ¿çšãããããã»ããµã¯ãäž»ã«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ã€ã®æ°å€ã®åèšãèŠã€ããå ŽåïŒ
å®éãæ¬¡ã®ãããªããšãèµ·ãããŸãïŒãã¡ãããã¢ã¯ã·ã§ã³ã®ç¹å®ã®ã·ãŒã±ã³ã¹ã¯ã¢ãŒããã¯ãã£ã«ãã£ãŠç°ãªããŸãããäžè¬çã«ã¯èãæ¹ã¯å€ãããŸããïŒã
# 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();
è€æ°ã®æŒç®åreturn
ããããããã«æ»ãåã«ç¹å®ã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠãããå Žåã¯ããã®ãããªã³ãŒããåé¡ã®éµã«ãªããŸããæ¬¡ã®ããã«æžãæããããšããå§ãããŸãã int my_function(void) { int rc = SUCCESS; tn_disable_interrupt(); if (error()){ rc = ERROR; } else {
ããŠãæ»ãåã«å²ã蟌ã¿ãèš±å¯ããå¿
èŠãããããšãèŠããŠããå¿
èŠã¯ãããŸãããã³ã³ãã€ã©ã«äœæ¥ãä»»ããŠãã ãããããªãã¯çµæã®ããã«é ãã«è¡ãå¿
èŠã¯ãããŸããïŒçŸæç¹ã§ææ°ã®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ã®å®è£
ãã¡ããã1ã€ã®èšäºã§ã«ãŒãã«å
šäœã®å®è£
ãã«ããŒããããšã¯éåžžã«å°é£ã§ãã代ããã«ãèªåã«ã¯ã¯ã£ããããŠããªãã£ãããšãæãåºããŠããããã®ããšã«éäžããããšããŸãããããããŸã第äžã«ã1ã€ã®å
éšæ§é ããªã³ã¯ãªã¹ããèæ
®ããå¿
èŠããããŸããé¢é£ãªã¹ã
ãªã³ã¯ãªã¹ãã¯ããç¥ãããããŒã¿æ§é ã§ãããèªè
ã¯ããããããããã§ã«ç¥ã£ãŠããã§ãããããã ããå®å
šãæãããã«ãTNeoã§ã®ãªã³ã¯ãªã¹ãã®å®è£
ãèŠãŠã¿ãŸãããããªã³ã¯ãªã¹ãã¯ãTNeoã®ããããå Žæã§äœ¿çšãããŸããããå
·äœçã«ã¯ã埪ç°åæ¹åãªã³ã¯ãªã¹ãã䜿çšãããŸããCã®æ§é ã¯æ¬¡ã®ãšããã§ãã struct TN_ListItem {
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;
OKããããŠä»ããã€ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸãïŒ
ãããŠä»ãããäžã€ã®éèŠãªãã€ã³ãïŒãªã¹ãèªäœãäœæããŸããããã¯ç©ºã§ã空ã§ããããŸãããããã¯åãæ§é ã®åãªãã€ã³ã¹ã¿ã³ã¹ã§ãããstruct TN_ListItem
ã©ãã«ãåã蟌ãŸããŠããŸããã
ãªã¹ãã空ã®å Žåãåã®èŠçŽ ãšæ¬¡ã®èŠçŽ ãžã®ãã€ã³ã¿ã®äž¡æ¹ãèªåèªèº«ãæããŸãmy_blocks
ãããã§ããªã¹ããæ¬¡ã®ããã«æŽçã§ããŸããæ¬¡ã®ãããªã³ãŒãã䜿çšããŠäœæã§ããŸãã
ããã¯çŽ æŽãããããšã§ãããäžèšã®ããšããããŸã ã§TN_ListItem
ã¯ãªããã®ãªã¹ããããããšããããMyBlock
ãŸããããããã¢ã€ãã¢ã¯ãéå§MyBlock
ããéå§ãŸã§ã®ãªãã»ããlist_item
ããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§åãã§ãããšããããšã§ãMyBlock
ãã§ãããããžã®ãã€ã³ã¿ãããTN_ListItem
ããã®ã€ã³ã¹ã¿ã³ã¹ãçµã¿èŸŒãŸããŠããããšãããã£ãŠããå ŽåMyBlock
ããã€ã³ã¿ããç¹å®ã®ãªãã»ãããæžç®ãããžã®ãã€ã³ã¿ãååŸã§ããŸãMyBlock
ãããã«ã¯ç¹å¥ãªãã¯ãããããŸãïŒcontainer_of()
ïŒsrc / core / internal / _tn_sys.hã§å®çŸ©ãããŠããŸãïŒïŒ #if !defined(container_of) #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
ã
ãã®ã³ãŒãã¯æ©èœããŸãããããæ··ä¹±ãããªã¹ãã®å®è£
ã®è©³çްã§ãªãŒããŒããŒããããŸãããªã¹ããã¯ããŒã«ããããã®ç¹å¥ãªãã¯ããçšæããããšããå§ãããŸãïŒ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 ) {
çµæãšããŠãããã¯ãªããžã§ã¯ãã®ãªã¹ããäœæããéåžžã«äŸ¿å©ãªæ¹æ³ã§ãããããŠããã¡ãããåããªããžã§ã¯ããè€æ°ã®ãªã¹ãã«å«ããããšãã§ããŸãããã®ãããæ§é ã«ã¯è€æ°ã®çµã¿èŸŒã¿ã€ã³ã¹ã¿ã³ã¹ãå¿
èŠ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ïŒ
ã³ã¡ã³ããããããããã«ãããããç°ãªãèšè¿°åãæããŠããå Žåã¯ãã³ã³ããã¹ããã§ããã ãæ©ãåãæ¿ããå¿
èŠããããŸããã¿ã¹ã¯ã®åªå
é äœãšèµ·åãã¥ãŒ
ã¿ã¹ã¯ã«ã¯ç°ãªãåªå
é äœããããŸãã䜿çšå¯èœãªåªå
é äœã®æå€§æ°ã¯ãããã»ããµã¯ãŒãã®æ¬¡å
ã«ãã£ãŠæ±ºãŸããŸãã16ããããã€ã¯ãã³ã³ãããŒã©ãŒã§ã¯16ã®åªå
é äœãããã32ãããã®åªå
é äœã§ã¯32ã§ãããããçç±ã§æããã«ãªãã®ã§ãäžè¬çã«èšãã°ãç§ã¯ã¢ããªã±ãŒã·ã§ã³ã«ãã以äžå¿
èŠãšããŸããã 5ã€ãŸãã¯6ã€ã®åªå
é äœããããåªå
床ããšã«ããã®åªå
床ãæã€å®è¡å¯èœã¿ã¹ã¯ã®ãªã³ã¯ãªã¹ãããããŸããäžã®src /ã³ã¢/å
éš/ _tn_sys.hïŒ
TN_PRIORITIES_CNT
ãŠãŒã¶ãŒèšå®å¯èœãªå€ã¯ã©ãã«ãããŸããïŒãã¡ãããæå€§å€ãè¶
ããããšã¯ã§ããŸããïŒãã¿ã¹ã¯èšè¿°åã«ã¯ãstruct TN_ListItem
次ã®ã¿ã¹ã¯ãªã¹ãã®ããããã«è¿œå ãããã€ã³ã¹ã¿ã³ã¹ããããŸãã struct TN_Task {
ã«ãŒãã«ã«ã¯ãåãããã1ã€ã®åªå
床ã«å¯Ÿå¿ããããããã¹ã¯ïŒ1ã¯ãŒããµã€ãºïŒããããŸããããããèšå®ãããŠããå Žåãããã¯ã察å¿ããåªå
床ãæã€ã¿ã¹ã¯ãéå§ããæºåãã·ã¹ãã ã«ããããšãæå³ããŸãã
ãã®ãããã«ãŒãã«ã¯ã©ã®ã¿ã¹ã¯ã転éããå¿
èŠããããã倿ããå¿
èŠãããå Žåãã¢ãŒããã¯ãã£ãå®è¡ããŸã-ã®ç¹å®ã®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) { }
ãŸããããç¶æ
ããå¥ã®ç¶æ
ã«ã¿ã¹ã¯ã転éããå¿
èŠãããå Žåãéåžžã¯æ¬¡ã®ããã«èŠçŽãããŸãã _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ã§ã¯ãç¹å¥ãªã«ãŒãã«ãµãŒãã¹ãåŒã³åºãã ãã§ãã
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 . .. â , , , «» .