Код программы на языках программирования тип файла

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

Компьютерные файлы можно рассматривать как цифровой аналог бумажных документов. При программировании исходный код хранится в текстовых файлах с различными расширениями, например, файлы программирования на C заканчиваются расширением .c , файлы программирования Java – на .java , а файлы Python – на .py .

Ввод / вывод файла

Обычно вы создаете файлы с помощью текстовых редакторов, таких как блокнот, MS Word, MS Excel или MS Powerpoint и т. Д. Однако, часто нам также нужно создавать файлы с помощью компьютерных программ. Мы можем изменить существующий файл с помощью компьютерной программы.

Ввод файла означает данные, которые записываются в файл, а вывод файла означает данные, которые считываются из файла. На самом деле, условия ввода и вывода больше связаны с вводом и выводом экрана. Когда мы отображаем результат на экране, он называется выводом. Точно так же, если мы предоставляем некоторый ввод нашей программе из командной строки, то это называется ввод.

Язык C++ с нуля | #35 Разделение программного кода на несколько файлов в c++

Пока достаточно вспомнить, что запись в файл – это ввод файла, а чтение чего-либо из файла – вывод файла.

Режимы работы с файлами

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

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

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

Прекрати писать код в ОДНОМ файле Python | ТОП 5 Ошибок и создание правильной архитектуры

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

Режим чтения и записи – если вы собираетесь читать и писать в один и тот же файл, то вы откроете файл в режиме чтения и записи.

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

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

Открытие файлов

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

FILE *fopen( const char * filename, const char * mode );

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

Открывает существующий текстовый файл для чтения.

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

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

Открывает текстовый файл для чтения и записи как.

Открывает текстовый файл для чтения и записи. Сначала он обрезает файл до нулевой длины, если он существует; в противном случае создает файл, если он не существует.

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

Открывает существующий текстовый файл для чтения.

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

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

Открывает текстовый файл для чтения и записи как.

Открывает текстовый файл для чтения и записи. Сначала он обрезает файл до нулевой длины, если он существует; в противном случае создает файл, если он не существует.

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

Закрытие файла

Чтобы закрыть файл, используйте функцию fclose () . Прототип этой функции –

int fclose( FILE *fp );

Функция fclose () возвращает ноль в случае успеха или специальный символ EOF , если при закрытии файла произошла ошибка. Эта функция фактически сбрасывает любые данные, все еще ожидающие в буфере, в файл, закрывает файл и освобождает любую память, используемую для файла. EOF является константой, определенной в заголовочном файле stdio.h .

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

Написание файла

Ниже приведена простейшая функция для записи отдельных символов в поток –

Читайте также:
Как записать голос на компьютер программа

int fputc( int c, FILE *fp );

Функция fputc () записывает символьное значение аргумента c в выходной поток, на который ссылается fp . Возвращает письменный символ, написанный при успехе, иначе EOF, если есть ошибка. Вы можете использовать следующие функции для записи строки с нулевым символом в конце –

int fputs( const char *s, FILE *fp );

Функция fputs () записывает строку s в файл, на который ссылается fp. Он возвращает неотрицательное значение в случае успеха, в противном случае EOF возвращается в случае любой ошибки. Вы также можете использовать функцию int fprintf (FILE * fp, const char * format, …) для записи строки в файл. Попробуйте следующий пример –

#include int main() FILE *fp; fp = fopen(«/tmp/test.txt», «w+»); fprintf(fp, «This is testing for fprintf. n»); fputs(«This is testing for fputs. n», fp); fclose(fp); >

Когда приведенный выше код компилируется и выполняется, он создает новый файл test.txt в каталоге / tmp и записывает две строки, используя две разные функции. Давайте прочитаем этот файл в следующем разделе.

Чтение файла

Ниже приведена простейшая функция для чтения текстового файла посимвольно –

int fgetc( FILE * fp );

Функция fgetc () читает символ из входного файла, на который ссылается fp . Возвращаемым значением является прочитанный символ; или в случае любой ошибки он возвращает EOF . Следующая функция позволяет вам читать строку из потока –

