MSP430 하드웨어 문제 해결

기술노트 170627

아키텍처:

MSP430

컴포넌트:

compiler

업데이트:

2021-07-15 오후 7:03

소개

본 기술 노트는 IAR Embedded Workbench for MSP430에 구현된 MSP430 하드웨어 문제(장비 오류목록)에 대한 대처방안 목록들을 기술 합니다.

 

논의

컴파일러의 대처방안

컴파일러와 관련하여 다음과 같은 하드웨어 문제가 보고되고 있습니다:

 

CPU4

--core=430가 주어질 때, 컴파일러는 PUSH #4/#8를 위한 안전한 대안의 인코딩을 사용할 것입니다.

CPU6

--hw_workaround=CPU6가 주어질 때, 컴파일러는 @Rn 연산자를 Rn이 프로그램카운터(PC)가 아닌 경우 0(Rn)으로 대체할 것입니다. 런타임 라이브러리가 --hw_workaround=CPU6 활성화된 상태로 빌드되지만, IDE는 영향을 받는 장비에 대해 이 해결 방법을 자동으로 활성화하지 않습니다.

CPU8

컴파일러는 SP 레지스터에 홀수 값을 넣는 코드를 생성하지 않습니다. SP 레지스터의 값이 항상 짝수라고 가정합니다.

CPU11, CPU12, CPU13, CPU45

IAR Embedded Workbench for MSP430 툴체인에선 다루지 않습니다.

CPU15

CPU15의 영향을 받는 디바이스가 영향을 받지 않는 디바이스와 다른 위치로 분기하는 상황에서 컴파일러는 분기 오프셋에 기호 값 ?CPU15_OFFset을 추가합니다. 이 값은 링커 명령 파일에서 0(영향받지 않은 장치의 경우) 또는 2(영향된 장치의 경우)로 정의됩니다.

CPU16

컴파일러는 영향을 받는 장치와 영향을 받지 않는 장치 모두에서 작동하는 코드를 생성합니다.

CPU18, CPU19, CPU24, CPU25, CPU27, CPU29

만약 컴파일러에 --hw_workaround=nop_after_lpm 옵션을 주게되면, 상태 레지스터 SR의 LPM 비트를 변경할 수 있는 모든 명령이 완료되면 자동으로 NOP가 발생합니다. 런타임 라이브러리가 --hw_workaround=nop_after_lpm 활성된 상태에서 빌드되고, IDE는 영향을 받는 모든 장치에 대해 자동으로 활성화합니다.

CPU20

영향을 받는 장치의 링커 명령 파일은 유효한 메모리가 뒤따르지 않는 메모리 영역의 마지막 4바이트에 기본 세그먼트의 코드를 배치할 수 없습니다. 링커 명령 파일에서 주소 범위를 수정하거나 사용자 지정 세그먼트를 추가하는 경우 이 제약 조건이 여전히 충족되는지 확인해야 합니다.

CPU21

컴파일러는 POPM #1, SR를 생성하지 않습니다.

CPU22

실제 프로그램에 유용하지 않기에, 컴파일러는 @PC 연산자를 생성하지 않습니다.

CPU23, CPU34

실제 프로그램에 유용하지 않기에, 컴파일러는 PC 레지스터 회전하는 명령어를 생성하지 않습니다.

CPU26

컴파일러는 CALL SP 명령어를 생성하지 않습니다.

CPU28

컴파일러는 이 문제를 트리거하는 명령 시퀀스를 생성하지 않습니다.

CPU30

CPU30의 영향을 받는 디바이스가 영향을 받지 않는 디바이스와 다른 위치로 분기하는 경우, 컴파일러가 분기 오프셋에 심볼릭 값 ?CPU30_OFFSET을 추가합니다. 이 값은 링커 커맨드 파일에 0(영향 받지 않는 디바이스) 혹은 2(영향 받는 디바이스)로 정의됩니다.

CPU31

컴파일러는 푸시 명령과 함께 자동 증가 모드(auto-increment)를 사용하는 코드를 생성하지 않습니다.

CPU32

컴파일러는 CALLA PC 명령을 생성하지 않습니다.

