프로젝트가 실행되기 전에 dsPIC30F 칩의 데이터 메모리를 테스트해야합니다. 업계 요구 사항으로 인해 C가 제공해야하는 미리 정의 된 라이브러리는 사용할 수 없습니다. RAM 테스트 단계가 실행되지만 실행에 실패합니다.
Step 1 - Write the word 0xAAAA to a specific location in memory (defined by a LoopIndex added to the START_OF_RAM address)
Step 2 - increment LoopIndex
Step 3 - Repeat Steps 1-2 until LoopIndex + START_OF_RAM >= END_OF_RAM
Step 4 - Reset LoopIndex = 0
Step 5 - Read memory at LoopIndex+START_OF_RAM
Step 6 - If memory = 0xAAAA, continue, else throw RAM_FAULT_HANDLER
Step 7 - increment LoopIndex
Step 8 - Repeat Step 5 - 7 until LoopIndex + START_OF_RAM >= END_OF_RAM
지금, 이상한 부분은 내가 코드, 아무 문제를 단계별로 할 수 있다는 것입니다 : 말했다되는 것으로, 여기에 RAM을 테스트하기위한 나의 방법론이다. 내 작은 손가락이 F8 키를 누를 수있는 한 천천히 각 메모리 주소를 반복하지만 4 단계에서 중단 점을 설정하자마자 임의의 이유없이 범용 인터럽트 처리기가 무작위로 throw됩니다. 나는 이것이 내가 사용하는
for()
이 END_OF_RAM을 초과 할 수 있다고 생각했으나 조건의 범위를 변경했으며 여전히 실행하고 싶지 않습니다.
어떤 통찰력이 도움이 될 것입니다.
void PerformRAMTest()
{
// Locals
uint32_t LoopIndex = 0;
uint16_t *AddressUnderTest;
uint32_t RAMvar = 0;
uint16_t i = 0;
// Loop through RAM and write the first pattern (0xAA) - from the beginning to the first RESERVED block
for(LoopIndex = 0x0000; LoopIndex < C_RAM_END_ADDRESS; LoopIndex+= 2)
{
AddressUnderTest = (uint32_t*)(C_RAM_START_ADDRESS + LoopIndex);
*AddressUnderTest = 0xAAAA;
}// end for
for(LoopIndex = 0x0000; LoopIndex < C_RAM_END_ADDRESS; LoopIndex += 2)
{
AddressUnderTest = (uint32_t*)(C_RAM_START_ADDRESS + LoopIndex);
if(*AddressUnderTest != 0xAAAA)
{
// If what was read does not equal what was written, log the
// RAM fault in NVM and call the RAMFaultHandler()
RAMFaultHandler();
}// end if
}
// Loop through RAM and write then verify the second pattern (0x55)
// - from the beginning to the first RESERVED block
// for(LoopIndex = C_RAM_START_ADDRESS; LoopIndex < C_RAM_END_ADDRESS; LoopIndex++)
// {
// AddressUnderTest = (uint32_t*)(C_RAM_START_ADDRESS + LoopIndex);
// *AddressUnderTest = 0x5555;
// if(*AddressUnderTest != 0x5555)
// {
// // If what was read does not equal what was written, log the
// // RAM fault in NVM and call the RAMFaultHandler()
// RAMFaultHandler();
// }
// }
}// end PerformRAMTest
테스트의 두 번째 단계는 0x55
입니다. 이것은 나에게 주어진 원래의 구현 이었지만 결코 작동하지 않았다. (최소한 디버깅/실행과 같은 무작위 인터럽트는이 주소를 읽는이 방법으로 발생했다.)
업데이트 : 약간의 번복 후 & Builds가 실행되면 코드는 스택 포인터 (WREG15)에 도달 할 때까지 실행되고 건너 뛴 다음 오류가 발생합니다.
if(AddressUnderTest >= &SPLIMIT && AddressUnderTest <= SPLIMIT)
{
// if true, set the Loop Index to point to the end of the stack
LoopIndex = (uint16_t)SPLIMIT;
}
else if(AddressUnderTest == &SPLIMIT) // checkint to see if AddressUnderTest points directly to the stack [This works while the previous >= &SPLIMIT does not. It will increment into the stack, update, THEN say "oops, I just hit the stack" and error out.]
{
LoopIndex = &SPLIMIT;
}
else
{
*AddressUnderTest = 0xAAAA;
}
메모리에서 프로그램과 스택은 어디에 있습니까? –
'(C_RAM_START_ADDRESS + LoopIndex)'를'(uint16_t *)'로 캐스팅해서는 안됩니까? –
@LeeDanielCrocker - DATA 메모리는 이론적으로 0x0800에서 시작해야합니다. 프로그램 메모리가 시작됩니다. 잘 모르겠습니다. 우리는 W15 레지스터가 스택 포인터라는 것을 알고 있습니다. 그러나 SPIIMIT 변수를 가지고 있습니다 만, LoopIndex가 건너 뛰도록 설정했으나 작동하지 않습니다. – ThomSirveaux