ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
22 ноября
415640
pav256 (07.06.2013 12:11, просмотров: 3676)
Помогите разобраться с контрольной суммой. Работаю в 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; } }