AVR Studio GCC, функция не видит параметр

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 106
Зарегистрирован: Вс апр 01, 2012 22:15:14

Сообщение vt1980 »

Решил с ассемблера перейти на с. AVR Studio 4 GCC
Наваял несложную програмку, она начала работать совсем не так как я ожидал.
В результате изучения оказалось что в вызываемую функцию не передаётся параметр.

void delay(int Pause_ms)
{
counter = 0;
while (counter < Pause_ms)
{}
}

В программе вызываю например delay(15), а это 15 вообще нигде не прописывается , ни в регистрах не видно ни в оперативке.
Уже и в заголовке программы пробовал объявить переменную Pause_ms, место под не в оперативке расчищается, а значение не прописывается.
Не пойму в чём проблема.

Можно конечно прописывать Pause_ms = 15; delay ;
Но хотелось бы разобраться в проблеме.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 842
Зарегистрирован: Чт дек 31, 2009 19:27:45
Откуда: Бровари, Україна

Сообщение avreal »

А counter, небось, в прерывании меняется.
Тогда читать AVR-LIBC FAQ #1
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Контактная информация:
Реклама
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Сообщение HHIMERA »

avreal писал(а):А counter, небось, в прерывании меняется.
До прерываний у ТС'а похоже и не дошло... просто компилятор посчитал это ненужным...
"Я не даю готовых решений, я заставляю думать!"(С)
Встал на лапы
Сообщения: 106
Зарегистрирован: Вс апр 01, 2012 22:15:14

Сообщение vt1980 »

avreal писал(а):А counter, небось, в прерывании меняется.
Тогда читать AVR-LIBC FAQ #1
counter меняется в прерывании таймера, с ним как раз всё в порядке, а вот для Pause_ms не присваивается значение.
Фак почитал, попробовал volatile , и вообще оптимизацию отключить, без изменений.
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Ваша переменная counter должна быть объявлена глобальной и volatile.
Сейчас она у Вас объявлена в функции delay и поэтому считается компилятором локальной. Ее нужно объявить до начала всех функций.
Ставим плюсы: )
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 116
Зарегистрирован: Чт май 03, 2012 06:27:23
Откуда: Челябинск

Сообщение DruidCat »

У меня такая же проблема была в winavr. Сделал переменную volatile, и все заработало.
Кот должен прожить жизнь без сожаления.
Реклама
Встал на лапы
Сообщения: 106
Зарегистрирован: Вс апр 01, 2012 22:15:14

Сообщение vt1980 »

ibiza11 писал(а):Ваша переменная counter должна быть объявлена глобальной и volatile.
Сейчас она у Вас объявлена в функции delay и поэтому считается компилятором локальной. Ее нужно объявить до начала всех функций.
Я же говорю что с counter всё в порядке, она объявлена глобальной в заголовке программы. Она работает как часы без нареканий.

Беда с переменной Pause_ms. Я её и глобальной делал, и волатилил, но командой delay(15) , в функцию значение 15 не передаётся (не присваивается переменной Pause_ms). И вообще в случае объявления её глобальной , при вызове функции с параметром даже в ОЗУ значение переменной не меняется.

Может в AVR Studio вообще функционал обрезан, и такой возможности нет , и надо сначала задать значение переменной а потом вызвать функцию ?
Мудрый кот
Аватара пользователя
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

Может бредовая мысль, но всё же.
А Pause_ms и counter одинакового типа?

Другой вариант - атомарный доступ к переменным.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Встал на лапы
Аватара пользователя
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Сообщение U235 »

vt1980 писал(а):Я же говорю что с counter всё в порядке
Может она и меняется как надо, но компилятор не знает, что это может произойти во время вызова функции delay.
При мало-мальской оптимизации компилятор сделает из вашей функции inline. И что в итоге видит компилятор? Переменная count обнулена, а дальше цикл с фактическим условием (0 < 15), то есть бесконечный. В итоге, компилятор вместо функции с параметром 15 генерирует инструкцию с переходом на саму себя.
Если же сделать переменную count volatile, то компилятор будет знать, что она может изменится и сгенерирует код как Вам нужно.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Сообщение ibiza11 »

Т.е. у Вас код примерно такой?

Код: Выделить всё

volatile unsigned int counter;

void main(void){
    //some code here
    while(1){
        //some code here
    }
}

void delay(unsigned int Pause_ms){
    counter = 0;
    while(counter < Pause_ms);
}

void Timer_ISR(void){ // обработчик прерывания, не знаю как точно
    counter++;
}
 
Ставим плюсы: )
Встал на лапы
Сообщения: 106
Зарегистрирован: Вс апр 01, 2012 22:15:14

Сообщение vt1980 »

да, примерно такой

так работает
Pause_ms = 14;
delay();

