реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Помогите переписать код для GCC под IAR
Сергей Борщ
сообщение Feb 1 2012, 20:17
Сообщение #16


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (smk @ Feb 1 2012, 21:22) *
Оптимизация максимальная по размеру.
Попробуйте максимальную по скорости. Когда то она давала и меньший код, чем оптимизация по размеру. Ну и там есть еще несколько дополнительных галочек, с которыми стоит поиграться. А вообще вам надо радикально пересмотреть использование volatile-переменных, оставив квалификатор лишь у тех переменных, к которым есть обращения И в прерываниях И в основном цикле. А с оставшимися volatile работать по принципу "считал во временную локальную переменную, поработал с локальной, выгрузил результат в volatile". Уверен, что таким нехитрым способом можно выиграть больше, чем от смены компилятора.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 1 2012, 21:31
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(smk @ Feb 1 2012, 21:22) *
Оптимизация максимальная по размеру.


Попробовал откомпилировать с максимальной оптимизацией: 790 байт code/ 63 RAM.
IAR сначала жаловался на нехватку ОЗУ, уменьшил стеки - собралось.

P.S. У вас зачем все глобальные переменные volatile? Некоторые из них (dev_pwm, delta, my_time и может ещё какие-нибудь) используются исключительно в единственном прерываниии: volatile не нужен. Может аналогичная ситуция с основной программой, не смотрел.
P.S.2 Просьба: если скомпилится и заработает выложите полученные размеры для IAR и GCC. Интересно кто кого.
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 2 2012, 08:30
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Уменьшил CSTACK до 0x0f и тоже собралось. Получилось 844/64. Есть еще пара вопросов перед тем как делать все остальное. ИАР выдает несколько предупреждений и хочется от них избавиться. Все предупреждения вида:
Код
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement D:\DATA\IAR_AVR\DatMSL\DatMSL_main.c 46

В строчках

Код
if(adc_data>=_adc_data) delta=adc_data - _adc_data;

else delta=_adc_data - adc_data;

if((pwm>(brightness[count_pwm]))|(pwm==0)){sig_off;}

if(tick_count==div_on_on)

if(my_time==set_time)

if(tick_count==div_on_off)


Пока наилучший результат 770/64.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 2 2012, 08:37
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (smk @ Feb 2 2012, 09:42) *
ИАР выдает несколько предупреждений
Правильно выдает. Чтение volatile может приводить к изменению ее содержимого (вспомните регистр UDR или подобные) и содержимого других volatile-переменых (при чтении ADCH обновляется ADCL). В вычислении результата ваших выражений используются минимум две volatile-переменные. Компилятор предупреждает, что поскольку порядок вычисления выражений не определен, то и результат вычислений может быть не таким, как вы ожидаете. У вас есть два варианта решения:
1) Избавиться от лишних volatile и тогда большинство выражений будет содержать максимум одну volatile-переменную.
2) В оставшихся выражениях вместо "лишних" volatile-переменных использовать временные локальные переменные, в которые заранее считано значение из volatile:
CODE
uint16_t ADC_result;
{
    uint8_t Tmp = ADCL;
    ADC_result = (ADCH << 8) | Tmp;
}

Ну или не делать п.1 а везде применять п.2, но это тупиковое решение и сокращения кода вы так не получите.

Исправил - попутаны были ADCH и ADCL


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 2 2012, 09:52
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Сделал везде по 1 варианту. Это пока дало наилучший результат. Посмотрим что будет в железе.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 2 2012, 10:45
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (smk @ Feb 2 2012, 11:52) *
Сделал везде по 1 варианту.
Не забудьте сообщить, какой в итоге получится размер кода и какой размер того же исходника даст gcc.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 2 2012, 17:47
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



По последним данным GCC 936 байт, а IAR 770 байт, но hex от IAR в железо еще не лил и не тестировал что вышло с потребительской стороны.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post
smk
сообщение Feb 4 2012, 10:52
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446



Самый лучший результат составил 750 байт. В железе все заработало правильно.


--------------------
Живи днем так, чтобы ночью ты спал спокойно.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 06:21
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016