Так вот и я про то же: никто не мешает компилятору иметь ДВА стека
Как раз с двумя стеками проблем больше. Сейчас компилятор знает по какому адресу находятся переменные, а по какому - адреса возврата и умеет их прекрасно отслеживать, никаких проблем с этим не возникает. Проблема может возникнуть если не хватит стека - его размер знает линкер, а при компиляции невозможно узнать требуемый размер. Но два стека не решат её. А наоборот, усугубят - ведь переполнится может и тот, и другой.
К сожалению у большинства процессоров память одна и два твоих стека всё равно будут в одной памяти, а значит никто не помешает одному стеку изуродовать другой. Да и проблема эта какая-то надуманная: со стеком работает не программист, а компилятор, а он прекрасно помнит где у него переменные, а где адрес возврата.
Странно, кто-то не согласен с этим очевидным утверждением. Скажу больше: писать if (x == true) недопустимо! Потому что x может оказаться не bool, а у неё истинное значение может быть любым кроме 0.
Причина ошибки в коде на картинке заключается в том, что булевские переменные не требуется сравнивать. Они же булевские! У них даже название сделано таким чтобы можно было написать if (IsCrasyMurderingRobot)
Вы наверное плохо понимаете американскую политику, раз рассуждаете так примитивно. Демократы в США - это леваки, они считают, что нужно обдирать капиталистов и за счёт них кормит убогих: негров, бедных и всех кто не хочет работать. А республиканцы считают, что каждый должен зарабатывать сам.
Конечно нет, так же как нет регистра состояния и бита готовности. Я писал про модуль CORDIC, который есть в этом микроконтроллере. И про его быстродействие. И проверять это можно на чём угодно.
FPU-то там есть, но синуса нет. А библиотечная функция в итоге работает медленнее, чем CORDIC. И, как было справедливо замечено, float - это костыль, который программисты используют когда до конца не понимают алгоритм. Ведь результат вычисления синуса нужен в конечном итоге для записи в таймер очередного значения ШИМ, или для регистров другой периферии, но в любом случае это будет целое. Тогда зачем нужны лишние преобразования?
Я проверял скорость вычисления синуса на STM32G474. Там в регистр аргумента записывается угол, после чего в регистре состояния нужно ждать появления бита готовности. Я в цикле ожидания инкрементировал переменную чтобы узнать да сколько циклов вычислится синус. Так вот, количество циклов равно нулю! То есть бит готовности появляется практически сразу.
Как раз с двумя стеками проблем больше. Сейчас компилятор знает по какому адресу находятся переменные, а по какому - адреса возврата и умеет их прекрасно отслеживать, никаких проблем с этим не возникает. Проблема может возникнуть если не хватит стека - его размер знает линкер, а при компиляции невозможно узнать требуемый размер. Но два стека не решат её. А наоборот, усугубят - ведь переполнится может и тот, и другой.
К сожалению у большинства процессоров память одна и два твоих стека всё равно будут в одной памяти, а значит никто не помешает одному стеку изуродовать другой. Да и проблема эта какая-то надуманная: со стеком работает не программист, а компилятор, а он прекрасно помнит где у него переменные, а где адрес возврата.
Странно, кто-то не согласен с этим очевидным утверждением. Скажу больше: писать if (x == true) недопустимо! Потому что x может оказаться не bool, а у неё истинное значение может быть любым кроме 0.
Я видел много проблем при использовании автомобилей, включая летальные. Но это не причина чтобы не пользоваться автомобилями.
Причина ошибки в коде на картинке заключается в том, что булевские переменные не требуется сравнивать. Они же булевские! У них даже название сделано таким чтобы можно было написать if (IsCrasyMurderingRobot)
Вы наверное плохо понимаете американскую политику, раз рассуждаете так примитивно. Демократы в США - это леваки, они считают, что нужно обдирать капиталистов и за счёт них кормит убогих: негров, бедных и всех кто не хочет работать. А республиканцы считают, что каждый должен зарабатывать сам.
Шпак - украинское слово, в переводе означает скворец
Нет разницы?! А почему же между ними идёт такая ожесточённая борьба, порой скатываясь чуть ли не до криминала?
С практической точки зрения важно лишь через какое время после записи угла будет готов результат.
Конечно нет, так же как нет регистра состояния и бита готовности. Я писал про модуль CORDIC, который есть в этом микроконтроллере. И про его быстродействие. И проверять это можно на чём угодно.
FPU-то там есть, но синуса нет. А библиотечная функция в итоге работает медленнее, чем CORDIC. И, как было справедливо замечено, float - это костыль, который программисты используют когда до конца не понимают алгоритм. Ведь результат вычисления синуса нужен в конечном итоге для записи в таймер очередного значения ШИМ, или для регистров другой периферии, но в любом случае это будет целое. Тогда зачем нужны лишние преобразования?
Я проверял скорость вычисления синуса на STM32G474. Там в регистр аргумента записывается угол, после чего в регистре состояния нужно ждать появления бита готовности. Я в цикле ожидания инкрементировал переменную чтобы узнать да сколько циклов вычислится синус. Так вот, количество циклов равно нулю! То есть бит готовности появляется практически сразу.
Проблема во времени. Как тут уже справедливо заметили - если всё продумывать до конца, то реализации можно и не дождаться.
Практически все проекты, которые я делал в своей жизни, я начинал не продумав их до конца. Достаточно понять, что это принципиально реализуемо.
Когда я слышу "по ГОСТу", мне хочется хвататься за пистолет