Например TDA7294

Форум РадиоКот • Просмотр темы - Вместо main выполнение начинается с чего-то другого
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн янв 19, 2026 02:58:02

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Вместо main выполнение начинается с чего-то другого
СообщениеДобавлено: Вс сен 27, 2020 09:23:53 
Нашел транзистор. Понюхал.

Зарегистрирован: Пт ноя 16, 2012 18:53:40
Сообщений: 171
Рейтинг сообщения: 0
Интересные вещи 8(
При компиляции с любой оптимизацией почему-то первой исполняется функция которая вообще не вызывается.. Ну и далее все входит в бесконечный цикл и виснет (видимо связано с тем что не все настроено, и видимо адреса могут быть местами левые в переменных).

Если собрать без оптимизации, вызов начинается как и положено с main. Почему такое может быть? ;)

Компилирую такой командой -
`which avr-gcc` -ggdb3 -Wall -std=c99 -mmcu=avr25 -DF_CPU=8000000UL -D__AVR_ATtiny85__ main.c USI_TWI_Slave.c -o main.elf

Дальше запускаю в симуляторе simavr -f 8000000 -m attiny85 -g 1234 ./main.elf
Захожу в gdb и вижу, что запущен не main.

На железке соответственно все висло. Сейчас я железку немного испортил :-), поэтому бинарник без оптимизации проверить не могу. Но очень похоже что там тоже самое происходит.

Вот main, ожидается, что инициализируется twi и будет мигать светодиод. Сначала я подумал что вызывается обработчик прерываний, и в нем вызываются USI_TWI_On_Slave_Transmit, USI_TWI_On_Slave_Receive, но если первые три строки закомментировать происходит тоже самое.
Код:
int main() {
     USI_TWI_Slave_Initialise(SLAVE_ADDR);
     USI_TWI_On_Slave_Transmit = requestEvent;
     USI_TWI_On_Slave_Receive = receiveEvent;

    DDRB = MASK;
    PORTB = MASK;

    while(1) {
        PORTB ^= MASK;
        _delay_ms(500);
    }
}

Ну, возможно это глюк симулятора конечно. Но тогад не понятно почему в железе светодиод не мигал..

Добавлено after 9 hours 8 minutes 43 seconds:
Примерно понял - ассемблерный код разный получается, и видимо я gcc неверный mcu указываю. Сегодня еще поэксперементирую.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вместо main выполнение начинается с чего-то другого
СообщениеДобавлено: Вс сен 27, 2020 10:26:31 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
Первое за что зацепился глаз - странные настройки компилятора. Попробуйте без извращений:
avr-gcc -Wall -std=c99 -mmcu=attiny85 -DF_CPU=8000000UL main.c USI_TWI_Slave.c -o main.elf


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вместо main выполнение начинается с чего-то другого
СообщениеДобавлено: Вс сен 27, 2020 11:07:18 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
Сами перемудрили. В mmcu надо напрямую название камня указывать. И -D__AVR_ATtiny85__ main.c - явно лишнее. Если сразу камень указать, а не базовую архитектуру, то подтянется всё, что нужно для нормальной сборки.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вместо main выполнение начинается с чего-то другого
СообщениеДобавлено: Вс сен 27, 2020 18:24:04 
Нашел транзистор. Понюхал.

Зарегистрирован: Пт ноя 16, 2012 18:53:40
Сообщений: 171
Рейтинг сообщения: 0
Да, камень я указал неправильно, в доке на gcc этот раздел как-то не очень понятно выглядит - написано avr25, и дальше перечислены поддерживаемые камни. Я подумал что это название для всего списка :)

А теперь хочу разобраться в чем дело.

Есть ли отличия в "устройстве" памяти на разных attiny? В смысле они все начинают исполнение с одного места, или могут быть нюансы? Просто поведение давольно подозриетльное. Основное отличие после дизассемблирования в том что первой функцией идет либо main либо нет.

А для моего камня в принципе тоже самое, но еще раньше идет таблица с векторами прерываний. И ничего сузественного не заметил.

Сейчас буду экспериментировать дальше.

Добавлено after 1 minute 24 seconds:
И -D__AVR_ATtiny85__ main.c - явно лишнее.

Почему лишнее? Если его не указать, то много что не работает. Есть способ указать по другому? Или оно должно включиться при выборе -m attiny85 ?


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Вместо main выполнение начинается с чего-то другого
СообщениеДобавлено: Вс сен 27, 2020 21:45:39 
Поставщик валерьянки для Кота

Карма: 12
Рейтинг сообщений: 532
Зарегистрирован: Ср июл 17, 2013 13:55:57
Сообщений: 1978
Рейтинг сообщения: 0
Цитата:
Да, камень я указал неправильно, в доке на gcc этот раздел как-то не очень понятно выглядит - написано avr25, и дальше перечислены поддерживаемые камни.

Это базовые архитектуры. GCC знает именно отдельные камни. Когда вы указываете конкретную модель МК, дальше тулчейн подтянет всё, что нужно. attiny85 включает в себя avr25 как бы уже.

Цитата:
оно должно включиться при выборе -m attiny85

И в main.c вначале сделайте #include <avr/io.h> и оно само включится.

Цитата:
Есть ли отличия в "устройстве" памяти на разных attiny? В смысле они все начинают исполнение с одного места, или могут быть нюансы? Просто поведение давольно подозриетльное. Основное отличие после дизассемблирования в том что первой функцией идет либо main либо нет.

Тулчейн - это не только gcc. Это еще и базовая либа crt (инициализация) и заголовки (.h), которые определяют нужные вещи. Линкер подтягивает нужный объектный файл .crt, который генерит правильный стартовый код. Правильно цеплять как я уже написал выше - в -m точная модель, и #include <avr/io.h>. Если интересно что получается - да просто сделайте main() с пустым бесконечным циклом и через avr-objdump посмотрите выхлоп дизассемблера. Увидите, что сделал компилятор в таком случае, и что делал в вашем.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y