MpLab, ASM, C, Building Для размещения обоих

У меня большой и солидный проект ASM для чипа PIC24. (Конкретный чип это PIC24FJ256GB210)

Теперь у меня есть некоторые другие процедуры в C.

Я хочу включить их в свой проект.

Процедуры C находятся в проекте из 5 или около того файлов, один из которых содержит int main(void) заявление в качестве отправной точки. Это было сделано с целью проверить их и дать нам уверенность в том, что они работают. Теперь мы готовы переместить этот код и включить его в существующую систему большего размера.

Материал на ассемблере начинается с __reset: инструкция.

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

  • Начни с моего __reset инструкция
  • (Или, по крайней мере, убедитесь, что мой существующий __reset и int main(void) хотя бы сотрудничать друг с другом)
  • Назовите его подпрограммы из кода ASM
  • Используйте те же буферы данных, которые устанавливает код C

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

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

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

2 ответа

Решение

Я рекомендую прочитать DS51284H ("РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ MPLAB® C ДЛЯ PIC24 MCU И DSCPIC® DSC") ( PDF).

В частности, смотрите раздел 4.4 ЗАПУСК И ИНИЦИАЛИЗАЦИЯ

"Два загрузочных модуля времени выполнения C включены в архив / библиотеку libpic30.a. Точкой входа для обоих модулей запуска является __reset. Сценарии компоновщика создают инструкцию GOTO __reset в месте 0 в памяти программ, которая передает управление при перезагрузке устройства,
....
5. Функция main вызывается без параметров."

Ваш __reset метка и тот, что в CRT (время выполнения C), может показаться конфликтующим. Если у вас есть источник для ЭЛТ, вы можете изменить его, переименовав __reset пометить в ЭЛТ что-то еще, чтобы ваш собственный __reset всегда называется первым.
Другое дело, что звучит так, будто вы хотите взять отдельную программу и использовать ее как библиотеку из вашей собственной программы. Поскольку автономные программы часто предназначены для выполнения одной или нескольких конкретных задач и завершения после завершения этой задачи, вы можете немного реорганизовать свой код C, чтобы сделать его более библиотечным (например, избавиться от main() функция и, возможно, заменить его каким-то init() функция).


И раздел 4.11 ФУНКЦИИ ВЫЗОВА КОНВЕНЦИИ.

"Первые восемь рабочих регистров (W0-W7) используются для параметров функции. Параметры назначаются для регистров в порядке слева направо, а параметр присваивается первому доступному регистру, который соответствующим образом выровнен.
....
Возвращаемые значения функции возвращаются в W0 для 8- или 16-битных скаляров, W1:W0 для 32-битных скаляров и W3:W2:W1:W0 для 64-битных скаляров."

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

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

Не в ваших интересах преобразовывать код C в сборку и иметь большой код сборки для поддержки, наоборот.

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

C: \... бла бла... \ Микрочип \MPLAB C30\src\dsp\include\dsp.h

содержит объявление функции в C для фактических функций сборки, расположенных в этой папке:

C: \... бла бла... \ Микрочип \MPLAB C30\src\dsp\asm

Вы можете начать с функции _VectorAdd: Vector Addition, файл "vadd.s"

Обратите внимание, что функция сборки _VectorAdd определена как VectorAdd в заголовочном файле.

Этот пример файлов для механизма DSP в DSPIC, что PIC24 не имеет. Но это все еще достаточно иллюстративно, чтобы извлечь этот принцип.

Другие вопросы по тегам