|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Меню:
Главная
Форум
Литература: Программирование и ремонт Импульсные блоки питания Неисправности и замена Радиоэлектронная аппаратура Микросхема в ТА Рубрикатор ТА Кабельные линии Обмотки и изоляция Радиоаппаратура Гибкие диски часть 2 часть 3 часть 4 часть 5 Ремонт компьютера часть 2 Аналитика: Монтаж Справочник Электроника Мощные высокочастотные транзисторы 200 микросхем Полупроводники ч.1 Часть 2 Алгоритмические проблемы 500 микросхем 500 микросхем Сортировка и поиск Монады Передача сигнала Электроника Прием сигнала Телевидиние Проектирование Эвм Оптимизация Автомобильная электроника Поляковтрансиверы Форт Тензодатчик Силовые полевые транзисторы Распределение частот Резисторные и термопарные Оберон Открытые системы шифрования Удк |
[6] movlw low 01234h movwf btemp movlw high 01234h movwf btemp+1 return Значения - структура Если функция возвращает структуру или объединение (struct, union) размером менее 4 байт, то результат упаковывается как 16-и или 32-х битное значение (см. ранее). Если размер результата превышает 4 байта, то он копируется в специально отведенную область памяти: struct fred int ace[4]; struct fred return struct(void) struct fred wow; return wow; В результате компиляции будет получен следующий код: movlw ?a return struct+0 movwf 4 movlw structret movwf btemp movlw 8 GLOBAL structcopy lcall structcopy return 5.5 Вызов функции Как можно использовать С для процессоров начального уровня лично я не представляю, поэтому и освещать это извращение не буду. В контроллерах среднего и крутого уровня наличествует стек возвратов нормального размера (или около того), что уже делает допустимым полноценное использование процедурных языков программирования, но никак не объектно-ориентированных! Локальные переменные С поддерживает два класса локальных переменных: автоматические переменные, память под которые выделяется динамически из нулевого банка, и статические переменные, которые всегда располагаются в фиксированных адресах памяти. Автоматические переменные По умолчанию все переменные, описанные в теле функции относятся к этому классу. Исключение составляют те переменные в описании которых явно присутствует ключевое слово static. К автоматическим переменным не могут применяться квалификаторы, так как отсутствует контроль над выделением памяти. Исключение составляют только такие квалификаторы как const и volatile. Все автоматические переменные располагаются в нулевом банке памяти. Каждая функция имеет собственную область памяти в которой размещаются автоматические переменные. Эти области могут пересекаться для функций, которые, по мнению компоновщика, никогда не вызываются одновременно. Статические переменные Статические переменные всегда располагаются в фиксированных адресах памяти и никогда не пересекаются с другими областями. При этом, они могут быть непосредственно доступны только из той функции, в которой описаны. Хотя к ним можно получить косвенный доступ из любого места программы, воспользовавшись указателями. Для статических переменных гарантируется сохранение их значения между вызовами функции. Исключение составляет случай косвенного изменения содержимого статической переменной с помощью указателя. Статические переменные, которые инициализируются в описании, реально инициализируются только один раз, при запуске программы. В этом смысле они отличаются от автоматических переменных, которые инициализируются при каждом вызове функции. 5.6 Управление запуском программы Далее идет довольно сложный фрагмент в котором объясняются принципы запуска программы при подаче питания. При запуске должны выполняться некоторые служебные процедуры связанные с инициализацией переменных, выделением и распределением памяти, настройкой системы. Стартовым адресом программы является младший адрес (0х0). В этой точке располагается вызов служебной функции, которая собственно и занимается инициализацией. После общей инициализации вызывается функция main(). Имеется в виду имя функции с точки зрения ассемблерного кода. В тексте С-программы эта функция описывается как main(). Стартовый код находится в стандартном модуле в каталоге lib и называется picrtXXX.obj. Исходный код модуля находится в каталоге sources и называется picrt66x.as. Кроме этого, могут потребоваться процедуры копирования данных или очистки памяти. Исходные тексты этих дополнительных функций вы также можите найти в каталоге sources, например clrbank0.as или cpybank1.as. Некоторые устройства требуют специальной инициализации при подаче питания. Для реализации этих специальных функций нет необходимости изменять стандартные модули. Компилятор PICC предусматривает возможность выполнения при запуске программы действий необходимых в подобной ситуации. Программист должен создать специальный ассемблерный модуль, который будет выполняться непосредственно после рестарта или подачи питания. Обычно этот модуль внедряют непосредственно файл с С-программой. Пустая процедура запуска (заглушка) находится в файл powerup.as. Этот файл может быть скопирован в ваш проект, модифицирован и использоваться в дальнейшем в качестве исходного кода вашей процедуры запуска. В этом случае она заменит собой процедуру принятую по умолчанию. При написании собственной процедуры запуска необходимо иметь в виду следующие обстоятельства: минимально использовать память, а лучше вообще не использовать; перед использованием любых системных ресурсов, они должны быть проверены и подключены. Вот пример стандартной процедуры запуска: GLOBAL powerup,start PSECT powerup,class=CODE,delta=2 powerup ljmp start По сути своей процедура запуска должна быть маленького размера. Это требование обусловлено еще и физическим расположением кода. Дело в том, что процедура запуска размещается в непосредственной близости вектора прерываний. Увеличение размера процедуры может привести к конфликту с обработчиком прерываний. Если, все таки, возникает необходимость написание большой процедуры запуска, то избежать конфликта поможет следующая техника: GLOBAL powerup,start,big powerup PSECT powerup,class=CODE,delta=2 powerup ljmp big powerup PSECT big powerup,class=CODE,delta=2 big powerup powerup code ljmp start 5.7 Директивы компилятора Любой солидный компилятор содержит, так называемый, препроцессор, который делает возможным использовать такие необходимые технологии как макросы, условная компиляция и проч. Такой препроцессор имеется и в PICC. Давайте рассмотрим, какие команды (директивы) могут выполняться этим препроцессором (см. таблицу 6). Таблица 6 Директивы препроцессора
|
Среды: Smalltalk80 MicroCap Local bus Bios Pci 12С ML Микроконтроллеры: Atmel Intel Holtek AVR MSP430 Microchip Книги: Емкостный датчик 500 схем для радиолюбителей часть 2 (4) Структура компьютерных программ Автоматическая коммутация Кондиционирование и вентиляция Ошибки при монтаже Схемы звуковоспроизведения Дроссели для питания Блоки питания Детекторы перемещения Теория электропривода Адаптивное управление Измерение параметров Печатная плата pcad pcb Физика цвета Управлении софтверными проектами Математический аппарат Битовые строки Микроконтроллер nios Команды управления выполнением программы Перехода от ahdl к vhdl Холодный спай Усилители hi-fi Электронные часы Сердечники из распылённого железа Анализ алгоритмов 8-разрядные КМОП Классификация МПК История Устройства автоматики Системы и сети Частотность Справочник микросхем Вторичного электропитания Типы видеомониторов Радиобиблиотека Электронные системы Бесконтекстный язык Управление техническими системами Монтаж печатных плат Работа с коммуникациями Создание библиотечного компонента Нейрокомпьютерная техника Parser Пи-регулятор ч.1 ПИ-регулятор ч.2 Обработка списков Интегральные схемы Шина ISAВ Шина PCI Прикладная криптография Нетематическое: Взрывной автогидролиз Нечеткая логика Бытовые установки (укр) Автоматизация проектирования Сбор и защита Дискретная математика Kb радиостанция Энергетика Ретро: Прием в автомобиле Управление шаговым двигателем Магнитная запись Ремонт микроволновки Дискретные системы часть 2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||