char *fgets( char *buf, int n, FILE *fp );

Функция fgets () читает до n – 1 символов из входного потока, на который ссылается fp . Он копирует прочитанную строку в буфер buf , добавляя нулевой символ для завершения строки.

Если эта функция встречает символ новой строки ‘ n’ или EOF до того, как они прочитают максимальное количество символов, то она возвращает только символы, считанные до этой точки, включая символ новой строки. Вы также можете использовать int fscanf (FILE * fp, const char * format, …) для чтения строк из файла, но он останавливает чтение после появления первого пробела.

#include main() FILE *fp; char buff[255]; fp = fopen(«/tmp/test.txt», «r»); fscanf(fp, «%s», buff); printf(«1 : %sn», buff ); fgets(buff, 255, (FILE*)fp); printf(«2: %sn», buff ); fgets(buff, 255, (FILE*)fp); printf(«3: %sn», buff ); fclose(fp); >

Когда приведенный выше код компилируется и выполняется, он читает файл, созданный в предыдущем разделе, и выдает следующий результат:

1 : This 2 : is testing for fprintf. 3 : This is testing for fputs.

Давайте проанализируем, что здесь произошло. Во-первых, метод fscanf () читает это, потому что после этого он столкнулся с пробелом. Второй вызов для fgets () , который читает оставшуюся строку, пока не встретит конец строки.

Наконец, последний вызов fgets () полностью читает вторую строку.

Файловый ввод / вывод в Java

Java предоставляет еще более богатый набор функций для обработки файлового ввода-вывода. Для получения дополнительной информации по этой теме мы рекомендуем вам ознакомиться с нашими учебными руководствами по Java.

Здесь мы увидим простую Java-программу, которая эквивалентна C-программе, описанной выше. Эта программа откроет текстовый файл, запишет в него несколько текстовых строк и закроет файл. Наконец, тот же файл открывается и затем читается из уже созданного файла. Вы можете попробовать выполнить следующую программу, чтобы увидеть результат –

import java.io.*; public class DemoJava public static void main(String []args) throws IOException File file = new File(«/tmp/java.txt»); // Create a File file.createNewFile(); // Creates a FileWriter Object using file object FileWriter writer = new FileWriter(file); // Writes the content to the file writer.write(«This is testing for Java write. n»); writer.write(«This is second line. n»); // Flush the memory and close the file writer.flush(); writer.close(); // Creates a FileReader Object FileReader reader = new FileReader(file); char [] a = new char[100]; // Read file content in the array reader.read(a); System.out.println( a ); // Close the file reader.close(); > >

Когда вышеуказанная программа выполняется, она дает следующий результат –

This is testing for Java write. This is second line.

Файловый ввод / вывод в Python

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

# Create a new file fo = open(«/tmp/python.txt», «w») # Writes the content to the file fo.write( «This is testing for Python write. n»); fo.write( «This is second line. n»); # Close the file fo.close() # Open existing file fo = open(«/tmp/python.txt», «r») # Read file content in a variable str = fo.read(100); print str # Close opened file fo.close()

Когда приведенный выше код выполняется, он дает следующий результат –

Источник: coderlessons.com

Языки Си-семейства и бинарные файлы: что нужно знать

Программирование включает в себя множество разнообразных языков. С их помощью программисты и разработчики «общаются» с компьютерами и иными устройствами, а также с приложениями. У каждого – свои собственные особенности и нюансы, синтаксис и правила.

При написании софта приходится задействовать разнообразные files и функции. Чтобы создать качественную утилиту, необходимо помнить обо всех особенностях выбранного языка. Но некоторые возможности используются не слишком часто. Из-за этого они «забываются».

Современные программеры активно используют Си-семейство в своей работе. Google указывает, что сюда включают:

  • C (Си);
  • C++ (Си Плюс-Плюс);
  • C# (Си Шарп).

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

Терминология – что пригодится

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

