Stlink: st-util은 LIBUSB_ERROR_NO_DEVICEμ—μ„œ μ’…λ£Œλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

에 λ§Œλ“  2019λ…„ 03μ›” 17일  Β·  12μ½”λ©˜νŠΈ  Β·  좜처: stlink-org/stlink

USB 디버거λ₯Ό 처음 λΆ„λ¦¬ν•œ λ‹€μŒ GDBλ₯Ό 톡해 λͺ…령을 μ‹€ν–‰ν•˜λ €κ³  ν•˜λ©΄ st-utilμ—μ„œ λ‹€μŒ 였λ₯˜λ₯Ό 맀우 λΉ λ₯΄κ²Œ ν‘œμ‹œν•©λ‹ˆλ‹€.

  core status: unknown
[!] send_recv send request failed: LIBUSB_ERROR_NO_DEVICE                      
[!] send_recv STLINK_DEBUG_GETSTATUS
  core status: unknown
[!] send_recv send request failed: LIBUSB_ERROR_NO_DEVICE                      
[!] send_recv STLINK_DEBUG_GETSTATUS
  core status: unknown
[!] send_recv send request failed: LIBUSB_ERROR_NO_DEVICE                      
[!] send_recv STLINK_DEBUG_GETSTATUS
  core status: unknown
[!] send_recv send request failed: LIBUSB_ERROR_NO_DEVICE                      
[!] send_recv STLINK_DEBUG_GETSTATUS
  core status: unknown
2019-03-17T14:26:42 ERROR src/flash_loader.c: flash loader run error           
2019-03-17T14:26:42 ERROR src/common.c: stlink_flash_loader_run(0x8000000) failed! == -1

λ”°λΌμ„œ CPUλ₯Ό 거의 100% μ μœ ν•©λ‹ˆλ‹€. 이둜 인해 μ‹¬κ°ν•œ μ‹œκ°„ λ‚­λΉ„(가상 λ¨Έμ‹  λ‹€μ‹œ μ‹œμž‘ λ“±)κ°€ λ°œμƒν•©λ‹ˆλ‹€.

였λ₯˜ λ©”μ‹œμ§€μ˜ μ’…λ₯˜λŠ” 맀우 μ •μƒμž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, stutil λ‚΄κ°€ λ‹€μ‹œ μ‹œμž‘ν•˜μ—¬ 문제의 λ‚˜λ¨Έμ§€ 뢀뢄을 처리 ν•  수 μžˆλ„λ‘μ΄ 였λ₯˜κ°€ μ¦‰μ‹œ μ’…λ£Œν•œλ‹€ stutil ν•˜κ±°λ‚˜ λ‹€λ₯Έ 쑰치λ₯Ό 볡용.

bufixed componenst-util componenstlink-lib dependenclibusb errogdb-server staturesolved

λͺ¨λ“  12 λŒ“κΈ€

stlink λŠ” 이 μ‹œμ μ—μ„œ μ’…λ£Œλ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. https://github.com/texane/stlink/blob/df3c2b02867db03fb82f6faaad71300398965e85/src/usb.c#L54

stlink 이 μ‹œμ μ—μ„œ μ’…λ£Œλ˜μ–΄μ•Ό ν•œλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.

https://github.com/texane/stlink/blob/df3c2b02867db03fb82f6faaad71300398965e85/src/usb.c#L54

예, 당신이 μ˜³λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. libusb에 λŒ€ν•œ 호좜이 μ μ ˆν•œμ§€ 확인해야 ν•©λ‹ˆλ‹€. μ›ν•˜λŠ” 경우 패치λ₯Ό μ μš©ν•˜κ³  PR을 보낼 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ usb.c νŒŒμΌμ—μ„œ libusb에 λŒ€ν•œ λ‹€λ₯Έ ν˜ΈμΆœμ„ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ‹ κ³ ν•΄ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!

μ›ν•˜λŠ” 경우 패치λ₯Ό μ μš©ν•˜κ³  PR을 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.

ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ ν”„λ‘œμ νŠΈ ꡬ쑰λ₯Ό μ΄ν•΄ν•˜κ³  μžˆλŠ”μ§€ 잘 λͺ¨λ₯΄κ² μŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” 일반 exit(1) 이면 μΆ©λΆ„ν•©λ‹ˆλ‹€.

