Вызов подпрограммы на С не отличается от вызова подпрограммы на ассемблере. Однако при вызове С/С++-функции следует учитывать, что она работает в соответствии с рассмотренными положениями функционирования среды выполнения. Поэтому, если вложенная asm-процедура в некоторых случаях (в частности, при запрещенных прерываниях) может вызываться таким же способом, как в программах на одном "чистом" ассемблере (без модулей на С и, следовательно, не поддерживающих среды выполнения), то для С-функции необходим код вызова/возврата, отвечающий всем без исключениям требованиям среды выполнения.
- вызов С-функции выполняется с использованием инструкции cjump (и связанных с ней);
- передача параметров осуществляется через регистры и через программный стек в соответствии с правилами передачи параметров в функции;
- значения Scratch-регистров могут быть свободно изменены C-функцией. Поэтому если они содержат важные значения, то перед вызовом "вложенной" функции следует их сохранить в стеке, а после возврата из подпрограммы – восстановить;
|
|
- С-функции не изменяют значения CallPreserved–регистров. Тем не менее, если CallPreserved-регистры модифицировались ассемблерной процедурой, целесообразно восстановить их исходные значения перед вызовом вложенной С-функции.
2.9. Использование библиотечных функций. Библиотеки C/C++ и DSP
В комплект поставки среды VisualDSP++ входят следующие основные run-time библиотеки:
- библиотеки C и C++ run time library, содержащие набор функций, ориентированных на базовые, низкоуровневые, системные операции и простейшие вычисления: работа с динамической памятью, работа со строками, базовые математические функции, диспетчер прерываний;
- библиотека DSP run time library, содержащая реализации базовых типовых алгоритмов цифровой обработки сигналов (преобразование Фурье, компандирование по А- и m-законам, свертка, работа с векторами и матрицами) и настройки некоторых системных параметров (управление таймером, настройка линий флагов);
- библиотека I/O library, поддерживающая стандартные возможности С по выводу/выводу данных (на консоль).
Описания функций каждой из этих библиотек содержится в нескольких заголовочных файлах. Для их использования достаточно подключить (#include) к программе соответствующий заголовочный файл: стандартный ldf-файл уже содержит пути и параметры поиска самих объектных библиотечных модулей. Каждая библиотека имеет собственную реализацию для ADSP21020, ADSP21060, ADSP21160 и выше.
Подробный перечень библиотечных функций приведен в руководстве по компилятору.
2.10. Написание собственных обработчиков прерываний на С/С++