Артём__ 0 8 декабря, 2014 Опубликовано 8 декабря, 2014 · Жалоба Проект для CVAVR 3.1 . Скомпилированные ROM и HEX в Debug. Код такой же как у меня за исключением того что в STATUS.BUSY 1 пишется после вычисления, но это может и не важно. Попробуйте написать проще (вдруг это CV глючит): uint32_t Crc32(uint8_t * data, uint16_t data_size) { CRC.CTRL=0 | CRC_RESET_RESET1_gc | 1<<CRC_CRC32_bp | CRC_SOURCE_IO_gc ; CRC.CTRL=0 | CRC_RESET_NO_gc | 1<<CRC_CRC32_bp | CRC_SOURCE_IO_gc ; CRC.STATUS=1<<CRC_BUSY_bp; for (uint16_t i=0; i<data_size; i++) CRC.DATAIN=*data++; uint32_t crc=*(volatile uint32_t *)&CRC.CHECKSUM0; crc^=0xFFFFFFFFUL; return crc; } P.S. Загрузил ваш проект в xm256 - получилось что у вас блок CRC инициализирует CRC не единицами, а нулями. То есть CV почему-то не понимает такое выражение: CRC.CTRL=0 | init_zero ? (CRC_RESET_RESET0_gc) : (CRC_RESET_RESET1_gc) | 1<<CRC_CRC32_bp | CRC_SOURCE_IO_gc ; Вместо 0xE1 в CRC.CTRL пишется 0x80. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Duhas 0 8 декабря, 2014 Опубликовано 8 декабря, 2014 · Жалоба 1<<CRC_CRC32_bp должно быть эквивалентно CRC_CRC32_bm, так на всякий. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 8 декабря, 2014 Опубликовано 8 декабря, 2014 · Жалоба 1<<CRC_CRC32_bp должно быть эквивалентно CRC_CRC32_bm, так на всякий. Так и есть - они эквивалентны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ffs2001 0 8 декабря, 2014 Опубликовано 8 декабря, 2014 · Жалоба P.S. Загрузил ваш проект в xm256 - получилось что у вас блок CRC инициализирует CRC не единицами, а нулями. То есть CV почему-то не понимает такое выражение: CRC.CTRL=0 | init_zero ? (CRC_RESET_RESET0_gc) : (CRC_RESET_RESET1_gc) | 1<<CRC_CRC32_bp | CRC_SOURCE_IO_gc ; Вместо 0xE1 в CRC.CTRL пишется 0x80. Действительно, замена этого куска на такой код: CRC.CTRL=0; if (init_zero) { CRC.CTRL |= CRC_RESET_RESET0_gc; } else { CRC.CTRL |= CRC_RESET_RESET1_gc; } CRC.CTRL |= 1<<CRC_CRC32_bp; СRC.CTRL |= CRC_SOURCE_IO_gc; привела к правильному результату вычислений. Артём, спасибо! P.S. Честно говоря, раньше практически не встречал кода, сформированного таким, как в вашей библиотеке, образом. Удивился, когда CVAVR его переварил даже без warning'ов. Видимо, не зря CVAVR ругают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 8 декабря, 2014 Опубликовано 8 декабря, 2014 (изменено) · Жалоба Как я помню, в языке "C" у тернарной операции (?:) приоритет ниже всех. Ниже только у запятой. Скобок надо добавить в CRC.CTRL=0 | init_zero ? (CRC_RESET_RESET0_gc) : (CRC_RESET_RESET1_gc) | 1<<CRC_CRC32_bp | CRC_SOURCE_IO_gc вот так CRC.CTRL=0 | (init_zero ? CRC_RESET_RESET0_gc : CRC_RESET_RESET1_gc) | 1<<CRC_CRC32_bp | CRC_SOURCE_IO_gc Изменено 8 декабря, 2014 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 9 декабря, 2014 Опубликовано 9 декабря, 2014 · Жалоба Как я помню, в языке "C" у тернарной операции (?:) приоритет ниже всех. Ниже только у запятой. Скобок надо добавить в Может быть, скобки никогда не помешают. Но как же тогда результат получается правильным (пробовал на IAR и GCC)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ffs2001 0 9 декабря, 2014 Опубликовано 9 декабря, 2014 · Жалоба Артём, кстати, а каким эмулятором контроллера пользуетесь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 9 декабря, 2014 Опубликовано 9 декабря, 2014 · Жалоба кстати, а каким эмулятором контроллера пользуетесь? Сейчас пользуюсь или AVR Dragon (худший из всех аппаратных отладчиков) или просто симулятором AtmelStudio (CRC или AES/DES считает правильно, но очень медленно). Раньше пользовался JTAG ICE - JTAG ICE 2 (самый лучший из всех) - JTAG ICE 3. У Atmel-а сейчас какие-то новые отладчики появились (дешёвые совсем), но ими не пользовался - про них ничего сказать не могу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 10 декабря, 2014 Опубликовано 10 декабря, 2014 · Жалоба Ваш вариант CRC.CTRL=0 | init_zero ? (CRC_RESET_RESET0_gc) : (CRC_RESET_RESET1_gc) | 1<<CRC_CRC32_bp | CRC_SOURCE_IO_gc Вычисляется вот так: CRC.CTRL=(0 | init_zero) ? (CRC_RESET_RESET0_gc) : ((CRC_RESET_RESET1_gc) | 1<<CRC_CRC32_bp | CRC_SOURCE_IO_gc) Если не init_zero, то правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться