2011-08-31 7 views
2

2 시간 동안 이유를 찾고있었습니다. 이제 IAR Embedded Workbench Evaluation 5.30을 사용하여 CC430F6137 dev 키트 보드에서 디버깅합니다. 일부 전역 정적 변수를 선언 했으므로 올바르게 볼 수 없다는 것을 알고 있습니다. FF 또는 3F로 표시됩니다.IAR Embedded Workbench 430을 사용하여 CC430F6137을 디버깅 할 때 정적 변수를 볼 수 없습니다. 5.3

나는 그들을 메모리 테이블에서 보려고했는데, 패턴은 ff 3f ff 3f처럼 보였다.이 패턴은 마지막으로 0x1C00-0x1CFF에서 나온 것이다; 데이터는 0x1D00 - 0x2BFF로 표시됩니다. CC430F6137의 데이터 시트에 따르면 RAM의 섹션 0은 총 2KB 인 0x1C00 - 0x23FF의 범위를가집니다. 섹션 1의 범위는 0x2400에서 0x2BFF입니다.

예를 들어 정적 변수는 감시 창에 따라 0x1CED에 있습니다. 그러나 값은 0x3F입니다. 정적 변수에서 값을 복사 할 때 로컬 변수를 사용할 때 0x3F가 아닙니다. 내 정적 변수는 섹션 0에있는 작은 경계 영역 (이상한 패턴이 있음)에 속합니다. 내 하드웨어 : TI의 USB-MSP430 디버그 인터페이스. 평가 보드는 EM430F6137F900입니다.

시뮬레이터를 사용해 보았는데 문제가 없습니다. MSP430F449 (TI LPT MSP430 디버거)의 정적 변수를 사용하여 간단한 코드를 만들었으며 정적 변수도 볼 수 있습니다. 왜 이런 일이 발생하고 가능한 해결책이 있는지 아는 사람이 있습니까? 사전에 감사드립니다!


는 모든 (RAMCTL)에서 RAM 비활성화 기능을 사용하고 있습니까 :

이 버그는 여기에

+0

"정적 감시 창"을 사용하고 있습니까? EWB에는 정적 데이터를 보는 별도의 창이 있습니다. – Clifford

+0

일반 시계 창뿐만 아니라 정적 시계 창을 모두 시도했습니다. 그들은 모두 FF 또는 3F를 보여줍니다. 기호 메모리의 해당 주소도 FF 3F 패턴입니다. –

+1

무엇이 잘못되었지만 문제를 추적하는 방법에 대한 몇 가지 힌트를 줄 수 있습니다. 먼저 링커 맵 파일을 검사하여 변수가 실제로 RAM이있는 위치에 있는지 확인하고 링커와 디버거가 동일한 뷰를 유지하는지 확인합니다. 둘째, "main to run"박스의 체크를 해제하고 cstartup 코드를 한 스텝 씩 실행하여 메모리가 올바르게 초기화되었는지 확인하십시오. (DATA16_Z 세그먼트가 지워지고 DATA16_ID가 DATA16_ID로 복사되어야합니다). – Lindydancer

답변

1

몇 가지 제안 사항 워크 벤치 IAR의 최신 버전에서 수정 내장 된?

RAM 메모리는 n 섹터로 구성됩니다. 누설을 줄이기 위해 각 섹터의 전원을 완전히 끌 수 있지만 그러나 모든 데이터가 손실됩니다. RAM 메모리의 기능은 다음과 같습니다.

• RAM 메모리에는 각각 2k 바이트의 n 섹터가 있습니다.

• 각 섹터 0 - n은 완전하게 비활성화 될 수 있지만 데이터 보존은 손실됩니다.

• 가능하면 각 섹터 0에서 n까지 자동으로 저전력 보존 모드로 전환됩니다.


사용의 모든 절전 모드? 나는 LPMx.5에 대해서 생각하고있다. LPMx.5이 (LPM3.5 또는 LPM4.5)를 입력하면

는 전원 관리 모듈 (PMM)의 전압 레귤레이터를 사용할 수 없습니다. 모든 RAM 및 레지스터 내용이 손실됩니다.


당신이 쓴 :

내가 정적 VAR에서 값을 복사하는 로컬 변수를 사용, 그것은 그러나 0x3F입니다하지 않습니다.

전역 정적이있는 동안 로컬 복사본이 0x3F가 아니거나 복사본으로 인해 복사본과 전역 정적 작업이 모두 수행된다는 것을 의미합니까?

복사가 모두 작동하는 경우 정적 전역이 참조되지 않는다고 가정합니다. 그것을 volatile으로 만드십시오.


은 (프로젝트 -> 옵션 -> 링커 -> 목록 링커 목록, 세그먼트지도, 모듈 맵을 생성) 맵 파일을 생성합니다. Debug/List에서 맵 파일을 찾아 전역 정적 변수를 검색하십시오. 이것은 DATA16_Z 섹션 (또는 DATA16_I 섹션에있을 수 있으며, 초기화 값의 DATA16_ID에 관련 슬롯이 있어야 함)에 있어야합니다.

문제가 없다면 EW430_CompilerReference.pdf, "Disks of segments"장에서 흥미로운 정보를 찾을 수있을 것입니다.


디버거 내에서 주소 0x1CED에 쓸 수 있습니까? 메모리 창을 사용하여 테스트하고 다시 읽을 수 있습니다. 그러면 메모리 슬롯 자체가 제대로 작동하는지 확인할 수 있습니다.

작동하지 않는 경우 칩의 RAM이 손상되었을 수 있습니다. 그러면 0x1C00-0x1CFF 내에 패턴이 있지만 그 패턴을 벗어나는 이유가 무엇인지 설명 할 수 있습니다.

+0

글쎄, IAR에서 디버거의 버그로 판명되었습니다. 어쨌든 고맙습니다. –

+0

IAR이 그렇게 말했습니까? 너가 이것들을 그들에게보고하지 않았다면, 너는 분명히해야만한다. – Gauthier

+0

그들은 최신 버전으로 수정했습니다. –