CPU33

컴파일러는 현재 스택 외부에 할당되지 않은 메모리에 액세스하기 때문에 절대 음의 스택 오프셋을 사용하지 않습니다. 이러한 메모리는 언제든지 인터럽트에 의해 손상될 수 있습니다.

CPU35

컴파일러는 BIT.B @Rx, PC 명령을 생성하지 않습니다.

CPU39

만약 컴파일러에 --core=430X가 주어진다면, 인터럽트를 비활성화할 수 있는 명령 뒤에 항상 NOP를 배치합니다.

CPU40

만약 컴파일러에 --hw_workaround=CPU40가 주어진다면, 세그먼트 파트의 마지막 명령이 점프 명령일 때마다 NOP를 낸다. IDE는 영향을 받는 모든 디바이스에 대해 이 작업을 자동으로 수행한다.

 

어셈블러의 대처방안

어셈블러와 관련하여 다음과 같은 하드웨어 문제가 보고되고 있습니다:

CPU4

MSP430 아키텍처 (-v0), 어셈블러는 PUSH #4/#8 명령을 위해 안전한 대체 인코딩을 사용합니다.

CPU6

-h가 주어질 때, 어셈블러는 Rn이 PC가 아닐경우 @Rn 연산자에 에러를 발생시킵니다. 런타임 라이브러리가 -h가 활성화된 상태로 빌드되지만, IDE는 영향 받는 디바이스에 대해 이 해결 방법을 자동으로 활성화하지 않습니다.

CPU8

SP 레지스터에 홀수 값을 넣지 않도록 주의해야 합니다. 또한 컴파일러는 SP 레지스터의 값이 항상 짝수라고 가정합니다. 런타임 라이브러리의 어셈블러 파일은 SP 레지스터에 홀수 값을 넣지 않습니다.

CPU11, CPU12, CPU13, CPU45

IAR Embedded Workbench for MSP430 툴체인에선 다루지 않습니다.

CPU15

CPU15의 영향을 받는 디바이스가 영향을 받지 않는 디바이스와 다른 위치로 분기하는 상황에서, 분기 오프셋에 심볼릭 값 ?CPU15_OFFSET을 추가합니다. 이 값은 링커 커맨드 파일에 0(영향받지 않는 디바이스) 또는 2(영향을 받는 디바이스)로 정의됩니다. 런타임 라이브러리의 어셈블러 파일은 영향을 받는 디바이스와 영향받지 않는 디바이스 모두에서 작업하기 위해 필요한 경우 ?CPU15_OFFSET을 사용합니다.

CPU16

선택한 대상 장치에서 작동하는 코드를 신중하게 작성해야 합니다. 런타임 라이브러리에서 어셈블러 파일은 영향을 받는 장치와 영향을 받지 않는 장치 모두에서 작동하도록 작성되었습니다.

CPU18, CPU19, CPU24, CPU25, CPU27, CPU29

만약 어셈블러에 --hw_workaround=nop_after_lpm 옵션을 주게되면, NOP가 즉시 뒤따르지 않는 한 상태 레지스터 SR에서 LPM 비트를 변경할 수 있는 명령이 감지되면 경고가 발생합니다. 문제의 명령이 LPM 비트를 변경할 수 없다고 확신하는 경우, 경고를 트리거하는 라인 바로 직전에 어셈블러 지시어 SUPRESS_NOP_AFER_LPM_WARNING을 라인에 배치하여 경고를 억제할 수 있습니다. 런타임 라이브러리는 다음을 통해 구축됩니다.
--hw_wround=nop_after_lpm이 활성화되고 IDE는 영향을 받는 모든 장치에 대해 자동으로 활성화합니다.

CPU20

영향 받는 기기에 대한 연결 명령 파일 기본 부분에서 코드 유효 기억이 뒤따르지 않는 메모리 영역의 지난 4바이트에 배치할 허용하지 않는다.만약 당신이 연결 명령 파일 또는 사용자 지정 부분에서 장소 부호 안에서 주소를 범위를 수식한다, 당신은 이 제약 조건을 여전히 충족해야 한다.

CPU21

