4.1.7. Функции

(Руководство разработчика по микроконтроллерам семейства HCS08)

Функция — это совокупность операторов и выражений, предназначенная для решения определенной задачи.

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

Аналог понятия функция в ассемблере — это подпрограмма, вызов которой производится командами JSR/BSR, а возврат — командой RTS. Функции могут принимать данные (параметры) при вызове, а так же возвращать значения (результат функции). Обычно передача параметров в функцию производится через стековую память.

Для объявления функции необходимо указать тип возвращаемого результата, указать имя функции и параметры. Синтаксис объявления функции:

Спецификатор_типаимя_функции(список_параметров)
{
Телофункции
...
}

Функция может принимать и возвращать данные любого типа, поддерживаемого языком С, кроме объединений. Данные могут быть переданы в функцию двумя способами:

  1. Значением — реальное значение параметра передается в функцию, как аргумент.
  2. Указателем — в качестве аргумента передается указатель на параметр.

Можно использовать любой способ, как и оба одновременно. Учтите, что каждый вызов функции должен соблюдать параметры, указанные при объявлении функции.

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

По умолчанию, данные передаются в функцию значением. Единственное исключение — передача массивов в качестве аргументов функции. В этом случае вместо всего массива передается только указатель на первый элемент.

В следующем примере показано объявление функции вычисления среднего значения двух чисел. Результат возвращается вызывающему оператору:

intaverage(intpa,intpb){
longtemp=((long)pa+pb)/2;
return(temp);
};

В первой строке представленного кода указывается имя функции average, две переменные, которые необходимо в нее передать, — pa и pb, а также тип результата функции int. Если функция объявлена типом void, то результат возвращаться не будет.

Если функция содержит несколько параметров, то тип переменной параметра должен объявляться для каждого из них!

Обратите внимание, что переменная temp объявлена в начале кода функции. Поэтому она локальная для этой функции, создается в момент вызова функции и уничтожается в момент возврата значения. Переменные pa и pb также являются локальными, потому что они используются только во время работы функции.

Использование служебного слова return необязательно. Оно может использоваться для выхода из функции и возврата значения. Выход из функции происходит автоматически в момент окончания блока кода.

Функция может быть вызвана, как показано ниже:

result=average(variable_a,variable_b);

Или:

result=average(100,200);//Вычислитьсреднеезначениеот100и200

Для передачи данных в функцию по указателю необходимо сначала объявить указатели на необходимые переменные. Более того, функция должна содержать указатели в качестве входных значений.

Для демонстрации приведем пример функции замены значений двух переменных. Сначала запишем функцию следующим образом:

voidswap(charvl,charv2){
chartemp;
temp=v2;
v2=vl;
vl=temp;
}

На первый взгляд кажется, что запись верная, хотя это не так. Переменные v1 и v2 поменяются местами, как и было задумано, но только локально. Глобальные переменные, которые передаются в функцию при ее вызове, изменяться не будут.

Функция будет работать корректно, если в нее передавать указатели на переменные:

voidswap(char*vl,char*v2)
{
chartemp;
temp=*v2;
*v2=*vl;
*vl=temp;
}

Вызов функции проходит следующим образом:

swap(&varl,&var2);//Заменасодержимогопеременнойvar1иvar2

4.2. Особенности компилятора C для HCS08

Компилятор C для HCS08 в составе интегрированной среды разработки CodeWarrior соответствует стандарту языка ANSI C89, но, помимо этого, включает некоторые функции стандарта C99. Кроме того, компилятор обладает специальными расширениями для оформления функций обработки прерываний, а также некоторыми дополнительными опциями, которые позволяют оптимизировать генерируемый исполнительный код прграммы и сократить время его выполнения.

Электронные компоненты Freescale >>>
Подробнее о компании Freescale >>>