λ˜ν•œ usb.c νŒŒμΌμ—μ„œ libusb에 λŒ€ν•œ λ‹€λ₯Έ ν˜ΈμΆœμ„ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‚˜λŠ” 이것을 잘 μ΄ν•΄ν•˜μ§€ λͺ»ν•  μˆ˜λ„ μžˆλ‹€. " send_recv -1 λ°˜ν™˜ν•  λ•Œλ§ˆλ‹€ μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ„λ‘ ν•©λ‹ˆκΉŒ?"λ₯Ό μ˜λ―Έν•©λ‹ˆκΉŒ?

λ‚˜λŠ” PR에 μ½”λ©˜νŠΈλ₯Ό λ‹¬μ•˜μŠ΅λ‹ˆλ‹€. libusbλ₯Ό ν˜ΈμΆœν•  λ•Œ 잘λͺ»λ  수 μžˆλŠ” 곳이 더 λ§ŽμŠ΅λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈλŠ” λ‹€μŒκ³Ό 같은 λ°©μ‹μœΌλ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

  • libstlink(usb.cλŠ” κ·Έ 일뢀이며 λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ μ’…λ£Œλ₯Ό μ‚¬μš©ν•΄μ„œλŠ” μ•ˆ 됨) 라이브러리의 νŒŒμΌμ€ src 폴더에 있으며 κ°€μž₯ μ€‘μš”ν•œ 것은 usb.c 및 common.c(λ¬Όλ‘  flash_loader.c)μž…λ‹ˆλ‹€.
  • st-util 은 src/gdbserver에 μžˆμŠ΅λ‹ˆλ‹€.
  • st-info λŠ” src/tools/info.c에 μžˆμŠ΅λ‹ˆλ‹€.
  • st-flash λŠ” src/tools/flash.c에 μžˆμŠ΅λ‹ˆλ‹€.

이것은 #888κ³Ό #445와 관련이 μžˆμ„ 수 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€.
@ceremcem κ³Ό @rewolff : 이것을 ν•¨κ»˜ λ…Όμ˜ν•˜λŠ” μ•„μ΄λ””μ–΄λŠ” μ–΄λ–»μŠ΅λ‹ˆκΉŒ?

@chenguokai : μ—¬κΈ°μ—μ„œ μ§„ν–‰ν•˜λŠ” 방법에 λŒ€ν•œ 아이디어가 μžˆμŠ΅λ‹ˆκΉŒ?

이 경우λ₯Ό μž¬ν˜„ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
λ‚΄ macOS μ»΄ν“¨ν„°μ—μ„œ 절차λ₯Ό λ”°λžμŠ΅λ‹ˆλ‹€. 였λ₯˜ λ©”μ‹œμ§€κ°€ λ‚˜νƒ€λ‚˜μ§€λ§Œ λ°λ“œ 루프λ₯Ό μž…λ ₯ν•œ 흔적이 μ—†μŠ΅λ‹ˆλ‹€.
image
image

νŽΈμ§‘: main κΈ°λŠ₯에 쀑단점을 μ„€μ •ν•˜κ³  st-linkλ₯Ό λΆ„λ¦¬ν•œ ν›„ n λͺ…령을 μ‹€ν–‰

νŒ¨ν‚· μ†‘μˆ˜μ‹ μ„ λ¬΄μ œν•œμœΌλ‘œ μž¬μ‹œλ„ν•˜μ§€ μ•Šκ³  ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œν•΄μ•Ό ν•˜λŠ” ν•œ 가지 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

https://github.com/texane/stlink/blob/0082e488579077762627dba2cee54ffca64dad17/src/gdbserver/gdb-server.c#L1121

이 ν•¨μˆ˜ ν˜ΈμΆœμ€ while(1) 루프λ₯Ό μ’…λ£Œν•˜λŠ” 데 μ μ ˆν•œ 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ¬Έμ œλŠ” ν•¨μˆ˜ λ˜λŠ” while(1) λ©”μ»€λ‹ˆμ¦˜ 내뢀에 μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

