Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Вопрос по функциям в C

Ср окт 05, 2022 17:47:00

Всех приветствую. Прошу сильно не пинать новичка за такой вопрос) Вопрос в следующем: допустим есть две функции
1) Функция сложения двух чисел a и b
2) Функция вычитания двух чисел a и b
Я сделал 3-ю функцию, которая может как складывать так и вычитать два числа a и b. В этой функции используются 1-я и 2-я функции.
В итоге если мы зайдем во внутрь третьей функции (в ее реализацию), мы увидим что она состоит из 1-ой и 2-ой функции, но если мы будем заходить дальше, например в первую функцию и т.д. то мы дойдем до команд, верно? Так вот, написание функции начинается с команд, верно? Откуда эти команды берутся, как понимает компилятор (или может правильно сказать микроконтроллер) эти команды? Как образовано первоначало?

Re: Вопрос по функциям в C

Ср окт 05, 2022 18:00:40

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

Всё точно так же как в программах на компьютере, только доступ к железу не через операционную систему, а напрямую возможен.
Последний раз редактировалось VladislavS Ср окт 05, 2022 18:06:56, всего редактировалось 1 раз.

Re: Вопрос по функциям в C

Ср окт 05, 2022 18:02:34

Откуда эти команды берутся

Какие команды? Такого понятия в языке Си нет. Есть понятие операторов - арифметических, логических, операторов цикла, условия, перехода и т.п. Все эти операторы прописаны в документации языка. Книжка "Язык программирования Си" авторов Керниган, Ритчи - в помощь!
Далее, написанный нами текст по команде Build начинает анализироваться компилятором: он сканирует построчно каждую букву, каждое написанное слово или цифру, знак, сопоставляя со своими внутренними шаблонами (это называется "синтаксический разбор текста") и постепенно, шаг за шагом преобразует в машинные инструкции, понятные микроконтроллеру, а сопомощник компилятора - линкер - раскладывает блоки инструкций и данных в нужном порядке. Ну а микроконтроллер уже просто исполняет машинные инструкции, не задумываясь, что там было написано.

как понимает <...> микроконтроллер

А вот так:
в ячейке флеш-памяти хранится двоичное число [0000'1000'0100'0100] (или 0x0844 в хекс-виде), представляющее собой инструкцию сложения двух чисел, хранящихся в регистрах АЛУ (арифметико-логического устройства) микроконтроллера. Это число извлекается из флеша, декодируется и исполняется. Каждый бит этого числа устанавливает различные переключатели внутренней логики АЛУ, наподобие того, как работают путевые стрелки на огромной железнодорожной станции.
Машинная инструкция 0x0844 имеет текстовый эквивалент в понятной человеку форме и записывается на языке ассемблера так: add r0, r1. Ну а если брать язык Си, то показанная инструкция будет выполнять то же действие, что и арифметический оператор "+" сложения двух переменных. То есть, компилятор языка Си преобразовал оператор "+" в машинную инструкцию, показанную выше. И поскольку вариантов АРМ-инструкций довольно много, компилятор всегда учитывает не только оператор "+", но и то, что вокруг него стоит и выбирает наиболее подходящий вариант инструкции сложения, основываясь на заложенных в него шаблонах и алгоритмах преобразования.

Re: Вопрос по функциям в C

Ср окт 05, 2022 20:52:59

maksimdag0, про ассемблер почитай немножко!
Ответить