POPM #1 명령어, SR은 어셈블러에 오류를 유발하게 된다.

CPU22

실제 프로그램에 @PC 연산자는 유용하지 않습니다. 어셈블러 코드에 @PC 연산자를 쓰지 않도록 주의해야 합니다. 런타임 라이브러리에, 어셈블러 파일은 @PC 연산자를 쓰지 않습니다.

CPU23, CPU34

PC 레지스터를 회전하는 지침은 실제 응용 프로그램에서는 유용하지 않습니다. PC 레지스터를 어셈블리 코드로 회전시키는 지침을 쓰지 않도록 주의해야 합니다. 런타임 라이브러리에서 어셈블러 파일은 PC 레지스터를 회전하지 않습니다.

CPU26

어셈블러 코드에 CALL SP 지침이 작성되지 않도록 주의해야 합니다. 런타임 라이브러리에서 어셈블러 파일은 CALL SP 명령을 사용하지 않습니다.

CPU28

이 문제를 트리거하는 명령 시퀀스를 쓰지 않도록 주의해야 합니다. 런타임 라이브러리에서 어셈블러 파일은 이 문제를 트리거하는 명령 시퀀스를 사용하지 않습니다.

CPU30

CPU30의 영향을 받는 디바이스가 영향을 받지 않는 디바이스와 다른 위치로 분기하는 경우, 분기 오프셋에 심볼릭 값 ?CPU30_OFFSET을 추가합니다. 이 값은 링커 커맨드 파일에 0(영향 받지 않는 디바이스) 혹은 2(영향 받는 디바이스)로 정의됩니다. 런타임 라이브러리의 어셈블러 파일은 영향을 받거나 받지 않는 디바이스에 동작을 필요로 할때 ?CPU30_OFFSET을 사용합니다.

CPU31

어셈블러 코드의 푸시 명령에서 자동 증가 모드(auto-increment)를 사용하지 않도록 주의해야 합니다. 런타임 라이브러리에서 어셈블러 파일은 푸시 명령에서 자동 증가 모드를 사용하지 않습니다.

CPU32

어셈블러 코드에 CALLA PC 지침이 작성되지 않도록 주의해야 합니다. 런타임 라이브러리에서 어셈블러 파일은 CALLA PC 명령을 사용하지 않습니다.

CPU33

음의 스택 오프셋은 현재 스택 외부의 할당되지 않은 메모리에 액세스하기 때문에 실제 응용 프로그램에서는 허용되지 않습니다. 이러한 메모리는 언제든지 인터럽트에 의해 손상될 수 있습니다. 어셈블리 코드에서 음의 스택 오프셋을 사용하지 않도록 주의해야 합니다. 런타임 라이브러리에서 어셈블러 파일은 네거티브 스택 오프셋을 사용하지 않습니다.

CPU35

어셈블러 코드에 BITB @Rx, PC 명령을 쓰지 않도록 주의해야 한다. 런타임 라이브러리에서 어셈블러 파일은 BITB @Rx, PC 명령을 사용하지 않습니다.

CPU39

MSP430X 아키텍처(-v1)의 경우, 인터럽트를 비활성화할 수 있는 명령 뒤에 NOP가 없으면 어셈블러가 경고를 발생시킵니다. 이 경고는 경고를 트리거한 명령 앞에 있는 라인에 SUPRESS_NOP_AFT_DINT_WARNING 명령을 배치하여 억제할 수 있습니다.

CPU40

MSP430X 아키텍처(-v1)의 경우, 세그먼트 파트의 마지막 명령이 점프 명령일 때마다 어셈블러가 경고를 보냅니다. 점프 직후에 데이터를 동일한 세그먼트 안에 넣는 경우 점프 직후의 데이터 워드가 CPU40을 트리거하지 않도록 주의해야 합니다. 각 점프 뒤에 NOP를 배치하고 같은 세그먼트 부분에 데이터 지시문을 추가하는 것이 좋습니다.

 

 

결론

각 하드웨어 오류 번호에 대한 더 자세한 정보를 사용하고 있는 장치의 오자 지침에서 오류 목록을 참조하십시오(www.ti.com/msp430).

 

모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.