8051 어셈블리 언어에서 메모리 최적화에 사용할 수 있는 기술은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/335540

문제

새로운 코드를 위한 공간을 확보하려면 코드를 최적화해야 합니다.모든 변경사항을 적용할 공간이 없습니다.코드뱅크 전환(80c31 with 64k)을 사용할 수 없습니다.

도움이 되었습니까?

해결책

여기서는 실제로 많은 것을 제공하지 않았지만 고려할 수 있는 두 가지 주요 최적화 수준이 있습니다.

미세 최적화:예.Xor A는 Mov A 대신 0 Adam이 이전 에이 중 일부를 멋지게 덮었습니다.

매크로 최적화:프로그램의 구조, 사용된 데이터 구조 및 알고리즘, 수행된 작업을 살펴보고 이러한 요소를 어떻게 재배열하거나 제거할 수 있는지 열심히 생각해 보십시오.실제로 사용되지 않는 전체 코드 덩어리가 있습니까?코드가 사용자가 전혀 볼 수 없는 디버그 출력 문으로 가득 차 있습니까?일반 릴리스에서 제외할 수 있는 단일 고객 전용 기능이 있습니까?

이를 잘 처리하려면 메모리가 어디에서 사용되고 있는지 알아내야 합니다.링커 맵은 이 작업을 시작하기에 좋은 장소입니다.거시적 최적화는 BIG가 승리할 수 있는 곳입니다.

여담으로, 최적화된 C 컴파일러를 사용하여 코드의 일부를 다시 작성해 볼 수도 있습니다.코드가 얼마나 촘촘한지 보면 놀랄 것입니다.진정한 어셈블러 전문가라면 이를 개선할 수 있지만 대부분의 코더보다 더 나을 수도 있습니다.나는 IAR 약 20년 전의 일인데, 그게 내 양말을 날려버렸어요.

다른 팁

어셈블리 언어를 사용하면 손으로 최적화해야합니다. 몇 가지 기술은 다음과 같습니다.

참고 : IANA8051P (저는 8501 프로그래머는 아니지만 다른 8 비트 칩에 대한 많은 조립을했습니다).

아무리 작아서 기능을 만들 수 있더라도 복제 된 비트를 찾는 코드를 살펴보십시오.

보다 특이한 지시 사항을 배우고 최적화에 사용할 수 있는지 확인하십시오. 좋은 속임수는 XOR A를 사용하여 Mov A 대신 Accument를 지우는 것입니다. 바이트를 저장합니다.

또 다른 깔끔한 트릭은 반환하기 전에 함수를 호출하는 경우 : 예를 들어 다음과 같이 점프하십시오.

CALL otherfunc
RET

그냥 해:

JMP otherfunc

항상 가능한 한 상대 점프와 가지를 수행하고 있는지 확인하면 절대 점프보다 메모리를 적게 사용하십시오.

그게 내가 지금 내 머리 꼭대기에서 생각할 수있는 전부입니다.

이걸 늦게 다가 가서 미안하지만 한 번도 같은 문제가 있었는데 계속해서 나에게 계속 돌아 오는 반복 문제가되었습니다. 제 경우에는이 프로젝트는 8051 패밀리 프로세서에 전화 한 전화였으며 ROM (Code) 메모리를 완전히 최대한 활용했습니다. 경영진이 새로운 기능을 계속 요청했기 때문에 계속해서 나에게 다시 돌아 왔기 때문에 각 새로운 기능은 두 단계 프로세스가되었습니다. 1) 공간을 만들기 위해 오래된 물건을 최적화하십시오. 2) 방금 만든 방을 사용하여 새로운 기능을 구현하십시오.

최적화에는 두 가지 접근 방식이 있습니다. 전술적이고 전략적. 전술 최적화는 마이크로 최적화 아이디어로 한 번에 몇 바이트를 절약합니다. 나는 당신이 당신이 일하는 방식에 대한보다 급진적 인 재고를 포함하는 전략적 최적화가 필요하다고 생각합니다.

내가 기억하는 것은 나를 위해 일했고 당신을 위해 일할 수있었습니다.

코드가하는 일의 본질을보고 정말 강력한 유연한 원시 작업을 증류하려고 노력하십시오. 그런 다음 최상위 코드를 재구성하여 프리미티브 호출을 제외하고 전혀 낮은 레벨을 수행하지 않도록하십시오. 테이블 기반 접근 방식을 사용하면 테이블에는 테이블이 포함되어 있습니다. 입력 상태, 이벤트, 출력 상태, 프리미티브 .... 즉, 이벤트가 발생하면 현재 상태의 해당 이벤트에 대한 테이블에서 셀을 찾아보십시오. 그 셀은 어떤 새로운 상태 (선택적으로)와 실행해야 할 원시적 (S)을 알려줍니다. 다른 레이어/서브 시스템에는 여러 상태/이벤트/테이블/프리미티브 세트가 필요할 수 있습니다.

