
æè¡ã®çŸä»£ã®ãã¬ã³ãã¯ãããé«åºŠãªçµ±åã®éãæ©ãã§ããŸãã鲿©ã«ãããé»åããã€ã¹ã®éçºããã»ã¹ãèšèšè
ã®çµã¿ç«ãŠã«ãŸããŸãè¿ã¥ããããšãã§ããŸãã æãé¡èãªäŸã®1ã€ã¯ããããããããããªã³ã·ã¹ãã ãã®èšå€§ãªæ°ã§ã-SoCãã»ãšãã©ãããã奜ã¿ã®ãã€ã¯ãã³ã³ãããŒã©ãŒãšåšèŸºæ©åšã®æã 仿¥ã¯ããããã®ã·ã¹ãã ã®1ã€ã§ããNordic SemiconductorãããNRF51822ã«æ³šç®ããŸããããã¯ãBluetooth 4.0æšæºã«å«ãŸããBLEãã¯ãããžãŒãšé£æºããããã«é©åãããã·ã¹ãã ã®ãœãªã¥ãŒã·ã§ã³ã§ãã
ãŸããé»åããã€ã¹ã¯ãŸããŸãçµ±åã®ã¬ãã«ãé«ããŠããã®ã§ãããã°ã©ãã³ã°ã§ããé«ãã¬ãã«ã®æœè±¡åã«ãŸã§èžã¿èŸŒãã§ããªã¢ã«ã¿ã€ã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ããRTOSãå®è¡ããBluetoothã¢ããªã±ãŒã·ã§ã³ãäœæããŠã¿ãŸãããã
ãã®èšäºã®ç®æšã¯ãRTOS Keil-RTXãå®è¡ããNRF51822ã®ç°¡åãªçµã¿èŸŒã¿ã¢ããªã±ãŒã·ã§ã³ãäœæãã1ç§ã«1åADCãã¯ãšãªããåä¿¡ããå€ãBLEç¹æ§ã«æžã蟌ãããšã§ãã ãã®ãããã¯ã«èå³ãããå Žå-catãžããããã
RTOSãšBLEã«ã€ããŠç°¡åã«
RTOSã«ã€ããŠå€ãã®ããšãèšãããŠããã®ã§ãç¹°ãè¿ããªãããã«ã
ãããš
ããã§ããã«ã€ããŠèªãããšããå§ãããŸãã RTOSã䜿çšããããšã®éèŠãªæ©èœã®ãã¡ãã³ãŒãã«æ··ä¹±ãå ããããšãªãããã°ã©ã ã®æ©èœãéåžžã«ç°¡åã«åäžã§ããããšã ãã«æ³šæããããšæããŸãã ããã¯ãããã°ã©ã ã®åã
ã®ã»ã¯ã·ã§ã³ãäºãã«å¹²æžããããšãªãæ¡ä»¶ä»ãã§åæã«åäœããåé¢ããããããã¯ãšããŠå®è¡ã§ããããã«å¯èœã§ãã ãããŠãå€ããå®è¡æã«èŠæ±ããã倿°ã®ç°ãªãã¿ã¹ã¯ãå®è¡ããããšãä¿èšŒãããŠãããã·ã¹ãã ãªã³ããããçšã®ã¢ããªã±ãŒã·ã§ã³ãäœæããå ŽåãRTOSã䜿çšããããšã§ç掻ã倧å¹
ã«ç°¡çŽ åãããŸãã
BLEã®æŠèŠãšãã®ä»çµã¿ã«ã€ããŠã¯ã
äžé£ã®ãã°ããã
èšäºãããããšããããããã€ãã®ããšãçè§£ããã®ã«åœ¹ç«ã¡ãŸããã ãŸã èªãã§ããªãå Žåã¯ãå¿
ããã§ãã¯ããŠãã ããã ãã®èšäºã®ãã¬ãŒã ã¯ãŒã¯ã§ã¯ããã®ãã¯ãããžãŒã䜿çšããå®çšçãªãã¥ã¢ã³ã¹ã«èå³ãæã£ãŠããŸãã
äžè¬çã«èšã£ãŠããç§ãã¡ã¯BLEãšRTOSã®åéã§ãããšæžããã®ã§ãããæå³ã§ãããã2ã€ã®æŠå¿µã¯åå ããªããŠãéåžžã«ããŸãããã®ã§ãç§ã¯å°ãcã«ãªããŸããã äºå®ãã³ã³ãããŒã©ãŒã§BLEèŠæ Œã䜿çšããããã«äœ¿çšããBluetoothã¹ã¿ãã¯ã¯ãããèªäœãäžçš®ã®RTOSã§ãããã¿ã¹ã¯ããããã®ã¿ã¹ã¯ã®ãã£ã¹ãããã£ãŒãã¿ã€ããŒãå»ã
ãšéããã€ãã³ããçºçãããšããäºå®ã§ãã ãããã£ãŠãç§ã®å人çãªæèŠã§ã¯ãBLEã¢ããªã±ãŒã·ã§ã³ã§ã®RTOSã®äœ¿çšã¯ãã¢ããªã±ãŒã·ã§ã³å
šäœãæœè±¡åã®1ã€ã®ã¬ãã«ã«å°ãã®ã§ãè¯ã圢ã«ãªãã§ãããã
å¿
èŠãªããŒã«
NRF51ã®èµ·åã«é¢ããåºæ¬çãªåé¡ã«è§Šããªãããã«ããããã«ãComrade
Foxekã®èšäºã«äŸåãããããåãããŒã«ãå¿
èŠã«ãªããŸãã
â¢ãããã°ããŒãNRF51
â¢OC Androidãå®è¡ããŠããã¹ããŒããã©ã³
â¢nRF Connect Androidã¢ããª
â¢MKD ARM Keil uVision
RTOSã»ããã¢ãã
å€å
žçãªæ¹æ³ã§éå§ããŸã-Pack Installerã䜿çšããŠble_app_templateãã³ãã¬ãŒããããžã§ã¯ããããŒããïŒãã®æé ã®è©³çްã«ã€ããŠã¯ã
nRF51822ïŒã¯ã€ãã¯ã¹ã¿ãŒãã®èšäºãåç
§ïŒãRun-Time EnvironmentãããŒãžã£ãŒã䜿çšããŠå¿
èŠãªäŸåé¢ä¿ã远å ããŸãã

