Дата последнего обновления файла 10.10.2005

Области действия переменных и функций в языке программирования С-51

Любой объект, который объявляется в программе, написанной на языке программирования C-51, имеет область действия. В языке программирования С область действия объекта распространяется на всю программу, то есть любой объект является глобальным.

К объектам запрещено обращение до того, как они будут объявлены, поэтому при обращении к объекту, объявленному в другом программном модуле этот объект должен быть объявлен в данном программном модуле как external. Например:

extern char code ERROR [];          /*Строка сообщения об ошибке */
extern struct mrec current;         /* Текущее измерение */
extern struct interval setinterval; /* Значения установленных интервалов */
extern struct interval counter ;    /* Счетчик интервалов */

При использовании внутри модуля переменной, уже объявленной в другом модуле, могут возникнуть проблемы при связывании программы. Если использование переменной с тем же именем, что и в другом модуле делает программу более наглядной, то можно в одном из модулей (или во всех сразу) с атрибутом static. Например:

static int i;   //Глобальная переменная, недоступная из других модулей (а значит и не мешающая)

void tmp(void)
{i=5;
}

Некоторые блоки могут содержать  структурные операторы, как показано в следующих примерах. Использование внутренних блоков позволяет объявлять локальные переменные. Использование локальных переменных позволяет использовать одни и те же ячейки памяти для различных переменных* и тем самым экономить ресурсы памяти данных.

Пример 1:

Пример 2:

Локальные переменные существуют только в пределах структурного оператора. Если внутри структурного оператора были присвоены локальным переменным какие-то значения, то не следует ожидать, что вернувшись снова в этот оператор, переменные сохранят присвоенные ранее или вычисленные значения.

В случае, если требуется сохранить значение переменных и при повторном вхождении в подпрограмму или структурный оператор, эту переменную необходимо объявить с атрибутом static. Например:

void tmp(void)
{static int  i=5;
}

То же самое относится и к подпрограммам. Если требуется объявить подпрограмму, которая не должна быть видна из других модулей, то ее необходимо объявить с атрибутом static. Это кроме прочего приведет к тому, что если эта подпрограмма не используется и в данном модуле, то она просто не будет транслироваться и занимать место в памяти программ. Пример объявления подпрограммы с атрибутом static:

static void tmp(void)
{i=5;
}

Иногда требуется локальные переменные хранить не в одних и тех же ячейках памяти, а в стеке. Это требуется, например при вызове подпрограммы самой из себя. В таком случае подпрограмма должна быть объявлена как reentrant.

Литература:

  1. Микушин А.В. Занимательно о микроконтроллерах. СПб, БХВ-Петербург, 2006.
  2. Микушин А.В., Сажнев А.М., Сединин В.И. Цифровые устройства и микропроцессоры. СПб, БХВ-Петербург, 2010.
  3. Keil uVision3 V3.51 для платформы MCS51

Вместе со статьей "Области действия переменных и функций в языке программирования С-51" читают:

Языки программирования для микроконтроллеров
http://digteh.ru/Progr/progr.php

Операторы языка программирования C-51
http://digteh.ru/MCS51/C51/op_c51.php

Использование функций в языке программирования С-51
http://digteh.ru/MCS51/C51/func.php

Многомодульные программы
http://digteh.ru/MCS51/C51/manymod.php


* Для тех читателей что вышли на эту страницу по поиску прошу обратить внимание, что здесь рассматривается не стандартный язык программирования С, а язык, адаптированный к микроконтроллерам серии MCS-51. Имеются отличия!

Автор Микушин А. В. All rights reserved. 2001 ... 2017

Предыдущие версии сайта:
http://neic.nsk.su/~mavr
http://digital.sibsutis.ru/

Поиск по сайту сервисом Яндекс

Поиск по сайту сервисом ГУГЛ

пЕИРХМЦ@Mail.ru


Яндекс.Метрика
Rambler's Top100