MicroPython æ§èœã®æå€§åï
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãMicroPython ã³ãŒãã®æ§èœãåäžãããæ¹æ³ã«ã€ããŠèª¬æããŸããä»ã®èšèªã䜿ã£ãæé©åãšããŠã¯ãCèšèªã§æžãããã¢ãžã¥ãŒã«ãš MicroPython ã€ã³ã©ã€ã³ã¢ã»ã³ãã©ãæ±ã£ãŠããŸãã
髿§èœãªã³ãŒããéçºããããã»ã¹ã¯ãæ¬¡ã®æ®µéãé çªã«å®æœããŸãã
æ§èœã®ããã®èšèš
ã³ãŒãã£ã³ã°ãšãããã°
æé©åã®æ®µé:
ã³ãŒãã®æãé ãéšåãç¹å®ã
Python ã³ãŒãã®å¹çãåäžã
ãã€ãã£ãã³ãŒããšããã¿ãŒã䜿çšã
ãã€ããŒã³ãŒããšããã¿ã䜿çšã
ããŒããŠã§ã¢åºæã®æé©åã䜿çšã
æ§èœã®ããã®èšèšï
æ§èœã®åé¡ã¯æåããèæ ®ããå¿ èŠããããŸããããã«ã¯ãæ§èœãæãéèŠãšãªãã³ãŒãã®ã»ã¯ã·ã§ã³ãèŠãŠããã®èšèšã«ç¹ã«æ³šæãæãããšãå«ãŸããŸããæé©åã®ããã»ã¹ã¯ãã³ãŒãããã¹ãããããšãã«å§ãŸããŸããèšèšãæåããæ£ããå Žåãæé©åã¯ç°¡åã§å®éã«ã¯äžèŠãªå ŽåããããŸãã
ã¢ã«ãŽãªãºã ï
æ§èœã®ããã«ã«ãŒãã³ãèšèšããéã®æãéèŠãªåŽé¢ã¯ãæè¯ã®ã¢ã«ãŽãªãºã ãæ¡çšãããããšã確å®ã«ããããšã§ãããã㯠MicroPython ã§ã¬ã€ããããããªããšã§ã¯ãªãæç§æžã®ãããã¯ã§ãããå¹çãããç¥ãããŠããã¢ã«ãŽãªãºã ãæ¡çšããããšã§ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããããšããããŸãã
RAM ã®å²ãåœãŠï
å¹çç㪠MicroPython ã³ãŒããèšèšããã«ã¯ãã€ã³ã¿ããªã¿ã RAM ãå²ãåœãŠãæ¹æ³ãçè§£ããŠããå¿ èŠããããŸãããªããžã§ã¯ããäœæãããããµã€ãºã倧ãããªããš(ããšãã°ãé ç®ããªã¹ãã«è¿œå ãããå Žåãªã©)ãå¿ èŠãª RAM ã¯ããŒããšåŒã°ãããããã¯ããå²ãåœãŠãããŸããããã«ã¯ããªãã®æéãããããŸããããã«å Žåã«ãã£ãŠã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãšããŠç¥ãããããã»ã¹ãèµ·åããŸãã
ãããã£ãŠããªããžã§ã¯ããïŒåããäœæãããããµã€ãºã倧ãããªãããšãèš±å¯ãããŠããªãå Žåã颿°ãŸãã¯ã¡ãœããã®ããã©ãŒãã³ã¹ã¯åäžããŸããããã¯ããªããžã§ã¯ãããã®äœ¿çšæéäžåç¶ããããšãæå³ããŸããéåžžãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿å ã§ã€ã³ã¹ã¿ã³ã¹åãããããŸããŸãªã¡ãœããã§äœ¿çšãããŸãã
ããã«ã€ããŠã¯ãåŸè¿°ã® ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®å¶åŸ¡ ã§ããã«è©³ãã説æããŸãã
ãããã¡ï
å ã«ãããã€ã¹ãšã®éä¿¡ã«ãããã¡ãå¿ èŠãšããäžè¬çãªäŸããããŸãããå žåçãªãã©ã€ããŒã¯ãã³ã³ã¹ãã©ã¯ã¿å ã«ãããã¡ãäœæãããããç¹°ãè¿ãåŒã³åºããã I/O ã¡ãœããã§äœ¿ããŸãã
MicroPython ã©ã€ãã©ãªã¯éåžžãäºåã«å²ãåœãŠããããããã¡ããµããŒãããŸããããšãã°ãã¹ããªãŒã ã€ã³ã¿ãã§ãŒã¹ããµããŒããããªããžã§ã¯ã(ãã¡ã€ã«ã UART ãªã©)ã¯ãèªã¿åãããŒã¿çšã«æ°ãããããã¡ãå²ãåœãŠã read() ã¡ãœãããæäŸããæ¢åã®ãããã¡ã«ããŒã¿ãèªã¿åã readinto() ã¡ãœãããæäŸããŸãã
åå©çšå¯èœãªãããã¡ãªããžã§ã¯ããäœæããããã®äŸ¿å©ãªã¯ã©ã¹ããããŸã:
æµ®åå°æ°ç¹ï
MicroPython ããŒãã«ãã£ãŠã¯æµ®åå°æ°ç¹æ°ãããŒãã«å²ãåœãŠãŸããããŒãã«ãã£ãŠã¯å°çšã®æµ®åå°æ°ç¹ã³ããã»ããµãæ¬ ããŠããŠãæŽæ°ãããããªãäœãé床ã§ç®è¡æŒç®ãããœãããŠã§ã¢ãå®è¡ãããããããŸãããæ§èœãéèŠãªå Žåã¯ãæŽæ°æŒç®ã䜿çšããæµ®åå°æ°ç¹ã®å©çšãæ§èœãéèŠã§ã¯ãªãã³ãŒãã®ã»ã¯ã·ã§ã³ã«å¶éããŸããããšãã°ãADC ã®èªã¿å€ãæŽæ°å€ãšããŠïŒåã®é åã§ååŸãããã®åŸã§ä¿¡å·åŠçã®ããã«ããããæµ®åå°æ°ç¹æ°ã«å€æããŸãã
é åï
ãªã¹ãã«ä»£ãããã®ãšããŠãããŸããŸãªã¿ã€ãã®é
åã¯ã©ã¹ã®å©çšãæ€èšããŠãã ãããarray ã¢ãžã¥ãŒã«ã¯ãPython ã®çµã¿èŸŒã¿ã¯ã©ã¹ bytes ã bytearray ã¯ã©ã¹ã§ãµããŒããããŠããïŒãããèŠçŽ ãå«ãããŸããŸãªèŠçŽ åããµããŒãããŠããŸãããããã®ããŒã¿æ§é ã¯ãã¹ãŠã飿¥ããã¡ã¢ãªäœçœ®ã«èŠçŽ ãæ ŒçŽããŠããŸããã¯ãªãã£ã«ã«ã³ãŒãã§ã®ã¡ã¢ãªå²ãåœãŠãé¿ããããã«ããããã¯äºåã«å²ãåœãŠãããåŒæ°ãŸãã¯ãã€ã³ãããããªããžã§ã¯ããšããŠæž¡ãããã¹ãã§ãã
memoryviewsï
bytearray ã€ã³ã¹ã¿ã³ã¹ãªã©ã®ãªããžã§ã¯ãã®ã¹ã©ã€ã¹ãæž¡ããšããPython ã¯ã¹ã©ã€ã¹ã®ãµã€ãºã«æ¯äŸãããµã€ãºã®å²ãåœãŠãå«ãã³ããŒãäœæããŸãããã㯠memoryview ãªããžã§ã¯ãã䜿çšããŠè»œæžã§ããŸãã memoryview èªäœã¯ããŒãäžã«å²ãåœãŠãããŸããããããæãã¹ã©ã€ã¹ã®ãµã€ãºã«é¢ä¿ãªããå°ããåºå®ãµã€ãºã®ãªããžã§ã¯ãã§ãã memoryview ãã¹ã©ã€ã¹ãããšãæ°ãã memoryview ãäœæããããããå²ã蟌ã¿ãµãŒãã¹ã«ãŒãã³ã§ã¯å®è¡ã§ããŸããããŸããã¹ã©ã€ã¹æ§æã® a:b ã§ã¯ã slice(a, b) ãªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åããããšã§ãããã«å²ãåœãŠãè¡ããŸãã
ba = bytearray(10000) # 巚倧ãªé
å
func(ba[30:2000]) # æ°èŠã« 2K ã®ã³ããŒãå²ãåœãŠãŠãæž¡ãããŸã
mv = memoryview(ba) # å°ããªãªããžã§ã¯ããå²ãåœãŠãããŸã
func(mv[30:2000]) # ã¡ã¢ãªã®ãã€ã³ã¿ãŒãæž¡ãããŸã
memoryview ã¯ãããã¡ãããã³ã«ããµããŒããããªããžã§ã¯ãã«ã®ã¿é©çšã§ããŸããããã«ã¯é
åã¯å«ãŸããŸãããªã¹ãã¯å«ãŸããŸãããã¡ãã£ãšããæ³šæç¹ã¯ã memoryview ãªããžã§ã¯ããçããŠããéã¯ãå
ã®ãããã¡ãªããžã§ã¯ããçãç¶ããŠãããšããããšã§ããã ããã memoryview ã¯æ®éçãªäžèœè¬ã§ã¯ãããŸãããããšãã°ãäžã®äŸã§ã10Kãããã¡ã䜿ãçµãã£ãŠããããããããã®ãã€ã 30:2000 ã ããå¿
èŠãªå Žåã¯ã代ããã«ã¹ã©ã€ã¹ãäœæããŠã10K ãããã¡ãç§»åãããŸã(ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®å¯Ÿè±¡ãšãªãããã«ããŸã)ãããããããšã§ãé·åœã® memoryview ãäœæããŠã10K ã GC ãããããã¯ããããŸãŸã«ãªããããªããšããªããªããŸãã
ããã§ãã memoryview ã¯é«åºŠãªäºåå²ãåœãŠãããã¡ç®¡çã«æ¬ ãããŸãããå
ã«ãšãããã readinto() ã¡ãœããã§ã¯ãããŒã¿ããããã¡ã®å
é ãã眮ããŠããããããã¡å
šäœãåããŸããæ¢åã®ãããã¡ã®éäžã«ããŒã¿ãé
眮ããå¿
èŠãããå Žåã¯ã©ãããŸããïŒ ãããã¡ã®å¿
èŠãªã»ã¯ã·ã§ã³ã«ã¡ã¢ãªãã¥ãŒãäœæããŠããã readinto() ã«æž¡ãã ãã§ãã
æååãšãã€ãåï
MicroPython 㯠æååã®éé¢å ã䜿ã£ãŠãåäžã®æååãè€æ°ååšããå Žåã«ã¡ã¢ãªãç¯çŽããŸããã©ã³ã¿ã€ã ã§æ°ããæååã確ä¿ããããã³(ããšãã°ã2ã€ã®æååãé£çµãããšããªã©)ãMicroPython ã¯æ°ããæååãéé¢åã§ãããã確èªããRAM ãç¯çŽããŸãã
ããã©ãŒãã³ã¹ãéèŠãªæååæäœãè¡ãã³ãŒãã§ã¯ bytes ãªããžã§ã¯ãããªãã©ã«(äŸ: b"abc")ã®å©çšãæ€èšããŠãã ãããããã«ããéé¢åã®ãã§ãã¯ãã¹ãããã§ããæååãªããžã§ã¯ãã䜿çšããå Žåãšæ¯ã¹ãŠæ°åé«éã«ãªãããšããããŸãã
泚é
æãé«éãªããã©ãŒãã³ã¹ãåŸãã«ã¯ãæ°ãããªããžã§ã¯ãã®äœæãå®å šã«é¿ããããšãçæ³çã§ããããšãã°ãåè¿°ã® åå©çšå¯èœãªãããã¡ ãå©çšãããªã©ã§ãã
ã³ãŒãã®æãé ãéšåãç¹å®ããï
ããã¯ãããã¡ã€ãªã³ã°ãšããŠç¥ãããŠããæç¶ãã§ãæç§æžã§ããšããããããŠããŠã(æšæºç㪠Python ã®ããã«)ããŸããŸãªãœãããŠã§ã¢ããŒã«ã§ãµããŒããããŠããŸããMicroPython ãã©ãããã©ãŒã äžã§å®è¡ãããå¯èœæ§ãé«ãå°åã®çµèŸŒã¿ã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠãæãé
ã颿°ãŸãã¯ã¡ãœãã㯠time ã¢ãžã¥ãŒã«ã«ãã ticks 颿°çŸ€ãè³¢æã«äœ¿ãããšã§ç¹å®ã§ããŸããã³ãŒãã®å®è¡æéã¯ãms, us, ãŸã㯠CPU ãµã€ã¯ã«ã§æž¬å®ã§ããŸãã
以äžã @timed_function ãã³ã¬ãŒã¿ãšããŠä»»æã®é¢æ°ãŸãã¯ã¡ãœããã«è¿œå ããããšã§ãå®è¡æéã®èšæž¬ãå¯èœã«ãªããŸãã
def timed_function(f, *args, **kwargs):
myname = str(f).split(' ')[1]
def new_func(*args, **kwargs):
t = time.ticks_us()
result = f(*args, **kwargs)
delta = time.ticks_diff(time.ticks_us(), t)
print('Function {} Time = {:6.3f}ms'.format(myname, delta/1000))
return result
return new_func
MicroPython ã³ãŒãã®æ¹è¯ï
const() 宣èšï
MicroPython 㯠const() 宣èšãæäŸããŸãããã㯠C èšèªã® #define ãšåæ§ã«äœçšãããã®ã§ãã³ãŒãããã€ãã³ãŒãã«ã³ã³ãã€ã«ããããšãã«ã³ã³ãã€ã©ãèå¥åã宿°å€ã«çœ®æããŸããããã«ãããå®è¡æã®èŸæžæ€çŽ¢ãåé¿ãããŸãã const() ã®åŒæ°ã¯ãã³ã³ãã€ã«æã«å®æ°ã«è©äŸ¡ããããã®ã§ããã°äœã§ãæ§ããŸãããããšãã° 0x100 ã 1 << 8 ã "string" ã 0.001 ã b"\x00\xff" ã ("read", "write") ãªã©ã§ãã
䜿çšäžã®èŠä»¶ãå¶éãäŸãå«ãå®å
šãªææžã¯ micropython.const() ãåç
§ããŠãã ããã
ãªããžã§ã¯ãåç §ã®ãã£ãã·ã¥ï
颿°ãŸãã¯ã¡ãœãããç¹°ãè¿ããªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããå Žåããªããžã§ã¯ããããŒã«ã«å€æ°ã«ãã£ãã·ã¥ããããšã§ããã©ãŒãã³ã¹ãåäžããŸãã
class foo(object):
def __init__(self):
self.ba = bytearray(100)
def bar(self, obj_display):
ba_ref = self.ba
fb = obj_display.framebuffer
# ããã2ã€ã®ãªããžã§ã¯ãã䜿ã£ãå埩çãªã³ãŒã
ãã㯠bar() ã¡ãœããæ¬äœã§ self.ba ãš obj_display.framebuffer ãç¹°ãè¿ãæ¢ãå¿
èŠæ§ãåé¿ããŸãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå¶åŸ¡ããï
ã¡ã¢ãªå²ãåœãŠãå¿ èŠãªå ŽåãMicroPython ã¯ããŒãäžã§é©åãªãµã€ãºã®ãããã¯ãèŠã€ããããšããŸããããã¯å€±æããå¯èœæ§ããããŸããããã¯éåžžãã³ãŒãå ã§åç §ãããªããªã£ããªããžã§ã¯ãã§ããŒããéç¶ãšããŠããããã§ããã¡ã¢ãªå²ãåœãŠã«å€±æããå Žåãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãšåŒã°ããããã»ã¹ãåç §ãããªããªã£ããªããžã§ã¯ãã䜿ã£ãŠããã¡ã¢ãªãååããå²ãåœãŠãå詊è¡ãããŸãããã®ããã»ã¹ã«ã¯æ°ããªç§ãããããšããããŸãã
gc.collect() ã宿çã«å®è¡ããããšã§ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå
åãããããšã«å©ç¹ããããããããŸããã第ïŒã«ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå®éã«å¿
èŠãšãããåã«è¡ã£ãŠãã°ããéãçµãããŸã - é »ç¹ã«è¡ããªãã°éåžž 1ms ã®ãªãŒããŒã§çµãããŸãã第ïŒã«ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã§æéãæ¶è²»ãããã³ãŒãå
ã®ãã€ã³ããæ±ºå®ã§ããã©ã³ãã ãªãã€ã³ã(ããããã¹ããŒããéèŠãããã»ã¯ã·ã§ã³)ã§ããé·ãé
å»¶ãçºçããã®ãåé¿ã§ããŸããæåŸã«ã宿çã«ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãå®è¡ãããšãããŒãå
ã®æçåãæžããããšãã§ããŸããéå€§ãªæçåã¯ãå埩äžå¯èœãªå²ãåœãŠã®å€±æã«ã€ãªããå¯èœæ§ããããŸãã
ãã€ãã£ãã³ãŒããšããã¿ãŒï
ããã«ãããMicroPython ã³ã³ãã€ã©ã¯ãã€ãã³ãŒãã§ã¯ãªããã€ãã£ãã® CPU ãªãã³ãŒããçºè¡ããŸããMicroPython ã®æ©èœã®å€§éšåãã«ããŒããŠããã®ã§ãã»ãšãã©ã®æ©èœã¯èª¿æŽãå¿ èŠãšããŸãã(ãã ãäžèšåç §)ãããã¯é¢æ°ãã³ã¬ãŒã¿ã«ãã£ãŠåŒã³åºãããŸãã
@micropython.native
def foo(self, arg):
buf = self.linebuf # ãªããžã§ã¯ãããã£ãã·ã¥
# ã³ãŒã
ãã€ãã£ãã³ãŒããšããã¿ãŒã®çŸåšã®å®è£ ã«ã¯äžå®ã®å¶éããããŸãã
raiseã䜿ãå Žåã¯ãåŒæ°ãæå®ããå¿ èŠããããŸããããã¯ã°ã©ãŠã³ãã¹ã±ãžã¥ãŒã©(
micropython.scheduleãåç §)ã¯ããã€ãã£ãã³ãŒãã®å®è¡äžã«ã¯åããŸãããã¹ã¬ãããš GIL (ã°ããŒãã«ã€ã³ã¿ããªã¿ããã¯)ãæã€ã¿ãŒã²ããã§ã¯ããã€ãã£ãã³ãŒãã®å®è¡äžã« GIL ãè§£æŸãããŸããã
ãããïŒç¹ã®åé¡ãç·©åããããã«ãé·æéå®è¡ããããã€ãã£ã颿°ã¯å®æçã« time.sleep(0) ãåŒã³åºãã¹ãã§ããããã«ããã¹ã±ãžã¥ãŒã©ãåããGIL ã®åãæ¿ããè¡ãããŸãã
ããã©ãŒãã³ã¹ã®åäž(ãã€ãã³ãŒãã®çŽ2åã®éã)ãšã®ãã¬ãŒããªãã¯ãã³ã³ãã€ã«ãããã³ãŒããµã€ãºã®å¢å ã§ãã
ãã€ããŒã³ãŒããšããã¿ãŒï
å ã«ãšããããæé©åã§ã¯ãPython ã³ãŒããæšæºã«æºæ ããŠããå¿ èŠããããŸãããã€ããŒã³ãŒããšããã¿ãŒã§ã¯å®å šæºæ ãšãªããŸãããæ§èœã远æ±ããããã«ãç¹å¥ãªãã€ããŒãã€ãã£ãããŒã¿åããµããŒãããŠããŸããæŽæ°ã«ã¯æ©æ¢°èªã®ã¯ãŒãã䜿ããããæŽæ°ã®åŠçãéæºæ ã§ã: 32ãããããŒããŠã§ã¢ã®ç®è¡ã¯ 2**32 ã®ç¯å²ã§å®è¡ããŸãã
ãã€ããŒã¯ãã€ãã£ããšããã¿ãŒãšåæ§ã«æ©æ¢°èªåœä»€ãçæããŸãããããã«æé©åãè¡ãããç¹ã«æŽæ°æŒç®ãšãããæäœã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãããã€ããŒã¯ãã³ã¬ãŒã¿ã䜿ã£ãŠåŒã³åºãããŸã:
@micropython.viper
def foo(self, arg: int) -> int:
# ã³ãŒã
äžèšã®ã³ãŒãã瀺ãããã«ããã€ããŒæé©åããŒã«ãæ¯æŽããããã« Python ã®åãã³ãã䜿ãããšãæçã§ããåãã³ãã¯ãåŒæ°ã®ããŒã¿åãšæ»ãå€ã®æ
å ±ãæäŸããŸãããã㯠PEP0484 ã§æ£åŒã«å®çŸ©ãããæšæºã® Python èšèªæ©èœã§ãããã€ããŒã¯ç¬èªã®åã»ãã int, uint (笊å·ãªãæŽæ°), ptr, ptr8, ptr16, ptr32 ããµããŒãããŠããŸããptrX åã«ã€ããŠã¯åŸè¿°ããŸããçŸåšã®ãšãã uint åã¯åäžã®ç®çã颿°ã®æ»ãå€ã®åãã³ããšããŠäœ¿ãããã«æäŸããŠããŸãããã®ãããªé¢æ°ã 0xffffffff ãè¿ãå ŽåãPython ã¯çµæã -1 ã§ã¯ãªãã2**32 -1 ãšããŠè§£éããŸãã
ãã€ããŒã§ã¯ããã€ãã£ããšããã¿ãŒã®å¶éã«å ããŠä»¥äžã®å¶éãé©çšãããŸã:
ããã©ã«ãã®åŒæ°å€ã¯èš±å¯ãããŠããŸããã
æµ®åå°æ°ç¹ã¯äœ¿ããŸãããæé©åãããŸããã
ãã€ããŒã¯æé©åãæ¯æŽããããã®ãã€ã³ã¿åãæäŸããŸããæ¬¡ã®ãã®ããããŸãã
ptrãªããžã§ã¯ãã®ãã€ã³ã¿ãŒptr8ãã€ããæããã€ã³ã¿ãŒptr1616ããããåã¯ãŒããæããã€ã³ã¿ãŒptr3232ããããã·ã³ã¯ãŒããæããã€ã³ã¿ãŒ
ãã€ã³ã¿ãŒã®æŠå¿µã¯ãPython ããã°ã©ãã«ã¯ãªãã¿ããªããããããŸããã memoryview ã¡ã¢ãªã«æ ŒçŽãããŠããããŒã¿ã«çŽæ¥ã¢ã¯ã»ã¹ã§ãããšããç¹ã§ãPython ãªããžã§ã¯ããšäŒŒãŠããŸããé
ç®ã«ã¯æ·»ãå衚èšã䜿ã£ãŠã¢ã¯ã»ã¹ããŸãããã¹ã©ã€ã¹ã¯ãµããŒãããŠããŸããããã€ã³ã¿ãŒã¯åäžã®é
ç®ã®ã¿ãè¿ãããšãã§ããŸãããã®ç®çã¯ããããã¡ãããã³ã«ããµããŒããããªããžã§ã¯ãã«æ ŒçŽãããããŒã¿ãããã€ã¯ãã³ã³ãããŒã©å
ã®ã¡ã¢ãªããããããåšèŸºã¬ãžã¹ã¿ãªã©ãé£ç¶ããã¡ã¢ãªäœçœ®ã«æ ŒçŽãããããŒã¿ãžã®é«éã©ã³ãã ã¢ã¯ã»ã¹ãæäŸããããšã§ãããã€ã³ã¿ãŒã䜿çšããããã°ã©ãã³ã°ã¯å±éºã§ããå¢çãã§ãã¯ã¯å®è¡ããããã³ã³ãã€ã©ã¯ãããã¡ãªãŒããŒã©ã³ãšã©ãŒãé²ãããã«äœãããŸããã
å žåçãªäœ¿ãæ¹ã¯å€æ°ããã£ãã·ã¥ããããšã§ã:
@micropython.viper
def foo(self, arg: int) -> int:
buf = ptr8(self.linebuf) # self.linebuf 㯠bytearray ãŸã㯠bytes ãªããžã§ã¯ã
for x in range(20, 30):
bar = buf[x] # ãã€ã³ã¿ãŒã§ããŒã¿é
ç®ã«ã¢ã¯ã»ã¹
# 以äžçç¥
ãã®äŸã«ãããŠãã³ã³ãã€ã©ã¯ buf ããã€ãé
åã®ã¢ãã¬ã¹ã§ããããšããèªèãããŠããŸãããã®ããã buf[x] å®è¡æã«ã¢ãã¬ã¹ãè¿
éã«èšç®ããããã®ã³ãŒããçºè¡ã§ããŸãããªããžã§ã¯ãããã€ããŒãã€ãã£ãåã«å€æããã®ã«ãã£ã¹ãã䜿ãå Žåããã£ã¹ãæäœã«ã¯æ°ãã€ã¯ãç§ãããããšãããããããããã¯ã¯ãªãã£ã«ã«ãªã¿ã€ãã³ã°ã«ãŒãã§ã¯ãªã颿°ã®éå§æã«å®è¡ããå¿
èŠããããŸãããã£ã¹ãã®èŠåã¯æ¬¡ã®ãšããã§ã:
ãã£ã¹ãæŒç®åã«ã¯çŸåšã®ãšãã
int,bool,uint,ptr,ptr8,ptr16,ptr32ããããŸãããã£ã¹ãã®çµæã¯ããã€ãã£ãã®ãã€ããŒå€æ°ã«ãªããŸãã
ãã£ã¹ãã®åŒæ°ã«ã¯ãPython ãªããžã§ã¯ããŸãã¯ãã€ãã£ãã®ãã€ããŒå€æ°ãæå®ã§ããŸãã
åŒæ°ããã€ãã£ããã€ããŒå€æ°ã§ããå Žåãåã«åãå€ããã ãã§(ããšãã°
uintããptr8)ããã£ã¹ãã¯äœãããªã(å®è¡æã«ã³ã¹ãã¯ããããªã)ã®ã§ããã®ãã€ã³ã¿ãŒã§ã¹ãã¢/ããŒãã§ããããã«ãªããŸããåŒæ°ã Python ãªããžã§ã¯ãã§ããããã£ã¹ãã
intãŸãã¯uintã§ããå ŽåãPython ãªããžã§ã¯ãã¯æŽæ°åã§ãªããã°ãªããããã®æŽæ°ãªããžã§ã¯ãã®å€ãè¿ãããŸããbool ãã£ã¹ããžã®åŒæ°ã¯æŽæ°å(ããŒã«å€ãŸãã¯æŽæ°)ã§ãªããã°ãªããŸãããæ»ãå€ã®åãšããŠäœ¿ãããå Žåããã€ããŒé¢æ°ã¯ True ãŸã㯠False ãªããžã§ã¯ããè¿ããŸãã
åŒæ°ã Python ãªããžã§ã¯ãã§ããããã£ã¹ãã
ptr,ptr16,ptr32ã®å ŽåãPython ãªããžã§ã¯ãã¯ãããã¡ãããã³ã«ãæããŠããã(ãããã¡ã®å é ãžã®ãã€ã³ã¿ãè¿ãå Žå)ãæŽæ°åã®ãã®ã§ãªããã°ãªããŸãã(ãã®å Žåããã®æŽæ°ãªããžã§ã¯ãã®å€ãè¿ãããŸã)ã
èªåãå°çšãªããžã§ã¯ããæããã€ã³ã¿ãŒãžã®æžèŸŒã¿ã¯ãæªå®çŸ©ã®åäœã«ãªããŸãã
次ã¯ãã³ X1 ã n ååãæ¿ããããã« ptr16 ãã£ã¹ãã䜿ã£ãäŸã瀺ããŠããŸãã
BIT0 = const(1)
@micropython.viper
def toggle_n(n: int):
odr = ptr16(stm.GPIOA + stm.GPIO_ODR)
for _ in range(n):
odr[0] ^= BIT0
ïŒã€ã®ã³ãŒããšããã¿ãŒã®è©³çŽ°ãªæè¡ç説æããKickstarter ã® Note 1 ãš Note 2 ã«ãããŸãã
ããŒããŠã§ã¢ã«çŽæ¥ã¢ã¯ã»ã¹ããï
泚é
ãã®ç« ã®ã³ãŒãäŸã¯ pyboard çšã§ãããã ããããã§èª¬æããææ³ã¯ä»ã® MicroPython ããŒãã«ãé©çšã§ããŸãã
ããããã¯ããé«åºŠãªããã°ã©ãã³ã°ã®ç¯çã«å ¥ããã¿ãŒã²ãã MCU ã®ç¥èãå¿ èŠã«ãªããŸããpyboard ã§åºåãã³ãåãæ¿ããäŸãèããŠã¿ãŸããããæšæºçãªã¢ãããŒãã¯ã次ã®ããã«æžãããšã§ãã
mypin.value(mypin.value() ^ 1) # mypin ã¯åºåãã³ãšããŠã€ã³ã¹ã¿ã³ã¹åãããã®
ããã«ã¯ Pin "ã€ã³ã¹ã¿ã³ã¹ã® value() ã¡ãœããã«å¯Ÿãã2åã®åŒã³åºãã®ãªãŒããŒããããå«ãŸããŸãããã®ãªãŒããŒãããã¯ããããã® GPIO ããŒãåºåããŒã¿ã¬ãžã¹ã¿(odr)ã®é¢é£ããããžã®èªã¿æžããå®è¡ããããšã§è§£æ¶ã§ããŸããããã容æã«ããããã« stm ã¢ãžã¥ãŒã«ã¯é¢é£ã¬ãžã¹ã¿ã®ã¢ãã¬ã¹ã®å®æ°ã®ã»ãããæäŸããŸããç·è²ã®LEDã«å¯Ÿå¿ãããã³ P4 (CPU ãã³ A14)ã®é«éãã°ã«ã¯ã次ã®ããã«å®è¡ã§ããŸãã
import machine
import stm
BIT14 = const(1 << 14)
machine.mem16[stm.GPIOA + stm.GPIO_ODR] ^= BIT14