pav256 (07.06.2013 12:11, просмотров: 3669)
Помогите разобраться с контрольной суммой. Работаю в EWAVR_6.5, проц ATmega2560. Подсчитываю обычную сумму (-J4,sum) с 0 до конца программы. Проблема заключается в следующем: если длина программы меньше 65535, то сумма считается правильно, если больше, то программа выдает сумму на 0xFF больше нежели линкер?
#pragma segment="CHECKSUM"
#pragma segment="NEAR_ID" __farflash
//#pragma segment="FARCODE" __farflash
#define CHECKSUM 0x3FFFC
#define BLOCK_TEST_PZU 0x0200
#define START_PZU 0
unsigned char test_PZU(unsigned char Start)
{
static unsigned long sum, uk;
static unsigned char etap;
unsigned long i;
if(Start) { //начальные условия
etap = 1;
sum = 0;
uk = START_PZU;
return 0;
}
//непосредственно тестирование
switch(etap) {
//тестирование
case 1:
for (i = 0; i < BLOCK_TEST_PZU; i++) {
sum +=*((unsigned char __farflash *)uk);
uk++;
if(uk >= (unsigned long)(__segment_end("NEAR_ID"))) {
etap = 2;
break;
}
}
Test.UNO.ProcentPZU = (uk/(CHECKSUM - START_PZU))*100;
return 0;
//запись результатов тестирования
case 2:
if (sum != *((unsigned long __farflash *)CHECKSUM))
UNO.Sost.RezultDiagnoz |= NEISP_PZU_UNO;
else
UNO.Sost.RezultDiagnoz &= ~NEISP_PZU_UNO;
Test.UNO.ProcentPZU = 100;
etap = 3;
return 1;
//тестирования нет
case 3: return 1;
//заглушка
default: return 0;
}
}