lldb 였λ₯˜ 처리 과정을 ν™•μΈν•œ ν›„ 였λ₯˜ μ½”λ“œλ₯Ό μ•Œμ•„ λƒˆμ„ κ²ƒμž…λ‹ˆλ‹€.

https://github.com/texane/stlink/blob/bf840a1ae82ffc3ef9929f243bb8050d6856f698/src/gdbserver/gdb-server.c#L1448

_stlink_usb_step μ—μ„œ libusb 호좜 μ‹€νŒ¨λ‘œ 인해 μ²˜μŒμ— λ°œμƒν•œ 였λ₯˜κ°€ λ°œμƒν•˜λ©΄ 0이 μ•„λ‹Œ λ°˜ν™˜ κ°’(이 경우 -1)을 λ°˜ν™˜ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 이 λ°˜ν™˜ 값은 gdb-server의 recv-handle-send 루프에 μ˜ν•΄ μ²˜λ¦¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

https://github.com/texane/stlink/blob/bf840a1ae82ffc3ef9929f243bb8050d6856f698/src/gdbserver/gdb-server.c#L1119

두 가지 κ°€λŠ₯ν•œ 거래 μ „λž΅μ„ μ œμ‹œν•©λ‹ˆλ‹€.

곡톡 λΆ€λΆ„: μŠ€μœ„μΉ˜ μΌ€μ΄μŠ€μ—μ„œ stlink_step 의 λ°˜ν™˜ 값을 ν™•μΈν•˜μ‹­μ‹œμ˜€.

  1. 였λ₯˜κ°€ ν‘œμ‹œλ˜λ©΄ GDB에 μ•Œλ¦¬κ³  μ’…λ£Œν•˜μ‹­μ‹œμ˜€.
  2. μ œν•œλœ μ‹œκ°„ λ™μ•ˆ 이 ν•¨μˆ˜ ν˜ΈμΆœμ„ λ‹€μ‹œ μ‹€ν–‰ν•˜κ³ , μ‹€νŒ¨κ°€ 남아 있으면 GDB에 μ•Œλ¦¬κ³  μ’…λ£Œν•˜κ³ , 그렇지 μ•ŠμœΌλ©΄ 계속 μ§„ν–‰ν•©λ‹ˆλ‹€.

뢄석:

μ˜΅μ…˜ 1은 톡신 였λ₯˜ 후에 μ–΄λ–€ 일이 일어날지 μ˜ˆμΈ‘ν•  수 μ—†κΈ° λ•Œλ¬Έμ— ν—ˆμš©λ©λ‹ˆλ‹€. 단점은 st-util이 일뢀 λΆˆμ•ˆμ •ν•œ USB 포트 λ˜λŠ” 이와 μœ μ‚¬ν•œ ν¬νŠΈμ—μ„œ 더 자주 μ‹€νŒ¨ν•  수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
μ˜΅μ…˜ 2λŠ” λΆˆμ•ˆμ •ν•œ μž₯μΉ˜μ— 또 λ‹€λ₯Έ 기회λ₯Ό μ œκ³΅ν•˜μ§€λ§Œ νŒ¨ν‚· 볡제λ₯Ό μΌμœΌν‚¬ 수 μžˆμ–΄ 디버깅을 μ•½κ°„ 더 μ˜ˆμΈ‘ν•  수 μ—†κ²Œ λ§Œλ“­λ‹ˆλ‹€.

μžμ„Έν•œ 뢄석을 μœ„ν•΄ Thx. μ €λŠ” μ—¬κΈ°μ—μ„œ μ˜΅μ…˜ 1을 μ„ ν˜Έν•©λ‹ˆλ‹€. μ‚¬λžŒλ“€μ΄ νŠΉμ • 둜컬 ν•˜λ“œμ›¨μ–΄ λΆˆμ•ˆμ •κ³Ό κ΄€λ ¨λœ λ¬Έμ œμ— μ§λ©΄ν•˜λ©΄ μ–΄μ¨Œλ“  μš°λ¦¬κ°€ ν•  수 μžˆλŠ” 일은 μ—†μœΌλ©° stlink 도ꡬ가 κ³ λ €ν•΄μ•Ό ν•  사항도 μ•„λ‹™λ‹ˆλ‹€. 디버깅에 λŒ€ν•΄ νƒ€ν˜‘μ„ ν•˜λŠ” 것이 더 μ€‘μš”ν•΄ λ³΄μž…λ‹ˆλ‹€. 이것을 λ°”λ‘œ κ³ μΉ  수 μžˆμŠ΅λ‹ˆκΉŒ?

