Немного о AVR Studio

Некоторые комментарии к AVRStudio:

  1. В случае неправильной работы AVRStudio с WinAVR (аварийный выход, зависание и т.п.) в первую очередь обратить внимание на версии AVRStudio и WinAVR.
  2. Части программы можно компилировать раздельно, прямо как модули в Pascal-e. Чтобы собрать программу из разных частей, надо или иметь готовые объектные файлы частей, или добавить исходные тексты частей в проект. AVR Studio сама сформирует необходимый make файл. Имена переменных в одной части могут совпадать c именами в другой части и это даже не дает ошибки линковщика. Главное, чтобы в заголовочных файлах были разные, т.к. с помощью директивы препроцессора #include они объединяются в один файл. Для больших проектов исходные тексты можно размещать даже в разных каталогах. Для удобства пользования директивой #include, можно в make-файле или настройках проекта указать Include Directories. Важную, но до конца не изученную мною роль в правильной сборке играют ключи CFLAGS += -D AVRGCC.
  3. AVRStudio 4.13 не правильно считает время передачи USART на удвоенной скорости – завышает в 2 раза.
  4. WinAVR жестко придерживается стандарта ANSI С, поэтому такая широко распространённая в программах для микроконтроллеров операция как доступ к отдельным битам регистра, выполняется не так удобно, как в IAR. Нет специальной операции sbit. Приходится использовать логические операции. Но это совсем не
    страшно.

    	Установить бит:		Сбросить бит:		Проверить бит:
    	reg |= (1<<bit)		reg &= ~(1<<bit)	reg & (1<<bit)
     

    Во время компиляции при установленном уровне оптимизации -Os, WinAVR преобразует конструкции в одну ассемблерную команду sbi или cbi. Приведенные выше выражения совсем необязательно записывать каждый раз или делать из них функцию, можно воспользоваться препроцессором и представить их в качестве псевдофункций-макросов:

    	#define sbi(reg, bit) reg |= (1<<bit)
    	#define сbi(reg, bit) reg &= ~(1<<bit)
    	#define ckbi(reg, bit) reg & (1<<bit)
     

    В исходном тексте такие конструкции будут выглядеть прямо как настоящие функции, повышая наглядность программы, перед компиляций препроцессор заменит их на выражения, повышая скорость работы (компилятору не придется делать оформление функции и передавать ей параметры), а в процессе компиляции компилятор выполнит оптимизацию и заменит их на соотвествующие ассемблерные команды. Таким образом и овцы целы (стандарт соблюден, есть наглядность программы) и волки сыты (операции выполняются с максимально высокой скоростью). И нет необходимости использовать ассемблерные вставки.

  5. Для процессоров ATMega есть сторонняя библиотека AVRlib. Не путать с AVR libs! AVR libs поставляется вместе с WinAVR и содержит стандартные функции, присущие языку C. На сайте http://avr-libc.narod.ru/ можно ознакомится с переводом документации к этой библиотеке.
    AVRlib может помочь быстро освоить периферию процессора. Для процессоров ATxMega, ATMEL позаботилась сама и выложила бесплатно на сайне прекрасную коллекцию примеров с соответсвующими библиотеками.
    Для использования библиотеки AVRlib необходимо использовать внешний makefile (файл с инструкциями для компилятора). Project -> Configuration Options -> Use External Makefile. В качестве сходного makefile взять любой makefile из примеров (Examples). Достаточно изменить тип процессора и имя проекта.
    Библиотека хороша для проектов, в которых не требуется высокого быстродействия и некритичен размер прошивки. Для диктофона не пригодна 🙁
  6. Основная особенность работы с портами в том, что с каждым портом связано 3 регистра:

    	PORTx - управление выходом порта или подтягивающим резистором 
    	       (0 - резистор выключен, 1 - резистор подключен)
    	DDRx  - управление направлением (0 - вход, 1 - выход)
    	PINx  - состояние ножек порта.
     

  7. Небольшая неточность в книге А.В.Евстифеев Микроконтроллеры AVR семеств Tiny и Mega фирмы ATMEL (очень хорошая книга, представляет из себя практически перевод DataSheet, но неточности есть и в ней). На стр. 291 сказано, что в режиме CTC (сброс при совпадении) устанавливается флаг прерывания TOV (происходит прерывание по переполнению). На самом деле устанавливается флаг OCFA или ICF (происходит прерывание по совпадению).
  8. В памяти у числа, состоящего из нескольких байт, первым идет старший байт. Так на PC, также и в AVRStudio. Числа в двоичном виде из AVR можно напрямую использовать на PC. Но лучше пользоваться констукцией вида:

     На передающей стороне (передается 32-х разрядное целое число a):
    	putchar(a>>24);      //старший байт
    	putchar(a>>16);
    	putchar(a>>8);
    	putchar(a);          //младший байт
    	
     На принимающей стороне
    	a =  getchar();  
    	a <<= 8;
    	a |= getchar();
    	a <<= 8;
    	a |= getchar();
    	a <<= 8; 
    	a |= getchar();
     

    Такая конструкция более наглядна, аппаратно независима. А операции сдвига компилятор при оптимизации заменит на указатели.

  9. В WinAVR как и на компьтере можно использовать числа с плавающей запятой. Для этого достаточно объявить соотвествующую переменную как float (будет использоваться для хранения мантиссы вместе с порядком 2 байта) или double (4 байта). Но, чтобы компилятор мог задействовать аппаратные средства ускорения, надо подключить библиотеку libm.a: Project -> Configuration Options -> Libraries -> libm.a -> Add Object. Если требуется использовать форматированный вывод, то надо подлючить еще libprintf_flt.a, а также в опции линковщика добавить строку “-Wl,-u,vfprintf”: Project -> Configuration Options -> Custom Options -> [Linker Options] -> “-Wl,-u,vfprintf” без кавычек -> Add. Если требуется использовать форматированный ввод, то надо добавить libscanf_flt.a и “-Wl,-u,vfscanf”.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *