2016-02-23 4 views
-1

Я прочитал пару встроенных проектов, и во всех них загрузчик написан на сборке вместо C. Есть ли причина для этого?Почему загрузчики находятся в сборке?

+1

Это вопрос, который лучше подходит для сайта переполнения стека программ, а не для переполнения стека. – AntonH

+0

Вы ошибаетесь! – Olaf

+0

Я написал 3 загрузчика в C. 0 в сборке. Легче поддерживать. [Пример жесткого кода] (http://stackoverflow.com/q/17070973/2410359) – chux

ответ

6

Часто, по крайней мере, заглушка точки входа и, возможно, переход к реальному ядру должны быть записаны в сборке, потому что они связаны с ограничениями управления и передачи вызовов, которые не могут быть представлены в C. Например, если загрузка загрузчик должен инициализировать указатель стека, чтобы указать на ram до того, как стек будет использоваться, это не может быть представлено на C без неудобных расширений компилятора. Однако, как правило, можно сохранить сумму, написанную в asm очень маленькой и изолированной от этих типов границ. Если остальная часть загрузчика написана в asm тоже, это обычно признак того, что автор плохо оценил затраты (обслуживание, ошибки и т. Д.) И преимущества (возможно, меньший размер).

+0

FWIW, микроконтроллеры Cortex на самом деле ничего не нужны в сборке. Ядро принимает первое слово таблицы векторов и использует это как указатель стека. Затем он переходит ко второму слову. Оттуда вы можете в значительной степени делать все в C (даже писать ядра переключения задач) –

+0

@RussSchultz: Это не совсем правильно. Вы говорите о Cortex-M. Cortex-A и R - еще более старый способ (я бы хотел, чтобы они не были). Для Cortex-M вы можете написать весь код на C с помощью встроенных CMSIS, вы не совместимы с C без сброса. Простая причина - глобальные переменные не инициализируются в соответствии с требованиями стандарта C. Таким образом, исходный код (код запуска) не может полагаться на это, но должен правильно настроить операционные переменные для полностью совместимого кода C (т. Е. 'Main' или независимо от того, что называется главной точкой входа). – Olaf

+0

@Olaf Я не буду утверждать, что он полностью готов к C или C++, но вы можете написать код запуска на C, если хотите. Вам просто нужно знать, что глобальные переменные области не будут настроены, если они не будут const (по крайней мере, с инструментами Keil, проверьте поведение этих инструментов). Однако многие люди пишут код запуска, поскольку он предоставляется инструментами и поставщиками чипов. –

3

Чтобы сделать это как можно меньше. Вы не хотите, чтобы загрузчик занимал все пространство, которое вы могли бы использовать для вашей реальной программы, а в некоторых микросхемах пространство памяти, зарезервированное для загрузчика, относительно невелико. Такие небольшие программы по-прежнему являются жизнеспособной целью ручной оптимизации в Assembly.

Возможно, вы, возможно, довольно близко подошли к C.