νŒ¨ν‚·μ„ μ œλŒ€λ‘œ 보내기 μœ„ν•΄ gdb λ¬Έμ„œλ₯Ό ν™•μΈν•˜κ² μŠ΅λ‹ˆλ‹€. λ„ˆλ¬΄ 어렡지 μ•Šμ€ 것 κ°™μ•„μš”.
λλ‚˜λ©΄ PR μ˜¬λ¦¬κ² μŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” λ§ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ μ˜΅μ…˜ 2λ₯Ό μ„ νƒν•˜λ €κ³ ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ‹Ήμ‹ μ˜ μ„€λͺ… 후에 : 당신이 μ˜³μŠ΅λ‹ˆλ‹€. 였λ₯˜κ°€ μΌμ‹œμ μ΄λΌκ³  믿을 λ§Œν•œ νƒ€λ‹Ήν•œ μ΄μœ κ°€ μ—†λŠ” ν•œ 였λ₯˜λŠ” μ¦‰μ‹œ 치λͺ…적인 였λ₯˜λ‘œ κ°„μ£Όλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

μ‚¬μš©μžμ—κ²Œ μ•Œλ¦¬μ§€ μ•Šκ³  μž¬μ‹œλ„ν•˜λ©΄ κ°‘μž‘μŠ€λŸ¬μš΄ 놀라움이 λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ „μ†‘λœ λΉ„νŠΈμ˜ 1/100 λ˜λŠ” 1/1000(λ ˆλ²¨μ— 관계없이)이 μ†μƒλ˜μ—ˆλ‹€κ³  κ°€μ •ν•©λ‹ˆλ‹€. κ·Έ κ²°κ³Ό 99%의 μ‹œκ°„ λ™μ•ˆ λͺ…령이 "μœ νš¨ν•˜μ§€ μ•ŠμŒ"이 λ˜λŠ” 경우 ν•΄λ‹Ή μƒν™©μ˜ μ‚¬μš©μžλŠ” 문제λ₯Ό μΌμœΌν‚€λŠ” μžλ™ 데이터 손상을 λ°›κΈ° 전에 ν•˜λ“œμ›¨μ–΄κ°€ λΆˆμ•ˆμ •ν•˜λ‹€λŠ” κ²½κ³ (즉, κ°‘μžκΈ° μ’…λ£Œλ˜λŠ” stlink)λ₯Ό ν‰κ· μ μœΌλ‘œ 많이 λ°›κ²Œ λ©λ‹ˆλ‹€. ...

"μ‰¬μš΄ νƒˆμΆœκ΅¬"λŠ” "exit()"μž…λ‹ˆλ‹€. 그러면 κ°‘μžκΈ° gdb에 λŒ€ν•œ 연결이 λ‹«νžˆκ³  μΆ©λΆ„νžˆ μš°μ•„ν•˜κ²Œ μ²˜λ¦¬λ©λ‹ˆλ‹€.

κΈ°λ³Έ κΈ°λŠ₯은 stm32f401 λ³΄λ“œκ°€ μžˆλŠ” PRμ—μ„œ 잘 μ‹€ν–‰λ©λ‹ˆλ‹€.
λ°λ“œ λ£¨ν”„λŠ” 둜컬 ν…ŒμŠ€νŠΈ 쀑에 ν•΄κ²°λ©λ‹ˆλ‹€. 이제 st-util이 μ’…λ£Œλ©λ‹ˆλ‹€. gdbλŠ” μ‹€νŒ¨ 응닡을 μˆ˜μ‹ ν•˜κ³  연결을 λŠμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