이 접근법의 많은 이점 중 하나는 특정 문제에 대한 사용자 정의 언어를 구축하는 것으로 생각할 수 있다는 것입니다.이 방법은 테이블을 수정하여 단순히 새로운 기능을 생성 할 수 있습니다 (예 : 최소한의 추가 코드로).

죄송합니다. 몇 달이 늦었고 어쨌든이 급진적 인 일을 할 시간이 없었을 것입니다. 나는 당신이 이미 비슷한 접근법을 사용하고 있다는 것을 알고 있습니다! 그러나 내 대답은 언젠가 다른 사람이 아는 데 도움이 될 수 있습니다.

멍청한 부서에서는 코드의 일부를 압축하고 특정 시점에서 활발하게 사용되는 부분 만 유지하는 것을 고려할 수 있습니다. 압축/압축 압력 시스템에 필요한 코드가 8051의 작은 메모리의 일부 가이 가치를 높이기 위해 충분히 작을 수 있다고 믿기 힘들지만 약간 더 큰 시스템에서 놀라운 일을 해왔습니다.

또 다른 접근 방식은 일부 상태 공작 기계가 출력하는 바이트 코드 형식 또는 테이블 구동 코드의 종류로 전환하는 것입니다. 기계가 앱을 이해하고 완전히 이해할 수없는 구현을 생성하는 것은 저장할 수있는 좋은 방법이 될 수 있습니다. 방 :)

마지막으로, 코드가 실제로 C로 컴파일 된 경우 다양한 옵션을 사용하여 어떤 일이 발생하는지 확인하는 것이 좋습니다. 또한, 나는 2001 년에 ESC를 코딩하는 Compact C에 대한 작품을 썼습니다. 소규모 기계에 대한 다른 트릭은 그 텍스트를 참조하십시오.

1) 가능한 경우 xData가 아닌 Idata에 변수를 저장
2) JMP 문장 - SJMP 및 AJMP 사용

나는 당신이 작성/준수하고 "기억이없는"오류를 얻었 기 때문에 그것이 적합하지 않다는 것을 알고 있다고 생각합니다. :) 답은 귀하의 질문을 꽤 정확하게 해결하는 것으로 보입니다. 코드 예제가 부족합니다.

그러나 나는 몇 가지 추가적인 생각을 추천 할 것입니다.

  1. 모든 코드가 있는지 확인하십시오 진짜사용 중 - 코드 적용 범위 테스트? 미사용 서브는 큰 승리입니다. 이것은 힘든 단계입니다. 원래 저자라면 더 쉬울 수 있습니다.
  2. "검증"및 초기화 수준을 확인하십시오. 때로는 변수/메모리를 초기화 한 것을 보장하는 데 열심이 많은 경향이 있으며, 충분히 충분히 확신합니다. 초기화하지 말고 (DUH) 말하지만 메모리 이동을하고 있다면 대상은 그렇지 않습니다. 필요 먼저 제로가 될 것입니다 -이 도베 테일은 다음과 같습니다

    1 --

  3. 새로운 기능 평가 - 기존 서브를 모두 함수 또는 기존 기능을 교체 할 수 있도록 향상시킬 수 있습니까?
  4. 빅 코드가 저장 될 수있는 경우 빅 코드를 분류하십시오. 창조 새로운 작은 코드.

또는 아마도 테이블에 하드웨어 버전 2.0에 대한 논쟁이있을 것입니다 ... :)

문안 인사

이미 언급 된 (다소) 명백한 최적화 외에도, 여기에는 코드 재사용이 정말 이상하고 달성하기가 불가능합니다. 코드 재사용을 사용하면 일반 재사용을 의미하지는 않지만 a) 코드를 데이터로 재사용하거나 B) 코드를 다른 코드로 재사용합니다. 어쩌면 ASM Hex Opcodes로 표현할 수있는 LUT (또는 모든 정적 데이터)를 만들 수 있습니다 (여기에서 Harvard vs von Neumann Architecture를보아야합니다).

다른 하나는 코드를 다르게 해결할 때 코드에 다른 의미를 부여하여 코드를 재사용합니다. 여기에 내가 의미하는 바를 분명히하는 예입니다. 코드의 바이트가 다음과 같이 보이는 경우 : 각 문자가 하나의 opcode를 의미하는 주소 X의 AABCCDDEEFFGGHH. 아마도 공간별로 분리 된 바이트가 새로운 opcodes : ABC CCD de EF GH를 형성하는 완전한 다른 기능을 얻을 수 있습니다.

그러나 조심하십시오 : 이것은 달성하기가 까다로울뿐만 아니라 (불가능할 수도 있음) 유지하기위한 공포입니다. 따라서 데모 코드 (또는 비슷한 이국적인)가 아니라면 이미 언급 된 다른 방법을 사용하여 MEM을 저장하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top