ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
12 июля
444912 Топик полностью
Mazur (21.09.2013 21:50, просмотров: 149) ответил Mazur на Установил IAR. Первое впечатление положительное. Но на флеше опять затык. В чем сейчас моя ошибка?
Так. С IAR вроде подружился. С flash наконец-то получилось работать. Притом, почти так, как мне и нужно было. AVR Toolchain с памятью программ не умеет как надо работать. Может я не до конца разобрался, но мои попытки заставить читать flash как надо завершились переходом на IAR. Спасибо Vladimir Ljaschko. AVR Toolchain вычислял адрес указателя на flash арифметикой. Боюсь предположить, что он там накомпилирует по больших размерах массивов и структур. IAR же спокойненько делает как надо, adiw, sbiw. И скомпилировал почти так как я на асме это делал. Есть отличия. Но это уже несоизмеримо с результатом компилятора AVR Toolchain. Пример работы со структурой на IAR. struct str_key_cod { u08 key; u08 key_cod; } str_key_cod; struct str_key_cod __flash tab_keys_code [] = { // {KEY_ESC_BIT, KEY_ESC_COD}, // test {KEY_ENTER_BIT, KEY_ENTER_COD}, {KEY_UP_BIT, KEY_UP_COD}, {KEY_DOWN_BIT, KEY_DOWN_COD}, {KEY_PLUS_BIT, KEY_PLUS_COD}, {KEY_MINUS_BIT, KEY_MINUS_COD}, {0xFF, 0xFF}, }; //------------------------------------------------------------------------ void (define_keys) (void) { if (keys_flags & 1<<DEFINE_KEYS_FLG) { clrb (keys_flags, DEFINE_KEYS_FLG); struct str_key_cod __flash *ptr = tab_keys_code; for (ptr = tab_keys_code; ptr -> key != 0xFF; ptr++) { if (ptr -> key == keys_curr) { keys_buf = ptr -> key_cod; break; } } } } Правда на IAR не получилось скомпилировать следующее: void get_addr_line (void) { static const u08 lines [4]={0x80, 0xC0, 0x94, 0xD4}; return lcd_send_com(lines[cnt_y]); } // Пришлось переделать на: static const u08 lines [4]={0x80, 0xC0, 0x94, 0xD4}; lcd_send_com(lines[cnt_y]);