ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
26 ноября
61568 Топик полностью
Павел В. (28.06.2006 19:45, просмотров: 1) ответил ReAl на Во-во! Почему-то для MSP430 или ARM-а никого не удивляет то, что адресация в байтах, а
Короче, полевые испытания показали следующее На счет звездочек в конструкциях вида "(*(void(*)())3)()" - тут я был неоригинален, все делал по Кернигану-Ричи. Правые () ничего не разыменовывают, без левой * ИАР вываливается с ошибкой, что, на мой взгляд, правильно. На счет моветонов... В последних релизах IAR AVR ввел много интринсиков и новых ключевых слов, например "__raw". Функция прерывания не сохраняет никакие регистры вообще! Разве _ТАКОЕ_ можно использовать в прличном обществе? Однако, можно. Например, вылет по таймауту в фатальную ошибку (у меня одна такая функция сразу "похудела" на 80 байт кода). Чувствуется тенденция "ожелезячивания" компилятора, что не может не радовать. Т.к. я считаю, что Си-компилятор должен позволять делать все, на что способен набор машинных команд процессора. Поставив и обкатав версию 4.20А, могу сообщить следующее точнее,изложить очевидные fuckты :-))): Отцы-основатели архитектуры AVR привязали программный счетчик к командам. И, симулируя бутлоадер Меги128 в AVRStudio, мы видим, что после сброса значение PC==0xF000. Инкрементируется PC на 1. Т.е., PC бывает и четным и нечетным. Что соответствует AVR Instruction Set. IAR же считает PC не в командах, а в байтах. Скорее всего, по причине использования одного универсального линкера на все архитектуры. Поэтому, тот же самый бутлоадер в его дебаггере после сброса имеет значение PC==0x1E000. Инкрементируется PC всякий раз на 2. Т.е. у ИАРа программный счетчик всегда только четный. Всякие "Call 3" приводят к ошибкам. Но уже не внутренним, тут они поправились. Если я корректно заявляю, что мне нужен третий адрес: (*(void(*)())3)(); то в версии 4.20А это уже компилится в ассемблерную команду: CALL 0x06, что IAR'овский ассемблер транслирует обратно в тройку: 940E0003 Так же корректно работает интринсиковый косвенный "прыг": __indirect_jump_to(0x03); LDI R30, 3 LDI R31, 0 IJMP Резюме? С выходом патча (и последней версии компилятора), полагаю, все остались довольны... :-))))