ããã§ããããžã§ã¯ãã«RTOSã远å ããŸããã ããŠãéãšçžäºäœçšã§ããããã«ããã¥ãŒãã³ã°ãè¡ãå¿
èŠããããŸãã CMSIS-RTOSã¯ãCortex-Mã³ã¢ã«åºã¥ããããã»ããµã§ã®åäœã«ããé©åããŠãããååãšããŠãSysTickã·ã¹ãã ã¿ã€ããŒã䜿çšããŠOSã®æéãéååããŸãã ãã ããNRF51ã³ã³ãããŒã©ãŒã«ã¯ããŒãäžã«Cortex-M0ã³ã¢ããããSysTickã¿ã€ããŒããªããããã¡ãŒã«ãŒã¯RTOSã¯ãããã³ã°ã«RTC1ãªã¢ã«ã¿ã€ã ã¯ããã¯ã䜿çšãã
ããšã
ãå§ãããŸãã äžæ¹ã§ã¯ãRTC1ã¯ã³ã³ãããŒã©ãŒã®ã¹ãªãŒãã¢ãŒãã§ãªãã«ãªããªãããããã®ãœãªã¥ãŒã·ã§ã³ã¯ãã©ã¹ã§ããã€ãŸããRTOSã§éåžžã«äœãæ¶è²»ã§ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããããšãæå³ããŸãã äžæ¹ãRTCãããã¯ã¯32768 Hzã®åšæ³¢æ°ã§ã¯ããã¯ãããŸããããã¯ãã·ã¹ãã æéã®ã¯ã©ã³ã¿ã ã®ãµã€ãºãååã«å°ããã§ããªãããšãæå³ããŸãã
UPDã ã©ã³ã¿ã€ã ç°å¢ãããŒãžã£ãŒã®app_timerã¢ãžã¥ãŒã«ã®[nRF_Libraries]ã¿ãã§ã[Rtx]ãªãã·ã§ã³ãéžæããŸãã ããããªããšãå²ã蟌ã¿ãã³ãã©RTC1ã®è€æ°ã®å®çŸ©ãšç«¶åããŸãã
OSã§åäœããã¿ã€ããŒãçè§£ãããããã«ãããã€ãã®é¢æ°ã远å ããå¿
èŠããããŸããã¿ã€ããŒãšãããã€ãã®ã€ãã³ããã³ãã©ãŒãšã¿ã€ããŒå²ã蟌ã¿ãåæåããŸãã ãããè¡ãã«ã¯ãCMSISã¿ãããRTX_Conf_CM.cãã¡ã€ã«ãéãã