Перед началом работы с бинарными файлами и Fgets требуется запомнить некоторые ключевые термины. К ним относят следующие понятия:

  • базовый класс – класс, от которого осуществляется наследование;
  • выражение – сочетание операторов, литералов и переменных, которые интерпретируются согласно установленным правилам языка;
  • деструктор – метод класса, который отвечает за деинициализацию объекта;
  • идентификатор – имя, присвоенное «элементу» в кодификации;
  • класс – некий шаблон, отвечающий за определение формы объекта;
  • конструктор – метод класса, используемый при инициализации;
  • литерал – фиксированное значение, не изменяемое приложение;
  • массив – переменные одного типа, обращение к которым производится по общему «названию»;
  • объект – своеобразный экземпляр класса;
  • параметры – переменные, получаемые из аргументов, передаваемый функции при вызове;
  • переменная (наиболее частый формат – int i) – именованная ячейка памяти;
  • строка – последовательность символов, заключенная в двойные кавычки;
  • структура – шаблон, определяющий форму объекта с открытыми членами;
  • указатель – объект, содержащий так называемый адрес памяти;
  • функция – подпрограмма, в которой находится одно или несколько приложения Си, задействованных для определенных задач.

Это – основная терминология для всего Си-семейства. Если какие-то слова при создании кодов не понятны, можно всегда обратиться к помощи Google.

Файлы – виды

C-программирование требует определенных навыков и умений. Для обучения можно использовать Google – там полно полезной информации и даже примеров кодификаций. Но без практики и первоначальных знаний добиться успехов не получится.

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

  • бинарные файлы в c;
  • текстовые файлы.

Каждый используется для чтения и записи собственного «формата». Файл сам по себе, согласно данным из Google – это способ хранения информации.

В C нет операторов для работы с файлами. Необходимые манипуляции производятся при помощи функций стандартной библиотеки .

Текстовый файл — понятие

Текстовый файл – файл, который содержит текстовые данные. Разбивается на строки посредством специального «разделительного» символа, используемого для обозначения окончания строчки или последовательности:

  • в Unix – одиночный символ перевода строки;
  • в Windows – после символа перевода строчки устанавливается знак возврата каретки.

В текстовый файл мы записываем кодификации и «простой текст». То, что нужно записать. Это не особый формат информации.

Бинарный файл – что это

Если посмотреть данные в Google по file в C, можно увидеть, что есть еще и так называемые двоичные «элементы». Это – файлы, из которых осуществляется считывание или вывод байтов. Подразумевается их предоставление программеру в «сыром» виде. То есть, без связывания и подстановок.

Читайте также:
Как сделать программ Mac OS

Разница между файлами

Некоторые перед написанием кода задумываются, в чем разница между указанными видами файлов. Пример – картинка и звуковой документ. Чем они отличаются друг от друга?

Звуковой файл интерпретируется через специальные приложения в звуки, а второй «документ» — в изображение. Аналогичным образом согласно Google ситуация обстоит и рассматриваемыми files. Текстовые рассматриваются в виде «обычного текста», а бинарные интерпретируются в качестве набора двоичных чисел.

В текстовых файлах символ «n» при записи переводится в «rn», при считывании осуществляется так называемая образная замена. В случае с бинарными «элементами» подобный прием не работает ни при каких обстоятельствах.

Особенности работы с бинарными «элементами»

Текстовый файл – понятие далеко не новое. Оно встречается не только в программировании. В Google можно отыскать четкое определение оному. И работа с «обычным текстом» при написании кодификаций не такая уж трудная.

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

Для того, чтобы в Си-семействе (в C++ в особенности) работать с бинарными файлами, согласно Google, используется стандартная библиотека. Для текстовых применяются:

Бинарные файлы тоже используют соответствующие «архивы», но с некоторыми корректировками. Пример – для чтения используют не параметр «r», а «rb». Работа осуществляется непосредственно с битами. Доступ к данным осуществляется произвольным образом.

Доступ к информации в функции

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

Fseek (переменная, расстояние, seek_set или seek_cur или seek_end).

Здесь имеет место следующая расшифровка:

  • seek_set – открываем файл и ведем отсчет от начала;
  • seek_cur – непосредственно от установленного курсора;
  • seek_end – конец файла.

Для того, чтобы рассчитать расстояние (битов, на «размер» которых сдвигается указатель), используют sizeof().

