저는 최근 NewSoftSerial 함께 Arduino 코드를 컴파일되었고 악명높은 "오류 : 레지스터 r24, r26, r28 또는 r30 필수"로 맞았 오류가 발생했습니다. NewSoftSerial은 훌륭한 라이브러리이다 세 이상 avr-GCC 컴파일러를 사용하는 그것이 alot 즐길 수 있습니다. 문제는 새로운 gcc가 코드에서 역거운 오류를 좋아하고 여기에 문제를 해결하는 방법은없는 것입니다 ...
문제는 방법 NewSoftSerial :: 어셈블리 언어로 작성된 tunedDelay에 발생합니다. 당신은 ASM과 많은 경험이없는 경우이 방법은 다소 애매한 태도를 보인다. 그것은 기본적으로 단일 통화 semicolomn로 구분하여 1-4 매개 변수를 얻을 수 "휘발성 ASM"으로 구성되어 있습니다. 첫 번째 매개 변수는 어셈블리 코드 자체입니다. 그것은 % 아이디의 형태로 다른 세 부분에 대한 여러 개의 참조가 포함될 수 있습니다. 두 번째 및 세 번째 매개 변수는 ASM 코드를 입력 및 출력 매개 변수입니다. 그것이 잘못된 tunedDelay 방법으로 사용되지 않습니다로의 네 번째 부분은 생략하자. 가 ASM 호출의 두 번째 매개 변수를 살펴 봅시다 : : "+r" (delay), "+a" (tmp) 첫 번째 마법 "+ R"(지연) 모든 % ASM 코드에서 0 (즉, 매개 변수 # 0) C 코드에서 "지연"변수로 대체된다는 것을 의미합니다. '+'는 읽기 - 쓰기 매개 변수를 의미합니다. 컴파일 NewSoftSerial 무능력의 원인 - "R"은 "제약 조건 클래스"입니다. 문제는 ASM 코드를 지연하고 이러한 작업에만 특정 레지스터가 사용될 필요로 특정 작업을하기 때문입니다. 작업에 사용할 레지스터의 집합 제약 조건 클래스에 의해 정의됩니다. 당신은 ASM 코드를 보면 당신은 작업 "sbiw의 %에게 0, 0 × 01"이 표시됩니다. NewSoftSerial 코드가 클래스 "R"을 지정하는 동안 설명서에 따르면이 작업은 제약 조건 클래스에 "W"의 첫번째 인자가 필요합니다. 최신 avr-gccs 더 조심 반면 오래된 컴파일러가이 문제를 알아낼만큼 영리하지 않았 것 같습니다. 따라서 코드를 수정하고 확인하기 위하여 당신이 인수가 다음에 브리핑을받을 교체할 필요가 새 컴파일러로 컴파일 : : "+w" (delay), "+a" (tmp) 이 작은 패치 NewSoftSerial는 새로운 컴파일러를 이용한 compilable 된 후에. 이 게시물에 게시된 하드웨어 , 리눅스 , 로봇 , 소프트웨어 . |