ããããŒãã¡ã€ã«nrf.hã远å ããã°ããŒãã«é¢æ°ã»ã¯ã·ã§ã³ãèŠã€ããŠããã®äžã®é¢æ°ã®å
å®¹ãæ¬¡ã®ãã®ã«çœ®ãæããŸãã
ãœãŒã¹ã³ãŒã #define TIMER_MASK 0xFFFFFF volatile unsigned int rtos_suspend;
os_idle_demonïŒïŒé¢æ°ã¯ãçãšãã¢ãŒãã䜿çšãããšãã®ã·ã¹ãã ã®åäœãæ£ç¢ºã«æ
åœããŸããã¢ããªã±ãŒã·ã§ã³ãã¿ã¹ã¯ã§ããžãŒã§ãªãå Žåãã·ã¹ãã èªäœãã³ã³ãããŒã©ãŒãã¹ãªãŒãç¶æ
ã«ããŸãã
次ã«ãã·ã¹ãã ã«SysTickã䜿çšããªãããšãäŒããŸããããã«ã¯ããã¹ãŠã®æ©èœãæ¢ã«åãã£ãŠãããããåæã«ãã¯ããã¯ãåäœããåšæ³¢æ°ãšã·ã¹ãã æéãéååããæ¹æ³ãæå®ããããã§ãã ãããè¡ãã«ã¯ãåããã¡ã€ã«RTX_Conf_CM.cã§æ§æãŠãŒãã£ãªãã£ãéããé©åãªã·ã¹ãã ãã©ã¡ãŒã¿ãŒãèšå®ããŸãã

