Обсуждаем контроллеры компании Atmel.
Ответить

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

Сб сен 22, 2012 11:33:02

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

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

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

Можно конечно прописывать Pause_ms = 15; delay ;
Но хотелось бы разобраться в проблеме.

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

Сб сен 22, 2012 12:01:04

А counter, небось, в прерывании меняется.
Тогда читать AVR-LIBC FAQ #1

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

Сб сен 22, 2012 12:38:56

avreal писал(а):А counter, небось, в прерывании меняется.

До прерываний у ТС'а похоже и не дошло... просто компилятор посчитал это ненужным...

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

Сб сен 22, 2012 13:21:39

avreal писал(а):А counter, небось, в прерывании меняется.
Тогда читать AVR-LIBC FAQ #1

counter меняется в прерывании таймера, с ним как раз всё в порядке, а вот для Pause_ms не присваивается значение.
Фак почитал, попробовал volatile , и вообще оптимизацию отключить, без изменений.

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

Сб сен 22, 2012 13:31:09

Ваша переменная counter должна быть объявлена глобальной и volatile.
Сейчас она у Вас объявлена в функции delay и поэтому считается компилятором локальной. Ее нужно объявить до начала всех функций.

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

Сб сен 22, 2012 13:46:09

У меня такая же проблема была в winavr. Сделал переменную volatile, и все заработало.

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

Сб сен 22, 2012 18:59:04

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


Я же говорю что с counter всё в порядке, она объявлена глобальной в заголовке программы. Она работает как часы без нареканий.

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

Может в AVR Studio вообще функционал обрезан, и такой возможности нет , и надо сначала задать значение переменной а потом вызвать функцию ?

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

Сб сен 22, 2012 19:09:04

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

Другой вариант - атомарный доступ к переменным.

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

Сб сен 22, 2012 19:15:45

vt1980 писал(а):Я же говорю что с counter всё в порядке

Может она и меняется как надо, но компилятор не знает, что это может произойти во время вызова функции delay.
При мало-мальской оптимизации компилятор сделает из вашей функции inline. И что в итоге видит компилятор? Переменная count обнулена, а дальше цикл с фактическим условием (0 < 15), то есть бесконечный. В итоге, компилятор вместо функции с параметром 15 генерирует инструкцию с переходом на саму себя.
Если же сделать переменную count volatile, то компилятор будет знать, что она может изменится и сгенерирует код как Вам нужно.

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

Сб сен 22, 2012 19:19:42

Т.е. у Вас код примерно такой?
Код:
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++;
}
 

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

Сб сен 22, 2012 19:22:32

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

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

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

рс: оптимизацию в настройках компилятора я вообще отключил.

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

Сб сен 22, 2012 20:10:47

Запустил этот проект в пятой студии, и всё заработало как надо.
Спасибо всем за участие.

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

Вс сен 23, 2012 15:34:47

Я тут на просторах инета нашел код. В симуляторе подобрал под 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 если пользуетесь студией?

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

Вс сен 23, 2012 15:43:29

AVR toolchain, WinAVR - это фактически GCC.
Если использовать задержки из <util/delay.h> с низким уровнем оптимизации - код будет огромным и должен генерироваться warning с предупреждением о необходимости изменения настроек.

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

Вс сен 23, 2012 15:43:52

DruidCat писал(а):PS: У меня вопрос к создателю темы, а почему вы упомянули GCC если пользуетесь студией?

Ну как это почему ?
В AVR Studio , два типа проектов, AVR Assembler и AVR GCC.
Я написал в названии темы, что бы сразу было понятно что код на СИ.

У меня <util/delay.h> вообще не запустился , начал ругаться на содержимое этого delay.h
и я не стал разбираться, и со старта забил на него болт с газовой резьбой.

DruidCat писал(а):Я тут на просторах инета нашел код.

Код хороший, но для моих целей больше подходит прерывание по таймеру, потому что это не просто пауза, а составная часть сложного сигнала, и длительность импульсов и задержка между ними должны быть строго определённого значения.
С простой паузой в коде это делать не удобно, придётся подбирать вручную каждую паузу, в зависимости от количества кода между двумя такими паузами.

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

Вс сен 23, 2012 18:43:38

Я читал что разработчики WINAVR сейчас работают на ATMEL и работают над AVR toolchain (то же самый WINAVR). Тока я не пойму как этот AVR toolchain запустить, скачал последний дистрибутив AVR toolchain с сайта Atmel, установил, а как запустить, не знаю. Может кто подскажет как запустить компилятор?
А AVR Studio использует компилятор от Visual Studio, или я ошибаюсь?

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

Вс сен 23, 2012 20:22:27

Студия использует компилятор GCC или любой аналог.Как уже описали ниже WinAVR перетек в AVR toolchain смысл остался тот же.
А визуал студио это всего лишь графическая оболочка для компилятора.
Используется в пятой студии.
Можно хоть самому в блокноте записать отправить через командную строку на компиляцию, а нужно ли?

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

Вс сен 23, 2012 20:45:14

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

Можно использовать также более современные аналогичные инструменты, например, Rake.

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

Вс сен 23, 2012 21:10:24

Получается, что на AVR Studio язык программирования C по синтексису не будет отличаться от WinAVR.
Почитал про RAKE на википедии, непонятно.
Ааааа, я не понимаю про что вы говорите. Буду продолжать пользоваться WinAVR и не взрывать себе голову. :shock:
PS: а где можно почитать про утилиту make на русском?

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

Вс сен 23, 2012 22:00:48

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