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 не имеет. Но это все еще достаточно иллюстративно, чтобы извлечь этот принцип.