Да.Vicont писал(а):что будет, если при использовании команды rcall не провести инициализацию стека?
тогда при выполнении подпрограммы адрес команды в ОЗУ может затереться другой информацией и программа уже не сможет к нему вернуться? верно?
Мелкие вопросы по МК и ПЛИС.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
В таком случае, если в дальнейшем вообще не предполагается работа с ОЗУ, на стеки можно вообще забить со спокойной совестью или все же лучше перестраховаться ?
Re: Мелкие вопросы по МК и ПЛИС.
Если не будут использоваться подпрограммы, тогда да. Если будут - то будет использоваться ОЗУ, и стек нужен.
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Я имею в виду, что подпрограммы использоваться то будут, но они не будут работать с ОЗУ в полном смысле этого слова (из всей ОЗУ будет использоваться лишь 1 регистр для хранения адреса основной программы, на котором началась подпрограмма).
Ведь если не инициализировать стек, то адрес команды должен прописаться в ОЗУ по дефолту и должен там храниться до тех пор пока не начнется вторая подпрограмма... (конечно, в том случае, если одна ПОДпрограмма не вложена в другую ПОДпрограмму)
По крайней мере, когда я испытывал в Шпротеусе, подпрограммы работали и без указания стека. Можно ли так делать в реале?
Ведь если не инициализировать стек, то адрес команды должен прописаться в ОЗУ по дефолту и должен там храниться до тех пор пока не начнется вторая подпрограмма... (конечно, в том случае, если одна ПОДпрограмма не вложена в другую ПОДпрограмму)
По крайней мере, когда я испытывал в Шпротеусе, подпрограммы работали и без указания стека. Можно ли так делать в реале?
Последний раз редактировалось Vicont Чт сен 06, 2012 12:11:18, всего редактировалось 1 раз.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
Нет. При вызывании подпрограмм нужно инициализировать стек.Vicont писал(а):Можно ли так делать в реале?
В противном случае вы рискуете вернуться из подпрограммы совсем не в то место.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Хорошо. Делать подпрограммы без стека больше не буду.
Но все равно не могу понять куда денется тот адрес команды???
На ум приходят 3 варианта ответа:
1. Он может прописаться по дефолту в тот регистр ОЗУ, где программа его не сможет найти.
2. Он может вообще не прописаться в ОЗУ.
3. Он пропишется в регистр ОЗУ по дефолту, но сотрется по какой-то непредвиденной причине, команда его сможет найти, но в нем будет уже совсем не тот адрес.
Но все равно не могу понять куда денется тот адрес команды???
На ум приходят 3 варианта ответа:
1. Он может прописаться по дефолту в тот регистр ОЗУ, где программа его не сможет найти.
2. Он может вообще не прописаться в ОЗУ.
3. Он пропишется в регистр ОЗУ по дефолту, но сотрется по какой-то непредвиденной причине, команда его сможет найти, но в нем будет уже совсем не тот адрес.
Последний раз редактировалось Vicont Чт сен 06, 2012 12:37:11, всего редактировалось 2 раза.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
Применительно к АВР...
Почти у всех АВРок по умолчанию указатель стека (SP) после ресета равен 0000.
Как известно, при вызове подпрограммы содержимое счётчика команд (РС) — адрес того места, из которого вызвана команда — 2 байта, сохраняется в стеке (на самом деле, РС+1 — адрес след. команды), следовательно получается SP = SP - 2.
Значит, при вызове подпрограммы первый байт адреса сохранится в R0 (ОЗУ с адресом 0000), а второй скорее всего пропадёт, т.к. я не припомню АВР с 64к ОЗУ (адрес FFFF). Возможно такое прокатит с МК, у которых однобайтный указатель стека и ровно 256 байт ОЗУ (включая РОН и РВВ).
Почти у всех АВРок по умолчанию указатель стека (SP) после ресета равен 0000.
Как известно, при вызове подпрограммы содержимое счётчика команд (РС) — адрес того места, из которого вызвана команда — 2 байта, сохраняется в стеке (на самом деле, РС+1 — адрес след. команды), следовательно получается SP = SP - 2.
Значит, при вызове подпрограммы первый байт адреса сохранится в R0 (ОЗУ с адресом 0000), а второй скорее всего пропадёт, т.к. я не припомню АВР с 64к ОЗУ (адрес FFFF). Возможно такое прокатит с МК, у которых однобайтный указатель стека и ровно 256 байт ОЗУ (включая РОН и РВВ).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Как адрес команды может сохраняться в разных регистрах ОЗУ? ведь к примеру в Tiny2313 ОЗУ состоит из 8-битных регистров, и если я правильно понимаю, адрес должен сохраняться целиком в одном регистре.Gudd-Head писал(а):Значит, при вызове подпрограммы первый байт адреса сохранится в R0 (ОЗУ с адресом 0000), а второй скорее всего пропадёт, т.к. я не припомню АВР с 64к ОЗУ (адрес FFFF). Возможно такое прокатит с МК, у которых однобайтный указатель стека и 256 байт ОЗУ.
Почему тогда в Шпротеусе такой код прокатывал?
Re: Мелкие вопросы по МК и ПЛИС.
Потму что шпрот это делал за Вас
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
Вот так. Он занимает 2 соседних байта, в которых младший и старший байты адресного слова.Vicont писал(а):Как адрес команды может сохраняться в разных регистрах ОЗУ?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Мелкие вопросы по МК и ПЛИС.
2 байта, кстати, независимо от размера ОЗУ. Если адрес однобайтовый, там старший просто равен нулю.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
Таки оно должно зависеть от резмера флэша (который у всех АВРок >= 512 байт), а не ОЗУ. Не?ploop писал(а):2 байта, кстати, независимо от размера ОЗУ.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Извиняюсь, я Вас не правильно понял, Вы говорили о байтах а я подумал, что о битах...Gudd-Head писал(а): Вот так. Он занимает 2 соседних байта...
Очевидно под двумя соседними байтами Вы имеете в виду SPH и SPL?
Но в статье пишут, применительно к AT90s2313:
Получается, если старшего байта в нем вообще нет, то и потеряться ведь он не может...В целях унификации кода для всех контроллеров, в 2313 у SPL оставили на конце букву L, хотя никакого SPH в данном контроллере нет и быть не может.
Re: Мелкие вопросы по МК и ПЛИС.
Я про указатель стека. У кого меньше 256 байт ОЗУ инициализируем только SPL, но SPH тоже есть, но всегда ноль,и на стек он попадает. А на стеке у нас адрес всегда двухбайтный.Таки оно должно зависеть от резмера флэша (который у всех АВРок >= 512 байт), а не ОЗУ. Не?
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
Нет. Видимо, вы путаете указатель стека (1 или 2 8-ми битных регистра) и сам стек — пространство статического ОЗУ.Vicont писал(а):Очевидно под двумя соседними байтами Вы имеете в виду SPH и SPL?
В ОЗУ сохраняются 2 байта счётчика команд (РС), содержимое указателя стека (SP) при этом уменьшается на 2.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Видимо... Потихоньку начинаю понимать.Gudd-Head писал(а):Видимо, вы путаете указатель стека и сам стек...
Разве AT90s2313 и ATTiny2313 нельзя отнести к их числу? В ведь по даташиту у них 128 байт SRAM + 32 РОН...Gudd-Head писал(а):Возможно такое прокатит с МК, у которых однобайтный указатель стека и ровно 256 байт ОЗУ (включая РОН и РВВ).
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
Я недаром написал "ровно". У 2313 ОЗУ заканчивается адресом 0хЕ0, в то время как МК будет пробовать запихнуть второй байт по адресу 0хFF.Vicont писал(а):Разве AT90s2313 и ATTiny2313 нельзя отнести к их числу? В ведь по даташиту у них 128 байт SRAM + 32 РОН...
Не говоря уже о том, что у 2313 стек инициализируется автоматически после сброса
Кстати, интересный момент. У ATTiny4313 ОЗУ заканчивается адресом 0х160, под стек (SRAM) выделены адреса с 0х060 по 0х160, а указатель стека 8-ми битный — только SPL
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Вобще-то у 2313 весь диапазон ОЗУ 0x00…0xDF (224 байта)...Gudd-Head писал(а):У 2313 ОЗУ заканчивается адресом 0хЕ0
Вы имеете в виду, что МК то запихнуть пробовать будет, а адрес 0хFF не входит в диапазон ОЗУ и он его запихнет неизвестно куда?МК будет пробовать запихнуть второй байт по адресу 0хFF.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Мелкие вопросы по МК и ПЛИС.
Мдя. Значит, в ДШ ATtiny2313A/4313 ошибка — написано что 128 байт SRAM имеют адреса 0x060 – 0x0E0Vicont писал(а):весь диапазон ОЗУ 0x00…0xDF (224 байта)...
Да. Именно так. Но это только предположения.МК то запихнуть пробовать будет, а адрес 0хFF не входит в диапазон ОЗУ и он его запихнет неизвестно куда?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Мелкие вопросы по МК и ПЛИС.
Ну, возможно я немного неправильно выразился. читая обучалку я имел в виду это:Gudd-Head писал(а):Мдя. Значит, в ДШ ATtiny2313A/4313 ошибка — написано что 128 байт SRAM имеют адреса 0x060 – 0x0E0![]()
Но адреса 0x0E0 там нет...Итак, мы имеем 128 байт оперативной памяти (ОЗУ).
Смотрим рисунок из даташита:
На нем изображена вся оперативная память, имеющаяся в контроллере. Она занимает диапазон значений $00…$DF , то есть – 224 байта.
Последний раз редактировалось Vicont Чт сен 06, 2012 14:25:21, всего редактировалось 2 раза.