Запись и чтение

Немаловажным моментом является запись и чтение. При помощи Google можно разобраться с тем, как создается и используется поток поступаемой информации при обработке кода. Но без «базы» осознать соответствующую информацию не выйдет.

Для записи бинарного файла (из данных Google) используется запись:

Fwrite (ссылка на записываемую информацию, размер, количество «сведений», файловая переменна).

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

Fgets – для чего нужна функция

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

Полезной является функция fGets. Это – чтение строки из указанного потока данных с последующим сохранением в виде строчки в параметр string. Происходит это до тех пор, пока приложение не дойдет до конца файла.

Символ новой строки закрывает работу fGets, но служит допустимым. Связано это с тем, что происходит копирование оного в строчку string. Нулевой символ добавляется после прочитанных. Указывает на конец str.

Функция имеет вид: char *fgets (char *str, int num, FILE *stream) – вместо char допускается использование void. Аргументы расшифровываются следующим образом:

  • str – указатель на массив, в котором осуществится размещение считанной строчки;
  • num – предельно допустимая длина строчки, попадающей под считывание;
  • stream – поток данных (указатель на него).

Если чтение строчки успешно, Google говорит, что произойдет возвращение указателя на массив, в который помещены прочитанные сведения. В противном случае программному коду предстоит открыть файл, «просмотреть» его и вернуть значение NULL.

Когда при чтении осуществляется ошибка, возвращается NULL, а в переменную errno происходит запись кода ошибки. А состояние массива, в котором должна была сохраниться строчка, не определяется.

Пример

Вот наглядный пример использования fgets:

#include int main() < FILE * ptrFile = fopen(«file.txt» , «r»); char mystring [100]; if (ptrFile == NULL) perror(«Ошибка открытия файла»); else < if ( fgets(mystring, 100, ptrFile) != NULL ) // считать символы из файла puts(mystring); // вывод на экран fclose (ptrFile); >return 0; >

В ходе описанного кода произойдет считывание file.txt или первых 99 символов. Все зависит от того, какое именно из событий осуществляется раньше. Результаты выводятся на экран.

Теперь ясно, что такое двоичный файл в c, а также текстовый file. Для чего они используются, тоже. Если хочется более полно изучить соответствующую тему, рекомендуется отправиться на специализированные компьютерные курсы. Их можно пройти дистанционно. Там расскажут не только о файлах в Си-семействе, но и о fgets и иных функциях.

Также вам может быть интересен курс «Программист C» в Otus.

Источник: otus.ru

Языки высокого уровня — основные понятия и основы применения

Языки высокого уровняПричины использования языков высокого уровня

Помимо ассемблеров для программирова­ния приложений используются различные языки высокого уровня, что обусловле­но следующими причинами:

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

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

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

К наиболее распространенным языкам относятся C/ C++, BASIC и Forth . С помощью компиляторов языки высокого уровня преобразуются в язык ассемб­лера, а затем в объектный код (биты и байты), который выполняется микроконтроллером. Имеется множество компиляторов, разработанных для различных мик­роконтроллеров. Их эффективность определяется требуемым объемом памяти программ и данных, а также ресурсами, необходимыми для поддержания объект­ного кода.

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

● ограниченным объемом памяти программ ( ROM ) и данных ( RAM );

● отсутствием BIOS или операционной системы;

● наличием переопределяемых выводов контроллеров (когда вывод может ис­пользоваться как цифровой/аналоговый/последовательный вход–выход).

Рассмотрим основные особенности и показатели языков высокого уровня применительно к микроконтроллерам.

Библиотеки и функции.

Функция — это подпрограмма, при выполнении ко­торой определенные параметры вызываются из исходной программы, а после за­вершения возвращаются обратно. Библиотека содержит набор функций (для ма­тематических операций, преобразования и пересылки данных, консольного вво­да–вывода и др.), скомпонованных в виде объектного файла. Встроенные (в стандартные подключаемые библиотеки) функции, необходи­мые для некоторых приложений, могут оказаться невостребованными для других. Вряд ли найдется приложение, использующее одновременно все функции стан­дартной библиотеки. Поэтому в микроконтроллерах, имеющих ограниченный объем памяти, использование стандартных библиотек может привести к неоправ­данным затратам памяти.

