![ç»å](https://habrastorage.org/files/4e1/f24/c81/4e1f24c8148c4e589aa167766c0b9d37.png)
2019幎ã®æŽæ°ïŒ
ãã®èšäºã¯ã vscodeãatomã®ãããªåªããç¡æã®ãšãã£ã¿ãŒã®åºçŸãšã¯ããŸãé¢ä¿ãããŸããã
説æãããã¢ã»ã³ããªã·ã¹ãã ãé²åããŠãããçŸåšã ãããšããã§èŠã€ããããšãã§ããŸã ã
ãã®èšäºã§ã¯ããã€ã¯ãã³ã³ãããŒã©ãç¹ã«STM32F10xã®éçºç°å¢ãšããŠäœ¿çšã§ãããè¿œå ã®ããã°ã©ã ã䜿çšããŠSublime Textã¢ã»ã³ããªãäœæããæ¹æ³ã«ã€ããŠèª¬æããŸãã ãã®ãããSublime Textã䜿çšããŠäœæããã¿ã¹ã¯ã«çŽé¢ããŠããŸããããã«ã¯ãäœææã®éçåæãšã³ãŒãè£å®ãmakefileã䜿çšããŠãããžã§ã¯ãããã«ãããã·ã¹ãã ãã³ã³ãã€ã©ãŒããªã³ã«ãŒããã€ã¯ãã³ã³ãããŒã©ãŒãã¡ãŒã ãŠã§ã¢ããããã°ãå«ãŸããŸãã ããã«ãã¢ã»ã³ããªã¯ã€ã³ã¹ããŒã«ããã«åäœããŸãã
ãã£ã¬ã¯ããªæ§é ã®äœæãšbatãã¡ã€ã«ã®èµ·åïŒ
ãŸããå¿ èŠãªããã°ã©ã ãããŠã³ããŒãããå¿ èŠããããŸãã
1. Sublime Text 3ããŒã¿ãã«èªäœ
2. GCC ARM Embedded ToolchainïŒã¢ãŒã«ã€ãæžã¿ïŒ
3.éçã³ãŒãåæçšã®ClangïŒLLVMïŒ
4.ãããžã§ã¯ãããã¡ãŒã ãŠã§ã¢ãããã³ãããã°ã®æ§ç¯ãèªååãã
5.ãã¡ãŒã ãŠã§ã¢ããã³ãããã°çšã®OpenOCD
次ã«ãã¢ã»ã³ããªçšã®ãã£ã¬ã¯ããªãäœæããåããã°ã©ã ãäºåã«äœæãããã£ã¬ã¯ããªã«è§£åããŸãã Clangã®å Žåãæåã«ããŠã³ããŒãããLLVMãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã次ã«ãLLVMã®ãã£ã¬ã¯ããªãã€ã³ã¹ããŒã«ãã¹ããã¢ã»ã³ããªã®ãã£ã¬ã¯ããªã«ã³ããŒããã ãã§ãã
ã¢ã»ã³ããªãã£ã¬ã¯ããªã®ã«ãŒãã«batãã¡ã€ã«ãäœæããŸãã 次ã®ããã«ãªããŸãã
![ç»å](https://habrastorage.org/files/a36/ac3/1fb/a36ac31fbe50427299e6a62baacb28a1.png)
è¿œå ã®ããã°ã©ã ã®ãã¹ãå«ãPATHå€æ°ã§Sublime Textãèµ·åããã«ã¯ãBatãã¡ã€ã«ãå¿ èŠã§ãã batãã¡ã€ã«ã«æ¬¡ã®ããã«èšè¿°ããŸãã
:: DEVELOP_ROOT, () bat- set DEVELOP_ROOT=%~dp0 :: PATH PATH %DEVELOP_ROOT%GCC ARM none eabi\bin;%DEVELOP_ROOT%LLVM\bin;%DEVELOP_ROOT%make;%DEVELOP_ROOT%openOCD\bin;%PATH% :: Sublime Text start "" "%DEVELOP_ROOT%Sublime Text\sublime_text.exe"
å¿ èŠãªãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŠæ§æããŸãã
Package Controlã®ã€ã³ã¹ããŒã«ïŒSublime Textãå®è¡ãããã©ãŠã¶ãŒã§Package Control Webãµã€ããªã³ã¯ã«ç§»åããŠãã³ã³ãœãŒã«ã«Package Controlã€ã³ã¹ããŒã«è¡ãæ¿å ¥ãïŒCtrl +ãïŒSublime Textãåèµ·åããŸãã
Sublime Textã§ãå¿ èŠãªãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŸãïŒCtrl + Shift + Pã䜿çšããŠãInstall Pakageãèšè¿°ããŸãïŒã
- Sublimelinter
- Sublimelinter-contrib-clang
- Sublimegdb
- ã¿ãŒããã«
- ãã¹ãŠãªãŒãã³ã³ããªãŒã
- ARMã¢ã»ã³ããª
ãã¹ãŠã®ãªãŒãã³ã³ããªãŒã-ã³ãŒãããã®å Žã§å®äºããããã®ãã©ã°ã€ã³ã Sublime Textã¿ãã§éããŠãããã¡ã€ã«ã®é©åãªçµã¿åãããæäŸããŸãã
ARMã¢ã»ã³ããª-ã¢ã»ã³ãã©æ§æã匷調ããŸãã
次ã«ããããã®ãã©ã°ã€ã³ã®èšå®ãèŠå®ããå¿ èŠããããŸãã èšå®ã¯ä»¥äžã®ãšããã§ãã
èšå®->ããã±ãŒãžèšå®-> SublimeLinter->èšå®-ãŠãŒã¶ãŒïŒ
{ "user": { "debug": true, "delay": 0.25, "error_color": "D02000", "gutter_theme": "Packages/SublimeLinter/gutter-themes/Default/Default.gutter-theme", "gutter_theme_excludes": [], "lint_mode": "background", "linters": { "clang": { "@disable": false, "args": [], "excludes": [], "extra_flags": "", "include_dirs": [] } }, "mark_style": "outline", "no_column_highlights_line": false, "passive_warnings": false, "paths": { "linux": [], "osx": [], "windows": [] }, "python_paths": { "linux": [], "osx": [], "windows": [] }, "rc_search_limit": 3, "shell_timeout": 10, "show_errors_on_save": false, "show_marks_in_minimap": true, "syntax_map": { "html (django)": "html", "html (rails)": "html", "html 5": "html", "javascript (babel)": "javascript", "php": "html", "python django": "python" }, "warning_color": "DDB700", "wrap_find": true } }
èšå®->ããã±ãŒãžèšå®-> SublimeGDB->èšå®-ãŠãŒã¶ãŒïŒ
{ "file_group": 0, "session_group": 1, "session_open": true, "console_group": 1, "console_open": true, "variables_group": 1, "variables_open": true, "callstack_group": 2, "callstack_open": true, "registers_group": 2, "registers_open": true, "disassembly_group": 1, "disassembly_open": true, "threads_group": 3, "threads_open": true, "breakpoints_group": 3, "breakpoints_open": true }
èšå®->ããã±ãŒãžèšå®->ã¿ãŒããã«->èšå®-ãŠãŒã¶ãŒïŒ
{ "terminal": "cmd" }
ãããžã§ã¯ããã¡ã€ã«ã®ã»ããã¢ããïŒ
ãã®æ®µéã§ã STM32F10xã®ãã¹ããããžã§ã¯ããæ¢ã«éãããšãã§ããŸãã 以äžã¯ããã¹ããããžã§ã¯ããã¡ã€ã«ïŒ* .sublime-projectïŒã®å 容ã§ãã
{ "build_systems": [ { "cmd": ["make"], "name": "ARM build", "working_dir": "${project_path}", "file_regex": "^(^\\S.*\\.\\w+):(\\d+):(\\d+): (\\w+ ?\\w+?): (.*)$" } ], "folders": [ { "follow_symlinks": true, "path": "." } ], // "SublimeLinter": { "linters": { "clang": { // , , "include_dirs": [ "${project}/CMSIS", "${project}/StdPeriphLib", "${project}/user-code", "${project}/user-code/FatFs" ], // Clang "extra_flags":"-DSTM32F10X_MD_VL" } } }, "settings": { "sublimegdb_workingdir": "${project_path:out/hex/}", "sublimegdb_commandline": "arm-none-eabi-gdb --interpreter=mi *.elf" } }
ãã®ãã¡ã€ã«ããã詳现ã«åæããŸãã ãããžã§ã¯ãããã«ããããšãã«èµ·åããã³ãã³ããå®çŸ©ããŸãïŒCtrl + BïŒïŒ
"cmd": ["make"]
build_systemã®ååïŒä»»æïŒïŒ
"name": "ARM build"
ãããžã§ã¯ãã®äœæ¥ãã£ã¬ã¯ããªã¯ããã®ãã¹ã«é¢é£ããŠããcmdããã£ãŒã«ãã§ã³ãã³ããå®è¡ããŸãã
"working_dir": "${project_path}"
ãããžã§ã¯ãæ§ç¯ãã°ã®ã¡ãã»ãŒãžã«å¿ããã¯ã€ãã¯ãžã£ã³ãã®æ£èŠè¡šçŸïŒF4ãShift + F4ã«æºæ ïŒïŒ
"file_regex": "^(^\\S.*\\.\\w+):(\\d+):(\\d+): (\\w+ ?\\w+?): (.*)$"
ãœãŒã¹ã³ãŒããå«ããããžã§ã¯ããã£ã¬ã¯ããªãžã®ãã¹ã¯ã¡ã€ã¯ãã¡ã€ã«ã«æžã蟌ãŸããŸãããClangã¯ããããã¡ã€ã¯ãã¡ã€ã«ããåé€ããªãããããSublimeLinterã->ãlintersã->ãclangã->ãinclude_dirsãã»ã¯ã·ã§ã³ã®ãããžã§ã¯ãèšå®ã§ããã¹ãæå®ããå¿ èŠããããŸããœãŒã¹ã³ãŒãåæã®ããã«Clangã«æž¡ããããããã®ãã£ã¬ã¯ããªã ããã§ãªãå Žåãããã®ãããªããããŒãã¡ã€ã«ãèŠã€ãããŸããã§ããããšãã圢åŒã®ãšã©ãŒãClangããååŸãããŸãã
åãããšãããªããã»ããµãã£ã¬ã¯ãã£ãã«ãåœãŠã¯ãŸããŸãããã®å Žåã¯ã-DSTM32F10X_MD_VLãã§ãã ãã®ãã£ã¬ã¯ãã£ãã¯makefileã§èšè¿°ãããŠããŸãããClangã®ãããžã§ã¯ãèšå®ã«è¿œå ããå¿ èŠããããŸãïŒãSublimeLinterã->ãlintersã->ãclangã->ãextra_flagsãã ããããªããšãClangã¯ãã®ã¿ã€ãã®ã³ãŒãïŒstm32f10x.hãã¡ã€ã«å ïŒãæ€èšŒã§ããŸããã
#if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) #error "Please select first the target STM32F10x device used in your application (in stm32f10x.h file)" #endif
ãããžã§ã¯ãèšå®ã®æ¬¡ã¯ãèšå®ãã»ã¯ã·ã§ã³ã§ããSublimeGDBãã©ã°ã€ã³ã®ãããžã§ã¯ãèšå®ã¯æ¬¡ã®ãšããã§ãã
elfãã¡ãŒã ãŠã§ã¢ãã¡ã€ã«ãžã®ãã¹ïŒ
"sublimegdb_workingdir": "${project_path:out/hex/}",
ãããã¬ãŒãéå§ããã³ãã³ãïŒ
"sublimegdb_commandline": "arm-none-eabi-gdb --interpreter=mi *.elf"
ãã®æ®µéã§ããããžã§ã¯ãã®æ§ç¯ã¯ãã§ã«å®äºããŠããŸãã Ctrl + BãæŒããŠããã«ããã°ã衚瀺ããŸãã
![ç»å](https://habrastorage.org/files/74b/014/fc4/74b014fc4b344560ab151eb7cfc71477.png)
ãŸãããoutããã£ã¬ã¯ããªããããžã§ã¯ããã£ã¬ã¯ããªã«åäœæããããã¡ãŒã ãŠã§ã¢ããªã¹ããããã³ãªããžã§ã¯ããã¡ã€ã«ã察å¿ãããã£ã¬ã¯ããªã«ããããšãããããŸãã
ãã¡ãŒã ãŠã§ã¢ïŒ
openOCDã䜿çšããŠãã€ã¯ãã³ã³ãããŒã©ãŒããã©ãã·ã¥ããŸãã ç¹ç°æ§ããããŸãïŒopenOCDã¯æšæºã®ST-LINKããã°ã©ããŒãã©ã€ããŒã§ã¯åäœããŸããã ããã©ã«ãã§ã¯ãST-LINKã¯ãUSB倧容éèšæ¶è£ 眮ããšããŠå®çŸ©ãããŠããŸããã€ãŸãã Zadigããã°ã©ã ã䜿çšããŠUSBSTORãã©ã€ããŒãWinUSBã«çœ®ãæããå¿ èŠããããŸãã ããŠã³ããŒãããŠå®è¡ãããªãã·ã§ã³ã§ããã¹ãŠã®ããã€ã¹ãäžèŠ§è¡šç€ºããéžæãããSTM32 STLinkãããã€ã¹ãéžæããŠãããã©ã€ããŒã®äº€æããã¿ã³ãã¯ãªãã¯ããŸãã
![ç»å](https://habrastorage.org/files/753/a5d/6b6/753a5d6b660c4239b20aa1d4f03f68bc.png)
![ç»å](https://habrastorage.org/files/946/2a5/709/9462a5709ada4846830bd5ff99ea416c.png)
ã§ããïŒ ãã€ã¯ãã³ã³ãããŒã©ãŒããã©ãã·ã¥ããã«ã¯ãããã°ã©ããŒãæ¥ç¶ããmakefileãã©ã«ããŒã§ã¿ãŒããã«ãéããŠãmake programããå®è¡ããå¿ èŠããããŸãïŒSublime Textã§ãããžã§ã¯ããã©ã«ããŒãçŽæ¥éžæããCtrl + Shift + TãæŒããŠã¿ãŒããã«ããã°ããéãããšãã§ããŸãïŒã
![ç»å](https://habrastorage.org/files/529/fde/652/529fde65213a430caba5770fb418d5c2.png)
å¥ã®ããã°ã©ãã䜿çšããã«ã¯ãã¡ã€ã¯ãã¡ã€ã«å ã®å¯Ÿå¿ããè¡ãå€æŽããå¿ èŠããããŸãã
åžžã«äŸ¿å©ãšããããã§ã¯ãããŸãããããããžã§ã¯ãã®ãã«ãæã«ãã€ã¯ãã³ã³ãããŒã©ãŒãèªåçã«ãã©ãã·ã¥ããå Žåã¯ãã¡ã€ã¯ãã¡ã€ã«ã®è¡ã®ã³ã¡ã³ãã解é€ããå¿ èŠããããŸãã
# $(MAKE) program
ãã®ããããããã°ã«å¯ŸåŠããå¿ èŠããããŸãã
ãããã°ïŒ
GDBãµãŒããŒãèµ·åããŸããmakefileã®ãããã£ã¬ã¯ããªã§ã¿ãŒããã«ãéãããmake debugããå®è¡ããŸã
![ç»å](https://habrastorage.org/files/51f/204/dca/51f204dca44c41319adbc14553775f87.png)
Sublime Textã§F5ïŒSublimeGDBã®èšå®ã§å€æŽå¯èœïŒãæŒããšãSublimeGDBãã©ã°ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ãéããå ¥åãããã©ã°ã€ã³ã³ãã³ãã©ã€ã³ã§æ¬¡ã®ããã«ãªããŸãã
target remote localhost:3333
![ç»å](https://habrastorage.org/files/d46/80c/3db/d4680c3db0ef44a4986cb8e6a7a74854.png)
ã§ãã ããã§ãããã°ã䜿çšã§ããŸãã ããã§æ確ã«ãã䟡å€ããããŸããçŸæç¹ã§ã¯ãARMãã€ãºã³èªäœã®ã¬ãžã¹ã¿ã®ã¿ã衚瀺ã§ããŸãããåšèŸºã¯è¡šç€ºã§ããŸããã ã«ãŒãã«ã¬ãžã¹ã¿ã®å€ãéåžžã®åœ¢åŒã«ããã ãã§ãªãããã®åé¡ã®è§£æ±ºçãæ¢ããŠããŸãã ãã¹ãŠã®ãããã°ãããããŒã¯ãSublimeGDBãã©ã°ã€ã³ã®èšå®ã§å€æŽã§ããŸãã
![ç»å](https://habrastorage.org/files/d55/7fa/715/d557fa7156b04f5aba2b73bde28d7ee6.png)
Sublime Textã§ãããã°ãçµäºããã«ã¯ãCtrl + F5ãæŒãå¿ èŠããããŸãïŒèšå®ã§å€æŽããããšãã§ããŸãïŒ
æ°ãããããžã§ã¯ãã®äœæïŒ
æ¢åã®ãããžã§ã¯ãã«åºã¥ããŠæ°ãããããžã§ã¯ããäœæããã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
1.æ°ãããããžã§ã¯ãåã§æ¢åã®ãããžã§ã¯ããã£ã¬ã¯ããªãã³ããŒããŸãã
2.ãããžã§ã¯ããã¡ã€ã«* .sublime-projectã®ååãæ°ãããããžã§ã¯ãã®ååã«å€æŽããŸãã
3. makefileã§ãTARGETå€æ°ã®å€ãæ°ãããããžã§ã¯ãã®ååã«å€æŽããŸãã
# : TARGET = STM32-test2-FatFs
ãããžã§ã¯ãã®ãã£ã¬ã¯ããªæ§é ãå€æŽããå¿ èŠãããå Žåã¯ãmakefileã®SRCDIRå€æ°ã®å€ãå€æŽããã ãã§ãã
# : SRCDIR = $(BASE) SRCDIR += $(BASE)\CMSIS SRCDIR += $(BASE)\StdPeriphLib SRCDIR += $(BASE)\user-code SRCDIR += $(BASE)\user-code\FatFs
ãŸãããããžã§ã¯ãèšå®ã®ãinclude_dirsããã£ãŒã«ãïŒ* .sublime-projectïŒã
äžèšã®ãã¹ãŠã説æãããããªïŒ
ã«ã¹ã¿ãã€ãºãããSublime Textãšè¿œå ããã°ã©ã ã®ããŠã³ããŒããªã³ã¯ ã
ãã®èšäºã§èª¬æãããã¹ããããžã§ã¯ããããŠã³ããŒãããããã®ãªã³ã¯ ã
UDP 1. Linuxã§ãopenocdãST-Linkãšé£æºããã«ã¯ã次ã®æ¹æ³ã§USBããã€ã¹ã®ã«ãŒã«ãè¿œå ããå¿ èŠããããŸãã/usr / share / openocd / contribãã£ã¬ã¯ããªãããã99-openocd.rulesããã¡ã€ã«ã/etc/udev/rules.dãã£ã¬ã¯ããªã«ã³ããŒããŸãã ãã®åŸãã·ã¹ãã ãåèµ·åããŸãã
UDP 2.次ã®ãããžã§ã¯ããè¿œå ãããŸããã
STM32F4 ã
MSP430 ã
ESP8266