а так нет
delay(14);

рс: оптимизацию в настройках компилятора я вообще отключил.
Встал на лапы
Сообщения: 106
Зарегистрирован: Вс апр 01, 2012 22:15:14

Сообщение vt1980 »

Запустил этот проект в пятой студии, и всё заработало как надо.
Спасибо всем за участие.
Встал на лапы
Аватара пользователя
Сообщения: 116
Зарегистрирован: Чт май 03, 2012 06:27:23
Откуда: Челябинск

Сообщение DruidCat »

Я тут на просторах инета нашел код. В симуляторе подобрал под 1 мс коэффициент задержки под свою АТмегу8 на 8мГц. Просто если пользоваться <util/delay.h> исходный код почему-то получается у меня большой.

Код: Выделить всё

void delay(int ms)
{
    volatile int c;
    for (int a=0; a<ms; a++)
    {
        for(int b=0; b<468; b++)
        {
            c++;
        }
    }
}
PS: У меня вопрос к создателю темы, а почему вы упомянули GCC если пользуетесь студией?
Кот должен прожить жизнь без сожаления.
Встал на лапы
Аватара пользователя
Сообщения: 135
Зарегистрирован: Вт фев 21, 2012 20:42:26
Откуда: Санкт-Петербург, Россия, Земля

Сообщение U235 »

AVR toolchain, WinAVR - это фактически GCC.
Если использовать задержки из <util/delay.h> с низким уровнем оптимизации - код будет огромным и должен генерироваться warning с предупреждением о необходимости изменения настроек.
А из наших труб идет необычный дым. Стой! Опасная зона! Работа мозга!...
Встал на лапы
Сообщения: 106
Зарегистрирован: Вс апр 01, 2012 22:15:14

Сообщение vt1980 »

DruidCat писал(а): PS: У меня вопрос к создателю темы, а почему вы упомянули GCC если пользуетесь студией?
Ну как это почему ?
В AVR Studio , два типа проектов, AVR Assembler и AVR GCC.
Я написал в названии темы, что бы сразу было понятно что код на СИ.

У меня <util/delay.h> вообще не запустился , начал ругаться на содержимое этого delay.h
и я не стал разбираться, и со старта забил на него болт с газовой резьбой.
DruidCat писал(а):Я тут на просторах инета нашел код.
Код хороший, но для моих целей больше подходит прерывание по таймеру, потому что это не просто пауза, а составная часть сложного сигнала, и длительность импульсов и задержка между ними должны быть строго определённого значения.
С простой паузой в коде это делать не удобно, придётся подбирать вручную каждую паузу, в зависимости от количества кода между двумя такими паузами.
Встал на лапы
Аватара пользователя
Сообщения: 116
Зарегистрирован: Чт май 03, 2012 06:27:23
Откуда: Челябинск

Сообщение DruidCat »

Я читал что разработчики WINAVR сейчас работают на ATMEL и работают над AVR toolchain (то же самый WINAVR). Тока я не пойму как этот AVR toolchain запустить, скачал последний дистрибутив AVR toolchain с сайта Atmel, установил, а как запустить, не знаю. Может кто подскажет как запустить компилятор?
А AVR Studio использует компилятор от Visual Studio, или я ошибаюсь?
Кот должен прожить жизнь без сожаления.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Студия использует компилятор GCC или любой аналог.Как уже описали ниже WinAVR перетек в AVR toolchain смысл остался тот же.
А визуал студио это всего лишь графическая оболочка для компилятора.
Используется в пятой студии.
Можно хоть самому в блокноте записать отправить через командную строку на компиляцию, а нужно ли?
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону

Сообщение Goldsmith »

DruidCat писал(а):Может кто подскажет как запустить компилятор?
Классический вариант - создать сценарий сборки проекта для утилиты make. Трудоемко, но гибко. Позволит собирать проект одной командой.

Можно использовать также более современные аналогичные инструменты, например, Rake.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 116
Зарегистрирован: Чт май 03, 2012 06:27:23
Откуда: Челябинск

Сообщение DruidCat »

Получается, что на AVR Studio язык программирования C по синтексису не будет отличаться от WinAVR.
Почитал про RAKE на википедии, непонятно.
Ааааа, я не понимаю про что вы говорите. Буду продолжать пользоваться WinAVR и не взрывать себе голову. :shock:
PS: а где можно почитать про утилиту make на русском?
Кот должен прожить жизнь без сожаления.
Прорезались зубы
Аватара пользователя
Сообщения: 222
Зарегистрирован: Чт июл 08, 2010 01:03:40
Откуда: Украина, Киев

Сообщение Antifritz »

Народ, скачайте Atmel Studio 6 и не парьтесь с компиляторами.
Ответить

Вернуться в «AVR»