Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Компилятор компилит лишний код...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Potter
Компилятор IAR Embedded Workbench. Создаю пустой проект(подключаю библиотеки и создаю функцию main):


#include <stdio.h>
#include <io2313.h>
#include <ina90.h>
#include <string.h>

void main(void)
{

}

Компилю хекс файл. В файле уже кода на 48 байт. Я слышал что если где-то в опциях проекта убрать или поставить галочку то этих 48 байт не будет. Настроил проект чтоб оптимизировал по объему памяти... Дело в том что я создал проект под AT90S2313. Невлизает буквально пару десятков байт.... Если етот лишний код убрать то все влезет.... Где надо покапаться в опциях проекта?
beer_warrior
Скомпилируйте в ассемблер и все станет ясно:
1.Вектора прерываний присутствуют ?
2.Указатель стека вы ручками инитили? Это сделал компилятор автоматом.
3.Глобальные переменные обнулены?
Так, что считайте это еще по мелочи.
Potter
Цитата(beer_warrior @ Jun 22 2006, 23:38) *
Скомпилируйте в ассемблер и все станет ясно:
1.Вектора прерываний присутствуют ?
2.Указатель стека вы ручками инитили? Это сделал компилятор автоматом.
3.Глобальные переменные обнулены?
Так, что считайте это еще по мелочи.


Весь проект ето библиотеки и функция маин.. нет никаких переменных ни векторов прерывания.... Ну конечно может етот код из-за стека.... Но может есть всетаки способ уменьшить его хоть байт на 20?
vet
Соптимизируйте лучше саму программу, уж на 20 байт наверняка ужать получится.
Potter
Цитата(vet @ Jun 22 2006, 23:51) *
Соптимизируйте лучше саму программу, уж на 20 байт наверняка ужать получится.


Уже оптимизировал..... Дальше уже вроде некуда.... Кроме как переписывать весь проект.... Буду пробовать дальше... Сейчас просто перебераю все возвожноти решения задачи..........
vet
Ещё совет - уберите галку General Options - System - Initialize unused interrupt vectors. Это сэкономит размер на таблице векторов.
Potter
Цитата(vet @ Jun 22 2006, 23:59) *
Ещё совет - уберите галку General Options - System - Initialize unused interrupt vectors. Это сэкономит размер на таблице векторов.


Объем кода уменьшился как раз на 20 байт!!! А что это за галачка? За что она отвечает?!
defunct
Под мелкие чипы у которых меньше 16k flash на C не особо разгонишься..

Цитата
Объем кода уменьшился как раз на 20 байт!!! А что это за галачка? За что она отвечает?!

Это разовая экономия. Переведите Initialize unused interrupt vectors и вам сразу станет понятно "за что она отвечает".
beer_warrior
Цитата
Объем кода уменьшился как раз на 20 байт!!! А что это за галачка? За что она отвечает?!

Вектора прерываний жестко связаны с адресами в начале памяти.
При снятой галке, на места, где были rjmp на обработчик прерывания лег код. Да посмотрите вы листинг наконец smile.gif
vet
Цитата(defunct @ Jun 23 2006, 01:08) *
Под мелкие чипы у которых меньше 16k flash на C не особо разгонишься..

Категорично как-то. По мне, так в линейке АВР выбирать асм стоит только для tiny13 (11,12).
IAR - умная софтина, и оптимизировать код позволяет очень гибко.

Цитата(Potter @ Jun 23 2006, 01:04) *
Объем кода уменьшился как раз на 20 байт!!! А что это за галачка? За что она отвечает?!

Просто сравните код с галкой и без, и станет понятно. По умолчанию компилятор заполняет все вектора.
Potter
Всем за все огромное спасибо...
defunct
Цитата(vet @ Jun 23 2006, 00:17) *
Категорично как-то. По мне, так в линейке АВР выбирать асм стоит только для tiny13 (11,12).
IAR - умная софтина, и оптимизировать код позволяет очень гибко.

Для меня так категорично. (<16k - строго асм) Т.к. я не на память смотрю, а на MIPSы у процессора. Если их достаточно для решения задачи, так почему бы их не использовать в полном объеме не смотря на крохотный объем памяти программ.
arttab
Из общих советов:
нет ли переменных длинее char, хотя этого не требуется?
нет ли матиматики? Можно попробовать оптимизировать самому (отказался от float в пользу int).
замена нескольких функций одной унифицированной.
использование структур.
посмотреть какие библиотечные функции используются мало - может быть удастся обойтись без них.
prottoss
Еще, иногда, помогает __no_init перед объявлением переменной, и особенно помогает __regvar __no_init. Правда, в последнем случае придется задавать адрес регистра. Посмотрите, к каким переменным наиболее часто обращается программа, и объявите ее регистром, наверняка сэкономите 20-30 байт кода, ну и МИПСЫ увеличите))).

Цитата(defunct @ Jun 23 2006, 06:40) *
Цитата(vet @ Jun 23 2006, 00:17) *

Категорично как-то. По мне, так в линейке АВР выбирать асм стоит только для tiny13 (11,12).
IAR - умная софтина, и оптимизировать код позволяет очень гибко.

Для меня так категорично. (<16k - строго асм) Т.к. я не на память смотрю, а на MIPSы у процессора. Если их достаточно для решения задачи, так почему бы их не использовать в полном объеме не смотря на крохотный объем памяти программ.

На Си, ИМХО, Вы и используете в полном объеме, + время на разработку проекта, +дальнейшее сопровождение (доработка, модернизация ...etc), а скоростей нужно добиваться не извращениями с Ассемблером, а продумыванием алгоритма и поиском наиболее подходящего для данной задачи. Не мне Вас учить, конечно)))
Kovrov
Поддерживаю defunct
только как для меня оно ещё суровей ... я вообще считаю что, для 8 бит только асм...
ну прет меня от асма что тут говорить...
(коментарии для кода когда с рамочками вывожу и то гляжу красиво ли рамочка нарисовалась в листинге иходника.) ;-)
а насчет скорости разработки, так основное время приходится тратить не на гемор с написанием строк асма, а поиском и поиском оригинального решения - а как только оно появиться, то вписать придуманное плевое дело....
IgorKossak
Ещё один прямой ответ на поставленный вопрос.

48 байт пустого проекта составляют как раз код модуля C_STARTUP.
Код на С можно ещё более сократить если модифицировать этот модуль.
Применяется такой подход при написании бутлоадеров, где с памятью, как правило, напряжёнка.Сделать надо следующее:
1. скопировать в рабочую папку из папки \avr\src\lib файл cstartup.s90
2. подключить этот файл к проекту
3. модифицировать этот файл выкинув из него всё что не нужно:
- вызов low_level_init;
- инициализаторы;
- вызов exit.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.