10 msã®ã·ã¹ãã èªã¿åãééã¯å¶ç¶éžæãããŸããã§ããïŒ32768 Hzã®ã¯ããã¯åšæ³¢æ°ã§327ã¹ããªãã¿ãŒã䜿çšãããšãã¿ã€ããŒåšæ³¢æ°ã¯99.9 Hzã«ãªããå°ãªããšãããçšåºŠã®åŠ¥åœãªç²ŸåºŠã§ã·ã¹ãã ã¿ã€ãã³ã°ãæäŸããŸãã ãã®ééã«äœãå€ã䜿çšããå¿
èŠãããå Žåã¯ã蚱容å¯èœãªç²ŸåºŠãäžããå€ãéžæã§ããŸãïŒããšãã°ã逿°31ããã³ééé·977ÎŒsïŒãããããã¯éååœ¢ã®æ°å€ã«ãªããã³ãŒãã«æ··ä¹±ããããããŸãã ãŸããéæšæºã®ã¹ã¿ãã¯ãµã€ãºã§ã¹ããªãŒã ãäœæãããããã®ã¹ããªãŒã ã«ã¡ã¢ãªãå²ãåœãŠãã¹ã¿ãã¯ã®éãããå»ãããšãã§ããŸããããã«ããããããã°ãããèŠèŠçã«ãªããŸãã
ãã®æ®µéã§ãããã°ã©ã ãçµã¿ç«ãŠãŠã³ã³ãããŒã©ãŒã«ããŠã³ããŒãããããšãã§ããŸãã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãèµ·åããã¡ã€ã³é¢æ°ãå¯äžã®ã¹ã¬ãããšããŠå®è¡ãå§ããŸãã ãã ããRTOSã®æå³ã¯ãããŸããŸãªã¿ã¹ã¯ãããŸããŸãªã¹ã¬ããã§ã¹ãã³ããããšãªã®ã§ãBLEã¹ã¿ãã¯çšã«ç¬èªã®ã¹ã¬ãããäœæããŸãã
ããã§ãã¹ã¿ãã¯ã䜿çšããã¡ã¢ãªããŒã«ãã¹ã¿ãã¯ãã·ã¹ãã ããã¡ãã»ãŒãžãåä¿¡ããã¡ãŒã«ããã¯ã¹ãããã³ã¹ããªãŒã èªäœã決å®ãããã®çªå·ãšå®è¡ããã颿°ã宣èšããŸããã ã¹ã¬ãããäœãããããæ±ºå®ããã ãã§ãªããã·ã¹ãã ããã³ã¹ã¿ãã¯ã€ãã³ããã³ãã©ãŒã§ãã®äœæé¢æ°ã宣èšããŸãã
ã芧ã®ãšãããon_ble_evtã€ãã³ããã³ãã©ãŒã®æšæºé¢æ°ã¯ãã¹ããªãŒã ãžã®åçŽãªã¡ãã»ãŒãžè»¢éã«çœ®ãæããããŠããŸãããã®å
éšã§ã¯ããã³ãã©ãŒãå®è¡ã«äœ¿çšããããžãã¯ãæ¢ã«æ§æãããŠããŸãã
ã·ã¹ãã ã«ã¹ããªãŒã ãç»é²ããã«ã¯ãã¡ã¢ãªããŒã«ãšã¡ãŒã«ããã¯ã¹ãäœæãã颿°ãäœæããŸãããã®åŸãã¹ããªãŒã ãäœæããå°ãåã«å®£èšããèå¥åã§ç»é²ããŸãã ããããã¹ãŠmainã«è¿œå ããŠå®è¡ããã ãã§ãã
ãœãŒã¹ã³ãŒã int main(void) { uint32_t err_code; bool erase_bonds; static osStatus status;
颿°osKernelInitializeïŒïŒããã³osKernelStartïŒïŒã«æ³šæããŠãã ãã-mainã¯ãã§ã«ã¹ããªãŒã ã§ãããããå
¥åããããŸã§ã«RTOSã¯ãã§ã«å®è¡ãããŠããŸãã ãã ããã¹ã¬ãããäœæãã忢ããOSã§åšèŸºå
šäœãæ§æããæ¹ããããããæåã®æ©èœãäžæåæ¢ãã2çªç®ã®æ©èœãåéããŠåäœãããŸãã
ããã«ãbsp_bleã«é¢é£ãããã®ã¯ãã¹ãŠããããžã§ã¯ãããåé€ããŸããããã®ã©ã€ãã©ãªã¯RTOSããã€ãã¹ããã¹ã¿ãã¯ã«å¹²æžããããšããŠããããã§ãã ã¡ã€ã³ã¯ã¹ããªãŒã ã§ãããããã¡ã€ã³ã«ãŒãèªäœãã¡ã€ã³ããåé€ããŸããããã¹ãŠã®åæåã®åŸãã¡ã¢ãªãäºçŽãããŸãŸã«ããå¿
èŠã¯ãããŸããã ãããã£ãŠãäž»ãªç®çãããã³ã·ã¹ãã ãåäœãç¶ããããããã¯å¥è·¡ã§ãã
ããã§ãããã°ã©ã ããã«ãããã³ã³ãããŒã©ãŒã«ããŠã³ããŒãããŠãnRF Connectããã°ã©ã ã䜿çšããŠããã€ã¹ã«æ¥ç¶ã§ããŸãã

ã芧ã®ãšããããŸã åäžã®ãµãŒãã¹ã¯ãããŸããã®ã§ãä¿®æ£ããæãæ¥ãŸããã ãåç¥ã®ããã«ãADCããããŒã¿ãèªã¿åãããµãŒãã¹ã®ç¹æ§ã«æžã蟌ã¿ãŸãã ç¹°ãè¿ããŠèªåã®èªè»¢è»ãæ§ç¯ããªãããã«
ããããããµãŒãã¹ãšæ©èœãäœæããããã®ãã³ãã¬ãŒãã䜿çš
ããŸã ã
ããã§ãADC_BASE_UUIDãšADC_SERVICE_UUIDã¯ã次ã®åœ¢åŒã§å®çŸ©ãããè€åãµãŒãã¹èå¥åã§ãã
#define ADC_BASE_UUID {0x66, 0x9A, 0x0C, 0x20, 0x00, 0x08, 0x1A, 0x8F, 0xE7, 0x11, 0x61, 0xBE, 0x00, 0x00, 0x00, 0x00} #define ADC_SERVICE_UUID 0x1533 #define ADC_CHAR_UUID 0x1534
ããã§ã1ãã€ãã®ããŒã¿ãå«ã1ã€ã®ç¹æ§ãæã€ãµãŒãã¹ãã§ããŸããã ãã®ãã€ããæçšãªæ
å ±ã§åããã ãã§ããããã
èšäºãåç
§ããŠADCãåæåããŸããADCã¯1ç§éã«1å倿ãå®è¡ããç¹æ§ã®å
å®¹ãæŽæ°ãã颿°ã远å ããŸãã
å²ã蟌ã¿ãã³ãã©ã«ã¯æ¬¡ã®ãããªæ§é ãããããšã«æ³šæããŠãã ãã
rtos_suspend = 0;
rtos_suspend倿°èªäœã¯RTOSæ§æãã¡ã€ã«ã§å®çŸ©ãããmain.sã«ãšã¯ã¹ããŒããããŸãã ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯å²ã蟌ã¿ãå¶åŸ¡ããªãããããã®å€æ°ã¯ãã·ã¹ãã ãçŸæç¹ã§ã¢ã€ãã«ç¶æ
ã§ã¯ãªãå²ã蟌ã¿ãã³ãã©ãŒã«ããããšãããã°ã©ã ãçè§£ããããã«å¿
èŠã§ããã€ãŸããçãšãæ©èœãä»ããã¢ã¯ãã£ãã«ããªãã§ãã ããã ãã以å€ã®å Žåãã·ã¹ãã ã®åäœã¯äºæž¬ã§ããªããŸãŸãªã®ã§ãåå²ã蟌ã¿ãã³ãã©ãŒããã®å€æ°ããŒãã«ããããšã匷ããå§ãããŸãã
å²ã蟌ã¿ãã³ãã©ãŒããã¹ã¿ãã¯ã§ã¢ã¯ã·ã§ã³ãå®è¡ããããšã¯äžå¯èœãªã®ã§ïŒãã®å Žåãç¹æ§ãæŽæ°ããŸãïŒããããè¡ãã¹ã¬ãããäœæã§ããŸãã å²ã蟌ã¿ããã®ãããŒãšå¯Ÿè©±ããããã«ãä¿¡å·ãªã©ã®ããŒã«ããããŸãã æ¬è³ªçã«ãã·ã°ãã«ïŒãããã¯èšå®ããã³ãªã»ããã§ãããã©ã°å€æ°ã®åãªããããã§ãïŒã¯ãå²ã蟌ã¿ã«éåžžã«äŒŒãŠããŸãã ç¹æ§ãšãã®ã¢ã©ãŒãä¿¡å·ãèšé²ããããã®ã¹ããªãŒã ãäœæããã¡ã€ã³ã«è¿œå ããŸãã
ã¡ã€ã³ int main(void) { uint32_t err_code; bool erase_bonds; static osStatus status;
ããã§æºåå®äºã§ãã ããã°ã©ã ãã³ã³ãããŒã©ãŒã«ããŒãããŠãååŸãããã®ã確èªã§ããŸãã
ã芧ã®ãšããã1ãã€ãã®å€ãæ ŒçŽãã1ã€ã®ç¹æ§ãæã€ãµãŒãã¹ããããŸãã ãããèªã¿åã£ãŠãADCã®å
¥åã§ã®é»å§å€åã«å¿ããŠå€ãå€åããããšã確èªã§ããŸãã ãã®ç¹æ§ãéç¥ããããšãå¯èœã§ãããã€ã¹ã®ç¹æ§ã®ããŒã¿ã倿Žãããå Žåãã¹ããŒããã©ã³ã§èªåçã«æŽæ°ãããŸãã
ãããã«
çµè«ãšããŠãäžèŠRTOSã¯ãããžã§ã¯ãã«äžå¿
èŠãªè€éãããããããŠããããã«èŠããŸãããããã¯å®å
šã«çå®ã§ã¯ãããŸããã å®éãäœæããã¢ããªã±ãŒã·ã§ã³ã¯ããã¹ãŠã®ã¿ã¹ã¯çšã®ã¡ã¢ãªããªããªããŸã§ç°¡åã«ã¹ã±ãŒãªã³ã°ã§ããŸãã æ°ããã¢ãžã¥ãŒã«ããšã«ãäœããã®æ°åŠçãªæäœã§ããããšåšèŸºæ©åšãšé£æºããå Žåã§ããããšãç¬èªã®ã¹ã¬ãããäœæããã ãã§ååã§ããããã°ã©ããŒãèããå¿
èŠãããã®ã¯ãã¿ã¹ã¯ã®åªå
é äœä»ãæ¹æ³ã§ããã»ããã©ãšã©ããã䜿çšããŠåæãæ§ç¯ããããã®åããªãœãŒã¹ã
åç
§è³æ
RTOS BLEãããžã§ã¯ãKeil-RTX WebããŒãžnRF51822ã®æŠèŠïŒã¯ã€ãã¯ã¹ã¿ãŒãnRF51822ã®æŠèŠïŒçãšãã«ã®ãŒãšäžéšã®åšèŸºæ©åšNRF51822補åããŒãž