Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Решенные оветы на теорию Си.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
166.91 Кб
Скачать

Пример использования

#include <stdio.h> #include <assert.h> int main (void) { FILE *fd; fd = fopen ("/home/user/file.txt", "r"); assert (fd); fclose (fd); return 0; }

В данном примере макрос assert() сработает в случае, если функция fopen() выполнится с ошибкой.

В C++ конструкция try-catch-throw

  • try (пытаться) - начало блока исключений;

  • catch (поймать) - начало блока, "ловящего" исключение;

  • throw (бросить) - ключевое слово, "создающее" ("возбуждающее") исключение.

void func() { try { throw 1; } catch(int a) { cout << "Caught exception number: " << a << endl; return; } cout << "No exception detected!" << endl; return; }

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

Caught exception number: 1

Если закоммментировать строку throw 1; и функция выдаст такой результат:

No exception detected!

15. Интеграция программ. Использование ассемблерных вставок, вставок для мк. Си-код для гаджетов.

Ассемблерные вставки - это вставки в процедуры си ассемблерного кода.

Оформление:

main()

{

__asm{

// ассемблерный код

}

}

Вставки для МК.

Управление и контроль работы микроконтроллера и его отдельных внутренних модулей осуществляется путём записи и чтения специальных ячеек-регистров в служебной области памяти ОЗУ - регистров специального назначения (Special Function Register, далее просто SFR).

Основная идея, позволяющая использовать Си для программирования микроконтроллеров, такова: регистры специального значения являются такими же переменными языка Си, как и объявленные пользователем. Этим переменным можно присваивать значения, управляя работой микроконтроллера, или считывать их, получая таким образом информацию о его текущем состоянии. Объявлять регистры микроконтроллера подобно пользовательским переменным не нужно по нескольким причинам. Во-первых, их размер заранее известен: в Си для AVR это беззнаковые 8-разрядные переменные. Во-вторых, SFR имеют строго определённые имена и адреса в памяти, являясь так называемыми регистрами ввода-вывода.

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

В начале любой программы на Си мы можем видеть строки типа:

#include "file1.h" // Включить в код содержимое файла "file1.h".

Разработчик может создавать собственные h-файлы и помещать их, учитывая содержимое, в любое место программы. Однако, чтобы познакомить программу с SFR для данного типа микроконтроллера, необходимо подключать вполне конкретные заголовочные файлы. Их имена и количество зависит от конкретной среды разработки и типа используемого микроконтроллера, так, например, в IAR для Atmega64 достаточно прописать строки:

#include "iom64"

#include "inavr.h"

Управление работой микроконтроллера в большинстве случаев сводится к следующему простому набору действий с его регистрами:

1. Запись в регистр необходимого значения.

2. Чтение значения регистра.

3. Установка в единицу нужных разрядов регистра.

4. Сброс разрядов регистра в ноль.

5. Проверка разряда на логическую единицу или логический ноль.

6. Изменение логического состояния разряда регистра на противоположное.

Во всех указанных действиях принимает участие оператор присваивания языка Си, записываемый в виде знака равенства.

Си-код для гаджетов.

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

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

Регистры и битовые поля представлены в виде структур данных. Для инициализации и изменения регистров (структур) используются Си-функции или макросы.

Регистры периферийного устройства подключаются при помощи директив #define и #include