Функция стандартной библиотеки предварительно проверяет наличие обору­дования (и его характеристики) и только после этого выполняет заданные дей­ствия.

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

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

Типы данных и операции над данными.

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

Типы данных можно разделить на две категории: числовые и нечисловые. Числовые типы данных. Среди них главными являются целые двоичные числа со знаком и без знака. Для их представления обычно используется 8, 16, 32 и 64 бита. В целых числах со знаком старший разряд отводится под знак, по­этому значения N–разрядного числа лежат в пределах от –(2 N–1 – 1) до +(2 N–1 – 1), диапазон значений чисел без знака составляет 0…2 N – 1.

Читайте также:
Она говорила много такого чего не было в учебниках и программах сочинение

Для представления нецелых чисел (например, 4.5) используется две формы: с плавающей и фиксированной точкой. Их длина может составлять 32,64 и 80 бит.

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

Для представления десятичных чисел используется двоично–десятичный фор­мат, в котором для кодирования одного разряда отводится 4 или 5 бит. Для кор­рекции результатов десятичной арифметики используются специальные команды. Нечисловые типы данных. Для обработки текстов или управления базой данных необходимо использовать нечисловые типы данных. Для этой цели исполь­зуются такие символьные коды как ASCII или UNICODE , поддерживающие 7–бит­ные и 16–битные символы соответственно.

В микроконтроллерах широкое распространение получил целочисленный тип данных длиной 8 и 16 бит. Операции над числами, имеющими разрядность больше базовой (8 бит), часто реализуются с помощью библиотечных функций, которые увеличивают время выполнения и объем требуемой памяти.

Обработка 16–раз­рядных данных реализуется с помощью небольшого увеличения объема программ­ного кода и памяти данных. В тоже время 16–разрядные данные обеспечивают достаточно большой диапазон представления обрабатываемых данных. При пра­вильной организации вычислений обработка данных практически для всех встроенных приложений, использующих 8–разрядные микроконтроллеры, может быть выполнена с использованием 8–и и 16–и разрядных целых чисел. Обработка целочисленных данных. При обработке данных с разрядно­стью более 8 бит необходимо вводить дополнительные команды.

Рассмотрим операцию сложения, представленную в виде выражения на языке С: FirstVar = FirstVar + SecondVar Для 8–разрядных операндов эта операция выполняется микроконтроллером 8051 с помощью следующей последовательности команд: MOV A , FirstVar ;Поместить первую переменную FirstVar в ;аккумулятор А ADD A , SecondVar ;Содержимое А сложить со второй ;переменной SecondVar MOV FirstVar , А ;Сумму поместить в ячейку FirstVar Для 16–разрядных переменных программный код усложняется: MOV A , FirstVar ;Сложить младшие 8 бит ADD A, SecondVar MOV FirstVar, А INC SKIP ;Если перенос С не установлен, ;то пропустить увеличение INC FirstVar + 1 ;Увеличить старшие 8 бит результата SKIP MOV A , FirstVar + 1 ;Сложить старшие 8 бит ADD A, SecondVar + 1 MOV FirstVar + 1, А Для выполнения более сложных операций, программный код может быть реа­лизован с помощью ряда стековых операций. Например, для вычисления FirstVar = SecondVar + ( ThirdVar * FourthVar ) последовательность операций, обеспечивающих получение необходимого ре­зультата, имеет вид push SecondVar push ThirdVar push FourthVar mul add pop FirstVar Эти стековые операции обеспечивают получение необходимого результата.

Для некоторых компиляторов, процедура, описанная строкой, например: FirstVar = SecondVar + ( ThirdVar * Fourth Var ) более эффективно реализуется в виде следующей последовательности операций: Temp = ThirdVar * FourthVar; FirstVar = SecondVar + Temp; Еще одно возможное представление приведенного выше примера касается того, как компилятор преобразует числа и обрабатывает промежуточные пере­менные. Если переменная « FirstVar » не определена как порт ввода–вывода, то программный код можно представить в следующем виде: FirstVar = ThirdVar * Fourth Var; FirstVar = FirstVar + SecondVar; При таком представлении компилятор учитывает, что переменная FirstVar не используется при выполнении операции, и ее можно использовать для хранения промежуточных результатов.

