그래서 제가 달성하려는 것은 단순해 보이지만 사전 설치되지 않은 외부 유틸리티나 라이브러리를 사용하지 않고는 이를 수행할 수 있는 방법을 찾을 수 없는 것 같습니다.
Linux(모델에 따라 커널 3.x)를 실행하는 임베디드 시스템이 있습니다. 여기에서 대부분의 GNU 핵심 유틸리티(예: cat, sed, ls, tar 등)에 액세스할 수 있습니다. 예를 들어 screen을 사용하여
이를 통해 쉘 세션에 액세스할 수 있습니다 ./dev/ttyUSBx
screen /dev/ttyUSB0 9600
내가 screen 을 실행하는 컴퓨터(우리가 이라고 부르는 source
)에는 ArchLinux가 설치되어 있고 인터넷에 접속할 수 있습니다. 내가 액세스하려고 하는 임베디드 시스템(우리가 부르는)
은 네트워크 액세스가 없고 직렬 포트만 있는 Linux 상자입니다. 바이너리를 대상의 특정 위치에 복사한 다음 cron 작업을 통해 일부 하드웨어(이 경우 FPGA)를 자동으로 플래시할 수 있어야 합니다. 실제로 소프트웨어를 설치할 수는 없으며 작은 쉘 스크립트만 만들 수 있습니다. scp와 동일한 동작을 달성하기 위해 POSIX 셸 방식을 사용할 수 있지만 ssh 대신 인터페이스를 통해 사용할 수 있다는 것을 알고 계십니까?target
/dev/ttyUSBx
target
/dev/ttyUSBx
나는 파이프와 파일 리디렉션을 사용하여 다음을 생각했습니다. -
위 의 바이너리 cat
파일을 리디렉션하고 , 스트림을 파일로 리디렉션합니다. 어떻게 시작해야 할지조차 모르겠어요. 내가 사용해야 하는 프로젝트는 내일 마감이지만 지금은 길을 잃었으며 어떤 아이디어라도 환영합니다. 쉘 스크립트에서 직접 사용할 수 있는 표준 POSIX 도구가 바람직합니다./dev/ttyUSBx
source
target
솔루션을 컴파일해야 하는 경우를 대비해 대상에서 gcc에 액세스할 수 있지만 컴파일 속도가 target
매우 느리고 여러 컴퓨터에 배포하려면 더 많은 노력이 필요하므로 여전히 셸 솔루션을 선호합니다.
내 목표는 이 워크플로를 자동화하는 것입니다(사용자 상호 작용을 최대한 적게 사용). target
파일 시스템을 NFS로 마운트하는 것과 같은 것이 있을까요 ?
답변1
한 가지 가능성은 바이너리 파일을 ASCII 텍스트로 인코딩하거나 전통적인 방식을 사용하는 것입니다.유 인코딩, 또는 약간 더 현대적인 것 base64
. 프로그램은 소프트웨어 패키지로 uuencode
제공됩니다 .uudecode
사루티스, base64
위치는 다음과 같습니다.핵심 도구. base64
최신 GNU/Linux 배포판에 이미 등장했을 가능성이 더 높습니다 .
바이너리 파일을 인코딩한 결과는 많은 양의 텍스트이며 원칙적으로 터미널 연결을 통해 디코더에 복사/붙여넣기할 수 있습니다 target
. 대용량 데이터의 경우 클립보드를 사용하는 것이 실용적이지 않을 수 있지만 도구를 사용하여 screen
파일 내용을 터미널에 붙여 넣을 수 있습니다.
- 일어나
source
, 달려라base64 FILE > FILE.b64
. screen
연결된 세션 에서target
Ctrl-A를 입력합니다:readreg p /path/to/FILE.b64
. (screen
컨트롤 키가 Ctrl-A가 아닌 경우 해당 키를 입력하십시오.) FILE.b64에 대한 전체 경로를 제공해야 하는 것으로 보입니다. ~가 작동하지 않습니다. 화면에는 "버퍼에 26665052자를 넣는 중"과 같은 내용이 보고되어야 합니다.- 콘솔에서 를
target
실행합니다base64 -d > FILE
. - Ctrl-A를 입력합니다
:paste p
. - Ctrl-D를 입력합니다.
이 문제에 대한 또 다른 장기적인 해결책은 다음과 같습니다.모뎀, 터미널 연결을 통해 파일을 전송하는 고대 방법입니다. 많은 터미널 에뮬레이터에는 lrzsz
패키지가 설치되어 있는 한 Konsole과 같은 ZModem에 대한 지원이 내장되어 있습니다 . 하지만 lrzsz가 설치되어 있지 않을 가능성이 높으므로 base64를 사용하는 것이 더 좋습니다.
이러한 방법은 모두 당시 콘솔에 사용 중인 직렬 링크를 통해 파일을 전송하는 문제를 해결합니다. 콘솔이 필요하지 않은 경우 target
링크에 있는 내용을 파일로 덤프하는 것이 더 간단해야 합니다. 그러나 직렬 콘솔이 장치와 상호 작용하는 유일한 방법이라면 문제가 됩니다.
답변2
지금까지의 모든 응답을 바탕으로 설치된 유틸리티를 고려하여 target
스크립트를 실행하는 것만으로도 작동하는 솔루션을 찾았습니다 source
. 스크립트는 다음과 같습니다.
dest="/dev/$(dmesg | grep "now attached to ttyUSB" | awk '{print$NF}' | tail -1)"
cat binfile | gzip | base64 > binfile.64.gz
md5=$(md5sum binfile | awk '{print $1}')
printf "\necho \"[ \\\$(md5sum <target-dir>/binfile | awk '{print \\\$1}') == %s ] &&\\
<flashing commands>\" > <target-dir>/flash.sh\n" \
"$md5" \
> "$dest"
printf " echo \"%s\" | base64 -d | gunzip > <target-dir>/binfile &&\\
/bin/sh <target-dir>/flash.sh
" "$(cat binfile.64.gz)" \
> "$dest"
리프레셔를 보내고, 소스와 대상 bin 파일의 체크섬이 동일한지 확인하고,
bin 파일을 압축 및 인코딩하여
전송하고,
리프레셔를 사용하여 카드를 새로 고칩니다. 인코딩/디코딩에 중단이 있는 경우 대상을 플래시해서는 안 됩니다. 간단한 재부팅만으로 시스템을 기본 상태로 복원하므로 다른 문제로 인해 시스템에 문제가 발생할 가능성은 거의 없습니다.
다음은 프로세스의 전체 구현에 대한 링크입니다.
https://github.com/Soulthym/cycloneV-serial-flasher