Перейти к содержанию
    

Пара вопросов по программированию

1. Несколько раз встречал в исходниках на ассемблере двойную инициализацию стека на старте, один раз до SEI, второй сразу после. Недавно стал изучать программирование C и встретил опять, посмотрев генерируемый код. Чем может быть обусловлена двойная инициализация?

 

2. Мне казалось, заглянув в исходник delay, я там сразу увижу реализацию на таймере, по крайней мере возможность выбора, но там только циклы. Пож. ответветте хотя бы одним предложением почему так (неэффективно? сложно для реализации? ... ).

Изменено пользователем white.wind

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Несколько раз встречал в исходниках на ассемблере двойную инициализацию стека на старте, один раз до SEI, второй сразу после. Недавно стал изучать программирование C и встретил опять, посмотрев генерируемый код. Чем может быть обусловлена двойная инициализация?

это ошибка! стек вообще нельзя инициализировать при включенных прерываниях...

1. Стек должен быть проиничен до любого прерывания

2. потому что регистры стека состоят из 2 8 битных, а операция должна быть атомарной.

 

2. Мне казалось, заглянув в исходник delay, я там сразу увижу реализацию на таймере, по крайней мере возможность выбора, но там только циклы. Пож. ответветте хотя бы одним предложением почему так (неэффективно? сложно для реализации? ... ).

 

А кто будет инициализировать таймер? Откуда компилер/библиотека знает какой таймер у вас свободен... в каком режиме он должен работать....

 

Я работаю с IAR там есть функция __delay_cycles() вставляет определенное число тактов задержки, (именно у AVR это реализовывается просто)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Несколько раз встречал в исходниках на ассемблере двойную инициализацию стека на старте, один раз до SEI, второй сразу после. Недавно стал изучать программирование C и встретил опять, посмотрев генерируемый код. Чем может быть обусловлена двойная инициализация?

 

2. Мне казалось, заглянув в исходник delay, я там сразу увижу реализацию на таймере, по крайней мере возможность выбора, но там только циклы. Пож. ответветте хотя бы одним предложением почему так (неэффективно? сложно для реализации? ... ).

1. Неизвестно. Возможно стартап слинкован из двух кусков который писали разные люди. Всегда делаю один раз. Этак можно в любой регистр по нескольку раз записывать.

2. Разработчики компилятора не имели возможности знать какой именно таймер свободен в вашем проекте, как он настроен или может он и занят но свободно одно из его прерываний. Написать универсальный код для этого невозможно. А через циклы - оно дает гарантированную задержку "не менее чем" и должно использоваться там где ошибка в задержке "плюс лапоть" некритична. Например при выводе на индикатор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, в голове прояснилось.

 

Относительно инициализации стека при компиляции C я похоже погарячился. Сейчас еще раз все посмотрел, действительно два раза, но не при разрешенных прерываниях. Исходники на ассемблере не нашел, в даташите все честно. Вобщем, показалось :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...