Глобальные и локальные переменные.

Во многих языках высокого уровня существует два типа переменных:

● глобальные переменные, которые заданы для всей программы. Их значения не могут переопределяться. Они обычно используются в основном теле про­граммы и при выполнении многих подпрограмм, когда передача значения пе­ременной в качестве параметра подпрограммы не эффективна;

● локальные переменные используются при выполнении конкретной подпрог­раммы и создаются при обращении к ней. Обычно локальные переменные загружаются в стек при вызове подпрограммы и извлекаются из него при возвращении управления вызывающей программе. Значение локальной пере­менной теряется после выхода из подпрограммы. Параметры, передаваемые подпрограмме, в большинстве случаев становятся локальными переменными. При этом первоначальные значения параметров сохраняются, а текущие зна­чения при выполнении подпрограммы могут изменяться.

Указатели и структуры данных.

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

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

Например, структуру процессорной команды на языке С можно определить следующим образом: struct instruct < // Формат команды int address; // Адрес команды char instruct ; // Команда int value ; //16–битные данные >: Обычно на структуру ссылаются с помощью указателя, но те же данные можно поместить в массив 16 разрядных слов (целочисленные данные типа int на языке С) и ссылаться на него при помощи индекса.

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

Проиллюстрируем использование указателей и структур данных на конкрет­ном примере. При использовании указателя для выбора некоторой величины из области данных необходимый программный код имеет следующий вид: struct inst ruct * Ptr ; //Определение указателя на структуру.

; i = Ptr —> value ; / / Прочесть » value » из текущего элемента При организации массива эта процедура выглядит следующим образом: struct inst ruct Array[100]; //Определение массива структур.

; i = = Array [ Index ]. value ; Этот код немного сложнее кода с указателем, но в нем не используется указа­тель, за которым необходимо следить, чтобы он всегда корректно обращался к требуемому элементу структуры.

Другой распространенной структурой данных является таблица, которую мож­но представить как одномерный массив неизменяемых строк данных. В строке содержится информация о состоянии системы или сообщение для пользователя, например: char Greeting [13] = «Hello there I»; Компилятор языка размещает таблицы в памяти программ. Информация в таблице выбирается как массив, идентичный массивам, считываемым из опера­тивной памяти.

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

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

Оба способа поддерживаются языками высокого уровня.

Символическая информация.

Для упрощения отладки компиляторы выдают символическую информацию, представляющую собой ссылки на используемые строки, метки, переменные и указание на их размещение в памяти. Эта информа­ция используется симуляторами и эмуляторами, чтобы отображать выполнение программы на уровне исходного текста, а не на уровне машинного кода (ассемб­лера). Следует иметь в виду, что не все компиляторы выдают одинаковую символическую информацию. Это обстоятельство необходимо учитывать при вы­боре компилятора.

Из материала по языкам программирования следует, что:

● при программировании управляющих систем чаще всего используются ма­шинно–ориентированный язык ассемблера или языки С / С++. Язык ассемблера применяется при жестких ограничениях на объем требуемой памяти или на время выполнения программных модулей. Такие случаи являются достаточно типич­ными при решении задач управления, поэтому ассемблеры являются одним из основных средств создания программного обеспечения для микроконт­роллерных систем. В тех случаях, когда указанные ограничения не очень жес­ткие, для создания программного обеспечения используются языки высокого уровня (обычно С / С++);

● при разработке программного обеспечения для универсальных микропроцес­сорных систем используется достаточно широкий набор языков высокого уровня, для которых имеются соответствующие компиляторы. Чаще всего ис­пользуются языки С, С++, FORTRAN , Pascal , Forth . Для решения ряда задач применяются языки поддержки искусственного интеллекта Ada , Modula–2 и некоторые другие.

Источник: pue8.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru