|
Перенос кода из под ИАРа на WinAVR, возникают некоторые вопросы... |
|
|
|
 |
Ответов
|
Nov 29 2008, 21:43
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(AHTOXA @ Nov 29 2008, 21:31)  Но ведь 50% от 0xFFFF - это гораздо больше, чем 50% от 0xFF!  Плохо Вы знаете определение вероятности. Вероятность - это отношение количества интересующих состояний к общему количеству состояний. В рассматриваемом случае вероятность одинакова (мелочь не учитываем). А уж абсолютные количества состояний - это совсем другой вопрос. Если выбирается разрядность 8, значит кодер чтото знает о свойствах своих переменных. А вообще, истоки этого дела (расширение до int) в системе команд PDP-11. Так же, как и описание восьмиричных констант на символ меньше шестнадцатиричных (ребята из DEC'а очень любили восьмиричную систему) С другой стороны лично я выработал некий набор костылей, которые позволяют писать код, хорошо ложащийся как на AVR, так и на ARM (или на другой 32хбитный камень, да и 16тибитный тоже). В частности, это регулярное применение каста (UREG) и (REG), а сами эти типы определяют размер регистра (например, char для AVR, int для архитектур с более высокой разрядностью). Код, конечно, для неподготовленного человека содержит приличное количество странной писанины, но зато с весьма хорошим результатом после компиляции. Еще один финт - минимизация использования знаковых переменных, т.к. это часто приводит к лишним операциям типа расширения знака. Кроме того, лично я, например, против современного игнорирования ключевого слова register. Но это отдельный разговор.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Nov 29 2008, 21:56
|

Любитель
    
Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695

|
Цитата(Rst7 @ Nov 30 2008, 01:43)  С другой стороны лично я выработал некий набор костылей, которые позволяют писать код, хорошо ложащийся как на AVR, так и на ARM (или на другой 32хбитный камень, да и 16тибитный тоже). В частности, это регулярное применение каста (UREG) и (REG), а сами эти типы определяют размер регистра (например, char для AVR, int для архитектур с более высокой разрядностью). Код, конечно, для неподготовленного человека содержит приличное количество странной писанины, но зато с весьма хорошим результатом после компиляции. Еще один финт - минимизация использования знаковых переменных, т.к. это часто приводит к лишним операциям типа расширения знака.
Кроме того, лично я, например, против современного игнорирования ключевого слова register. Но это отдельный разговор. Спасибо за советы Вас, видимо, весьма интересует тема оптимального кода. Наверное, осталась привычка со времён спектрума? Мне кажется, сейчас не каждый заглядывает в "недра" бинарников, особенно программеры PC софта. За отсутствием необходимости?  Раскопал ещё один "пережиток стандарта". Имеем текст: Код typedef unsigned char byte; byte percent; byte maxRPM; byte minRPM;
percent = (maxRPM - minRPM) / 2; и результат: Код percent = (maxRPM - minRPM) / 2; 6c0: 80 85 ldd r24, Z+8; 0x08 6c2: 90 e0 ldi r25, 0x00; 0 6c4: 21 85 ldd r18, Z+9; 0x09 6c6: 82 1b sub r24, r18 6c8: 91 09 sbc r25, r1 6ca: 62 e0 ldi r22, 0x02; 2 6cc: 70 e0 ldi r23, 0x00; 0 6ce: ee d8 rcall .-3620; 0xfffff8ac <__eeprom_end+0xff7ef884> Здесь вроде нет знаковых переменных, и нет сложения. Почему не сработала оптимизация? Разве есть смысл в "запихивании" отрицательного значения в unsigned char? (впрочем, в ИАРе аналогичная фиговина) Также есть проблемы с утилитой создания листинга avr-objdump - как видно, неправильно вычисляется адрес подпрограммы деления... Цитата Цитата За короткое время знакомства с GCC понравилось: удобная реализация атомарности через макросы ATOMIC_BLOCK(), удобная обёртка для обработчиков прерываний вида ISR(vector_name){}. Так это как раз не компилятор, это просто библиотечные макросы. Аналогичные макросы можно сделать для любого минимально вменяемого компилятора. Но разве есть подобные макросы для IAR? Там ведь приходится пользоваться громоздкой конструкцией с pragma и примитивными __disable_interrupt() и __enable_interrupt()...
|
|
|
|
|
Nov 30 2008, 13:57
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(sonycman @ Nov 30 2008, 02:56)  Имеем текст: Код typedef unsigned char byte; byte percent; byte maxRPM; byte minRPM;
percent = (maxRPM - minRPM) / 2; и результат: Код percent = (maxRPM - minRPM) / 2; 6c0: 80 85 ldd r24, Z+8; 0x08 6c2: 90 e0 ldi r25, 0x00; 0 6c4: 21 85 ldd r18, Z+9; 0x09 6c6: 82 1b sub r24, r18 6c8: 91 09 sbc r25, r1 6ca: 62 e0 ldi r22, 0x02; 2 6cc: 70 e0 ldi r23, 0x00; 0 6ce: ee d8 rcall .-3620; 0xfffff8ac <__eeprom_end+0xff7ef884> Здесь вроде нет знаковых переменных, и нет сложения. Почему не сработала оптимизация? Что именно тут можно было сделать более оптимально? Цитата(sonycman @ Nov 30 2008, 02:56)  Также есть проблемы с утилитой создания листинга avr-objdump - как видно, неправильно вычисляется адрес подпрограммы деления... А зачем вообще в данном случае использовать дизассемблирование? Почему не смотреть сразу вывод компилятора? Там хотя бы все имена символов на своих местах: Код lds r24,maxRPM ldi r25,lo8(0) lds r18,minRPM sub r24,r18 sbc r25,__zero_reg__ ldi r22,lo8(2) ldi r23,hi8(2) rcall __divmodhi4 sts percent,r22 ret А узнать адрес функции удобнее из map-файла... Цитата(sonycman @ Nov 30 2008, 02:56)  Так это как раз не компилятор, это просто библиотечные макросы. Аналогичные макросы можно сделать для любого минимально вменяемого компилятора.
Но разве есть подобные макросы для IAR? Там ведь приходится пользоваться громоздкой конструкцией с pragma и примитивными __disable_interrupt() и __enable_interrupt()... Не знаю, я IAR'ом никогда не пользовался. Даже если нет, что мешает написать? Вот в GCC тоже нет таких макросов - так сделали же...
Сообщение отредактировал alx2 - Nov 30 2008, 14:50
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
Сообщений в этой теме
sonycman Перенос кода из под ИАРа на WinAVR Nov 22 2008, 19:39 demiurg_spb Поможет WinAVR\avr\include\util... Nov 22 2008, 20:04 sonycman Цитата(demiurg_spb @ Nov 23 2008, 00:04) ... Nov 22 2008, 21:17  ReAl Цитата(sonycman @ Nov 22 2008, 23:17) Раз... Nov 23 2008, 18:03   sonycman Цитата(ARV @ Nov 23 2008, 21:23) как прав... Nov 23 2008, 19:09    ReAl Цитата(sonycman @ Nov 23 2008, 21:09) то ... Nov 23 2008, 21:37    Сергей Борщ Цитата(sonycman @ Nov 23 2008, 21:09) то ... Nov 23 2008, 21:45   Petka Цитата(ReAl @ Nov 23 2008, 21:03) У gcc е... Nov 23 2008, 20:38    sonycman Цитата(Petka @ Nov 24 2008, 00:38) В прин... Nov 23 2008, 21:37     ReAl Цитата(sonycman @ Nov 23 2008, 23:37) А е... Nov 23 2008, 21:51    ReAl Цитата(Petka @ Nov 23 2008, 22:38) В прин... Nov 23 2008, 21:43     Petka Цитата(ReAl @ Nov 24 2008, 00:43) Это НЕ ... Nov 24 2008, 07:35 MrYuran Насколько я помню, у WinAVR имеется отличная докум... Nov 23 2008, 08:24 sonycman Цитата(MrYuran @ Nov 23 2008, 12:24) Наск... Nov 23 2008, 14:33 sonycman Цитата(MrYuran @ Nov 23 2008, 12:24) Наск... Nov 23 2008, 17:09  ARV Цитата(sonycman @ Nov 23 2008, 20:09) А м... Nov 23 2008, 17:23  alx2 Цитата(sonycman @ Nov 23 2008, 22:09) А м... Nov 23 2008, 21:54 sonycman Портировал я свою программу с IARа на GCC.
Оптимиз... Nov 24 2008, 11:05 aesok Цитата(sonycman @ Nov 24 2008, 14:05) Так... Nov 24 2008, 11:35  sonycman Цитата(aesok @ Nov 24 2008, 15:35) Добавт... Nov 24 2008, 11:57   aesok Цитата(sonycman @ Nov 24 2008, 14:57) У м... Nov 24 2008, 19:07    sonycman Цитата(ARV @ Nov 24 2008, 20:40) смутил к... Nov 24 2008, 19:26     ARV Цитата(sonycman @ Nov 24 2008, 22:26) Поп... Nov 24 2008, 20:00      sonycman Цитата(ARV @ Nov 25 2008, 00:00) Кодavr-g... Nov 24 2008, 20:23       Сергей Борщ Цитата(sonycman @ Nov 24 2008, 22:23) Вот... Nov 24 2008, 21:14        sonycman Цитата(Сергей Борщ @ Nov 25 2008, 01:14) ... Nov 24 2008, 23:36         gotty Цитата(sonycman @ Nov 25 2008, 01:36) Так... Nov 25 2008, 07:39 demiurg_spb Цитата(sonycman @ Nov 24 2008, 14:05) и в... Nov 24 2008, 11:56 alx2 Привет, sonycman!
Цитата(sonycman @ Nov 2... Nov 25 2008, 21:58  Rst7 Цитата(alx2 @ Nov 25 2008, 23:58) И зря. ... Nov 26 2008, 12:46 sonycman Интересно, почему при делении на два не всегда исп... Nov 24 2008, 14:15 MrYuran Цитата(sonycman @ Nov 24 2008, 17:15) Инт... Nov 24 2008, 14:22  sonycman Цитата(MrYuran @ Nov 24 2008, 18:22) Я об... Nov 24 2008, 14:46   demiurg_spb Цитата(sonycman @ Nov 24 2008, 17:46) Ещё... Nov 24 2008, 15:58    sonycman Цитата(demiurg_spb @ Nov 24 2008, 19:58) ... Nov 24 2008, 16:05 ARV смутил ключик --gc-sections я всегда использую -Wl... Nov 24 2008, 16:40 ARV -ff-sections заставляет компилятор размещать код к... Nov 25 2008, 05:56 sonycman Цитата(gotty @ Nov 25 2008, 11:39) Для то... Nov 25 2008, 09:41  ARV Цитата(sonycman @ Nov 25 2008, 12:41) Над... Nov 25 2008, 09:52  gotty Цитата(sonycman @ Nov 25 2008, 11:41) Лин... Nov 25 2008, 10:01   sonycman Цитата(ARV @ Nov 25 2008, 13:52) практика... Nov 25 2008, 10:42    ARV Цитата(sonycman @ Nov 25 2008, 13:42) Пон... Nov 26 2008, 07:22     aesok Цитата(ARV @ Nov 26 2008, 10:22) на сколь... Nov 26 2008, 09:39      ARV Цитата(aesok @ Nov 26 2008, 12:39) На как... Nov 26 2008, 09:50 sonycman Цитата(alx2 @ Nov 26 2008, 01:58) Привет,... Nov 26 2008, 10:17 alx2 Цитата(sonycman @ Nov 26 2008, 15:17) Сей... Nov 26 2008, 20:20  Rst7 Цитата(alx2 @ Nov 26 2008, 22:20) -2, -3
... Nov 26 2008, 20:45   alx2 Цитата(Rst7 @ Nov 27 2008, 01:45) Если уж... Nov 26 2008, 21:35    Rst7 Цитата(alx2 @ Nov 26 2008, 23:35) оно дае... Nov 26 2008, 21:56   sonycman Цитата(Rst7 @ Nov 27 2008, 00:45) Однако,... Nov 26 2008, 22:02    aesok Цитата(sonycman @ Nov 27 2008, 01:02) Но ... Nov 27 2008, 04:14     alx2 Цитата(aesok @ Nov 27 2008, 09:14) The co... Nov 27 2008, 11:50    Rst7 Цитата(sonycman @ Nov 27 2008, 00:02) А д... Nov 27 2008, 07:56     gotty Цитата(Rst7 @ Nov 27 2008, 09:56) Аналоги... Nov 27 2008, 08:51      Rst7 Цитата(gotty @ Nov 27 2008, 10:51) Это на... Nov 27 2008, 09:08       gotty Цитата(Rst7 @ Nov 27 2008, 11:08) Ссылку.... Nov 27 2008, 09:24      sonycman Цитата(gotty @ Nov 27 2008, 12:51) Это на... Nov 27 2008, 09:28       zltigo Цитата(sonycman @ Nov 27 2008, 12:28) Но ... Nov 27 2008, 09:45        sonycman Цитата(zltigo @ Nov 27 2008, 13:45) Следо... Nov 27 2008, 10:04         Сергей Борщ Цитата(sonycman @ Nov 27 2008, 12:04) Пон... Nov 27 2008, 11:35     aesok Цитата(Rst7 @ Nov 27 2008, 10:56) вычисля... Nov 27 2008, 16:52      Rst7 Цитата(aesok @ Nov 27 2008, 18:52) Расмот... Nov 27 2008, 17:08    alx2 Цитата(sonycman @ Nov 27 2008, 03:02) Код... Nov 27 2008, 11:29     sonycman Цитата(alx2 @ Nov 27 2008, 15:29) Как ты ... Nov 27 2008, 13:35 sonycman 2aesok
Если у меня в программе операнд имеет тип c... Nov 27 2008, 17:03 aesok Цитата(sonycman @ Nov 27 2008, 20:03) 2ae... Nov 27 2008, 17:18  sonycman Цитата(aesok @ Nov 27 2008, 21:18) Я вам ... Nov 27 2008, 18:22   aesok ЦитатаЭтот пример не имеет ничего общего с моим пр... Nov 27 2008, 19:49    sonycman Цитата(aesok @ Nov 27 2008, 23:49) Это Ва... Nov 27 2008, 21:52     aesok Цитата(sonycman @ Nov 28 2008, 00:52) Нет... Nov 27 2008, 22:22      sonycman Цитата(aesok @ Nov 28 2008, 02:22) Я попы... Nov 27 2008, 22:46       aesok Цитата(sonycman @ Nov 28 2008, 01:46) Хм.... Nov 27 2008, 23:20        sonycman Цитата(aesok @ Nov 28 2008, 03:20) Потому... Nov 28 2008, 00:34     alx2 Цитата(sonycman @ Nov 28 2008, 02:52) Код... Nov 29 2008, 11:51      sonycman Цитата(alx2 @ Nov 29 2008, 15:51) Поэтому... Nov 29 2008, 21:02       aesok Цитата(sonycman @ Nov 30 2008, 00:02) Я п... Nov 29 2008, 22:00        sonycman Цитата(aesok @ Nov 30 2008, 02:00) Не заб... Nov 29 2008, 22:24         alx2 Цитата(sonycman @ Nov 30 2008, 03:24) А в... Nov 30 2008, 14:40        Rst7 Цитата(aesok @ Nov 30 2008, 00:00) меня н... Nov 29 2008, 22:24         aesok Цитата(Rst7 @ Nov 30 2008, 01:24) Простит... Nov 29 2008, 22:36       alx2 Цитата(sonycman @ Nov 30 2008, 02:02) Зач... Nov 30 2008, 13:41        sonycman Цитата(Rst7 @ Nov 30 2008, 17:46) Жесть. ... Nov 30 2008, 14:19 Сергей Борщ Цитата(sonycman @ Nov 28 2008, 02:34) То ... Nov 28 2008, 01:08    Rst7 Цитата(sonycman @ Nov 29 2008, 23:56) Там... Nov 29 2008, 22:53     sonycman Цитата(Rst7 @ Nov 30 2008, 02:53) Дык где... Nov 29 2008, 23:14      alx2 Цитата(sonycman @ Nov 30 2008, 04:14) В И... Nov 30 2008, 14:21       sonycman Цитата(alx2 @ Nov 30 2008, 18:21) Можно в... Nov 30 2008, 14:34     aesok Цитата(Rst7 @ Nov 30 2008, 01:53) Вынужде... Nov 29 2008, 23:31   AHTOXA Цитата(Rst7 @ Nov 30 2008, 02:43) Плохо В... Nov 29 2008, 23:23 alx2 Привет, Rst7!
Цитата(Rst7 @ Nov 29 2008, ... Nov 30 2008, 13:13 sonycman Неважнецки получается у GCC работа со структурой в... Nov 30 2008, 10:23 Rst7 Хоть я и откланялся, но господину sonycman'у о... Nov 30 2008, 11:09 sonycman Цитата(Rst7 @ Nov 30 2008, 15:09) 218 byt... Nov 30 2008, 11:57 sonycman RST7
Не получается у меня научить гнуса правильно ... Nov 30 2008, 13:22 Rst7 Цитатаи результат компиляции первой строчки:
Жест... Nov 30 2008, 13:46
2 страниц
1 2 >
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|