WinAvr в вопросах и ответах
Нет, io.h вы записываете, а из него автоматом в соответствии с ключами компиляции для конкретного Мк препроцессор подключает нужные заголовочные файлы.
- Реклама
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
я не подключал, однако новые регистры подхватились и ошибок нет....vitalik_1984 писал(а):Нет, io.h вы записываете, а из него автоматом в соответствии с ключами компиляции для конкретного Мк препроцессор подключает нужные заголовочные файлы.

Код: Выделить всё
новые регистры подхватилисьне TIMSK а TIMSK0
В даташит, одним словом - ссылку вам давали .
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
а не TCCR0B? Я так понял в зависимости от используемых битов.urry писал(а):только старые мешают, не TCCR0 а TCCR0AКод: Выделить всё
новые регистры подхватились
по даташиту и переименовал все регистры. Файл не подключал io.h. Нужно? Все и так собирается.В даташит, одним словом - ссылку вам давали .
это я для примера привел.
Раз "и так собирается", где-то оно уже включено.
Раз "и так собирается", где-то оно уже включено.
- Реклама
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
А вот еще такая загогулина.
и вот на этом свиче вылазиет ошибка:
что ему не нравится? То что массив? Как быть?
Код: Выделить всё
static unsigned char UART_Buf[68];
....
switch (UART_Buf[0]) {
Код: Выделить всё
/main.c:429: relocation truncated to fit: R_AVR_7_PCREL against `no symbol'"Доктор, у меня это ..." 
Сама запись относительно безобидная, нужно смотреть весь текст.
Единственно, если включить Кашпировского, то можно предположить, что текст нашпиган арифметикой с флоатами и отсутствует ее оптимизация - строчка в мейк файле LIBS = -lm
Неоптимизированный код забрал всю оперативку.
Но это в качестве предположения.
Сама запись относительно безобидная, нужно смотреть весь текст.
Единственно, если включить Кашпировского, то можно предположить, что текст нашпиган арифметикой с флоатами и отсутствует ее оптимизация - строчка в мейк файле LIBS = -lm
Неоптимизированный код забрал всю оперативку.
Но это в качестве предположения.
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
да там много его...urry писал(а):Сама запись относительно безобидная, нужно смотреть весь текст.
нету там никаких флоат. Там буфер, куда собираются данные с уарта и первый байт это команда, остальные данные - параметры для команды.Единственно, если включить Кашпировского, то можно предположить, что текст нашпиган арифметикой с флоатами и отсутствует ее оптимизация - строчка в мейк файле LIBS = -lm
Если код изменить на
Код: Выделить всё
unsigned char ch;
ch='t';
switch (ch) {Код: Выделить всё
unsigned char ch;
сh=UART_Buf[0];
switch (ch) {PS Строчку в мейкфайл добавил - такая же фигня.
код в студию
Дальнейшие рассуждения без полного исходника( лучше в виде проекта) не имеют смысла и превращаются во флуд.alex1126 писал(а):нету там никаких флоат. Там буфер, куда собираются данные с уарта и первый байт это команда, остальные данные - параметры для команды.
Если код изменить на
alex1126, под какой МК пишете? В какой среде (какой компилятор, версия)?
Добавил через пару минут:
Похоже МК у вас с флэшем в 16 Кб или больше.
Ещё добавил:
В настройках проекта в разделе оптимизации выключите
"Use rjmp/rcall (limited range) on >8k devices (-mshort-calls)"
Добавил через пару минут:
Похоже МК у вас с флэшем в 16 Кб или больше.
Ещё добавил:
В настройках проекта в разделе оптимизации выключите
"Use rjmp/rcall (limited range) on >8k devices (-mshort-calls)"
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
Я прекрасно понимаю что без кода сложно разобраться в чем проблемма, особенно когда приведенный кусок самостоятельно работает корректно. Но там исходников на 70 килобайт.
Похоже я понял в чем дело - памяти не хватало, поигрался с оптимизацией, скомпилировалось:
Похоже я понял в чем дело - памяти не хватало, поигрался с оптимизацией, скомпилировалось:
пишу под атмегу 88pa_au, avr-gcc (WinAVR 20100110) 4.3.3. Я так понял что там 8кило флеша. А имеет смысл константы во флеше хранить или это на размер прошивке не повлияет (или даже увеличит)?AVR Memory Usage
----------------
Device: atmega88pa
Program: 6516 bytes (79.5% Full)
(.text + .data + .bootloader)
Data: 604 bytes (59.0% Full)
(.data + .bss + .noinit)
EEPROM: 164 bytes (32.0% Full)
(.eeprom)
это где?В настройках проекта в разделе оптимизации выключите
"Use rjmp/rcall (limited range) on >8k devices (-mshort-calls)"
Это наверно про студию речь.это где?
Странно как-то. Эта ошибка возникает когда линковщик не может при принудительно включенных "коротких" переходах/вызовах переупорядочить код так, чтобы всё укладывалось во флэш.alex1126 писал(а):Похоже я понял в чем дело - памяти не хватало, поигрался с оптимизацией, скомпилировалось
...
пишу под атмегу 88pa_au, avr-gcc (WinAVR 20100110) 4.3.3. Я так понял что там 8кило флеша.
Можно предположить, что для МК с флэшем от 8Кб и меньше эта опция включена автоматом и поэтому линкер именно так ругается.
Смотря что вы имеете в виду. Если ОЗУ хватает, то разницы нет почти.alex1126 писал(а):А имеет смысл константы во флеше хранить или это на размер прошивке не повлияет (или даже увеличит)?
Если с массивами и не критична скорость доступа к ним, то можно массив констант хранить во флэше (аттрибут PROGMEM) и доставать его через функции из группы pgm_read. Тогда ОЗУ освободиться.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
Я смотрел по этому даташиту: http://www.atmel.com/Images/doc8161.pdf
И по размеру прошивки: линкер писал что код занимал больше 7к (93%) (когда я часть кода ремарил и код компилировался). Ну и я сделал вывод что просто места не хватает. В коде действительно есть немало глобальных констант/переменных. Возможно он и не может там что то перераспределить....
что касается размещения во флеше... Там да, добавляешь директиву, но и вся работа с этими переменными меняется. Да и я так понял что размер прошивки не уменьшиться (это же только ОЗУ сэкономит во время выполнения программы), а даже увеличится так как доступ к переменным "усложняется".
я так понял что там именно 8к.• High Endurance Non-volatile Memory Segments
– 4/8/16/32K Bytes of In-System Self-Programmable Flash progam memory
(ATmega48PA/88PA/168PA/328P)
– 256/512/512/1K Bytes EEPROM (ATmega48PA/88PA/168PA/328P)
– 512/1K/1K/2K Bytes Internal SRAM (ATmega48PA/88PA/168PA/328P)
И по размеру прошивки: линкер писал что код занимал больше 7к (93%) (когда я часть кода ремарил и код компилировался). Ну и я сделал вывод что просто места не хватает. В коде действительно есть немало глобальных констант/переменных. Возможно он и не может там что то перераспределить....
что касается размещения во флеше... Там да, добавляешь директиву, но и вся работа с этими переменными меняется. Да и я так понял что размер прошивки не уменьшиться (это же только ОЗУ сэкономит во время выполнения программы), а даже увеличится так как доступ к переменным "усложняется".
Вряд ли на много увеличится код, так как при размещении во флеш добавится пара тройка функций чтения, зато уберется копирование в оперативную память 
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
понятно. Буду надеяться что оставшегося килобайта мне хватит, так как код и так уже соптимизирован практически донельзя.
так констант или переменных?alex1126 писал(а):констант/переменных
копирование ВСЕХ инициализированных переменных в ОЗУ - всего 11 команд.vitalik_1984 писал(а):...зато уберется копирование в оперативную память
Это типа циклом до упора?a_skr писал(а):копирование ВСЕХ инициализированных переменных в ОЗУ - всего 11 команд.
А чтение из флеш памяти сколько занимает?
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22


