Мелкие вопросы по МК и ПЛИС.

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Vicont писал(а):что будет, если при использовании команды rcall не провести инициализацию стека?
тогда при выполнении подпрограммы адрес команды в ОЗУ может затереться другой информацией и программа уже не сможет к нему вернуться? верно?

Да.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Vicont »

В таком случае, если в дальнейшем вообще не предполагается работа с ОЗУ, на стеки можно вообще забить со спокойной совестью или все же лучше перестраховаться ?
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ploop »

Если не будут использоваться подпрограммы, тогда да. Если будут - то будет использоваться ОЗУ, и стек нужен.
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Vicont »

Я имею в виду, что подпрограммы использоваться то будут, но они не будут работать с ОЗУ в полном смысле этого слова (из всей ОЗУ будет использоваться лишь 1 регистр для хранения адреса основной программы, на котором началась подпрограмма).
Ведь если не инициализировать стек, то адрес команды должен прописаться в ОЗУ по дефолту и должен там храниться до тех пор пока не начнется вторая подпрограмма... (конечно, в том случае, если одна ПОДпрограмма не вложена в другую ПОДпрограмму)
По крайней мере, когда я испытывал в Шпротеусе, подпрограммы работали и без указания стека. Можно ли так делать в реале?
Последний раз редактировалось Vicont Чт сен 06, 2012 12:11:18, всего редактировалось 1 раз.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Vicont писал(а):Можно ли так делать в реале?

Нет. При вызывании подпрограмм нужно инициализировать стек.
В противном случае вы рискуете вернуться из подпрограммы совсем не в то место.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Vicont »

Хорошо. Делать подпрограммы без стека больше не буду.

Но все равно не могу понять куда денется тот адрес команды???

На ум приходят 3 варианта ответа:
1. Он может прописаться по дефолту в тот регистр ОЗУ, где программа его не сможет найти.
2. Он может вообще не прописаться в ОЗУ.
3. Он пропишется в регистр ОЗУ по дефолту, но сотрется по какой-то непредвиденной причине, команда его сможет найти, но в нем будет уже совсем не тот адрес.
Последний раз редактировалось Vicont Чт сен 06, 2012 12:37:11, всего редактировалось 2 раза.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Применительно к АВР...
Почти у всех АВРок по умолчанию указатель стека (SP) после ресета равен 0000.
Как известно, при вызове подпрограммы содержимое счётчика команд (РС) — адрес того места, из которого вызвана команда — 2 байта, сохраняется в стеке (на самом деле, РС+1 — адрес след. команды), следовательно получается SP = SP - 2.
Значит, при вызове подпрограммы первый байт адреса сохранится в R0 (ОЗУ с адресом 0000), а второй скорее всего пропадёт, т.к. я не припомню АВР с 64к ОЗУ (адрес FFFF). Возможно такое прокатит с МК, у которых однобайтный указатель стека и ровно 256 байт ОЗУ (включая РОН и РВВ).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Vicont »

Gudd-Head писал(а):Значит, при вызове подпрограммы первый байт адреса сохранится в R0 (ОЗУ с адресом 0000), а второй скорее всего пропадёт, т.к. я не припомню АВР с 64к ОЗУ (адрес FFFF). Возможно такое прокатит с МК, у которых однобайтный указатель стека и 256 байт ОЗУ.

Как адрес команды может сохраняться в разных регистрах ОЗУ? ведь к примеру в Tiny2313 ОЗУ состоит из 8-битных регистров, и если я правильно понимаю, адрес должен сохраняться целиком в одном регистре.
Почему тогда в Шпротеусе такой код прокатывал?
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ILYAUL »

Потму что шпрот это делал за Вас
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Vicont писал(а):Как адрес команды может сохраняться в разных регистрах ОЗУ?

Вот так. Он занимает 2 соседних байта, в которых младший и старший байты адресного слова.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ploop »

2 байта, кстати, независимо от размера ОЗУ. Если адрес однобайтовый, там старший просто равен нулю.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

ploop писал(а):2 байта, кстати, независимо от размера ОЗУ.

Таки оно должно зависеть от резмера флэша (который у всех АВРок >= 512 байт), а не ОЗУ. Не?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Vicont »

Gudd-Head писал(а):Вот так. Он занимает 2 соседних байта...
Извиняюсь, я Вас не правильно понял, Вы говорили о байтах а я подумал, что о битах... :oops:
Очевидно под двумя соседними байтами Вы имеете в виду SPH и SPL?

Но в статье пишут, применительно к AT90s2313:
В целях унификации кода для всех контроллеров, в 2313 у SPL оставили на конце букву L, хотя никакого SPH в данном контроллере нет и быть не может.
Получается, если старшего байта в нем вообще нет, то и потеряться ведь он не может... :roll:
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение ploop »

Таки оно должно зависеть от резмера флэша (который у всех АВРок >= 512 байт), а не ОЗУ. Не?

Я про указатель стека. У кого меньше 256 байт ОЗУ инициализируем только SPL, но SPH тоже есть, но всегда ноль,и на стек он попадает. А на стеке у нас адрес всегда двухбайтный.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Vicont писал(а):Очевидно под двумя соседними байтами Вы имеете в виду SPH и SPL?

Нет. Видимо, вы путаете указатель стека (1 или 2 8-ми битных регистра) и сам стек — пространство статического ОЗУ.
В ОЗУ сохраняются 2 байта счётчика команд (РС), содержимое указателя стека (SP) при этом уменьшается на 2.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Vicont »

Gudd-Head писал(а):Видимо, вы путаете указатель стека и сам стек...

Видимо... Потихоньку начинаю понимать.

Gudd-Head писал(а):Возможно такое прокатит с МК, у которых однобайтный указатель стека и ровно 256 байт ОЗУ (включая РОН и РВВ).
Разве AT90s2313 и ATTiny2313 нельзя отнести к их числу? В ведь по даташиту у них 128 байт SRAM + 32 РОН...
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Vicont писал(а):Разве AT90s2313 и ATTiny2313 нельзя отнести к их числу? В ведь по даташиту у них 128 байт SRAM + 32 РОН...

Я недаром написал "ровно". У 2313 ОЗУ заканчивается адресом 0хЕ0, в то время как МК будет пробовать запихнуть второй байт по адресу 0хFF.
Не говоря уже о том, что у 2313 стек инициализируется автоматически после сброса :wink:


Кстати, интересный момент. У ATTiny4313 ОЗУ заканчивается адресом 0х160, под стек (SRAM) выделены адреса с 0х060 по 0х160, а указатель стека 8-ми битный — только SPL :roll:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Vicont »

Gudd-Head писал(а):У 2313 ОЗУ заканчивается адресом 0хЕ0
Вобще-то у 2313 весь диапазон ОЗУ 0x00…0xDF (224 байта)...
МК будет пробовать запихнуть второй байт по адресу 0хFF.
Вы имеете в виду, что МК то запихнуть пробовать будет, а адрес 0хFF не входит в диапазон ОЗУ и он его запихнет неизвестно куда?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Gudd-Head »

Vicont писал(а):весь диапазон ОЗУ 0x00…0xDF (224 байта)...

Мдя. Значит, в ДШ ATtiny2313A/4313 ошибка — написано что 128 байт SRAM имеют адреса 0x060 – 0x0E0 :)))
МК то запихнуть пробовать будет, а адрес 0хFF не входит в диапазон ОЗУ и он его запихнет неизвестно куда?

Да. Именно так. Но это только предположения.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Vicont
Прорезались зубы
Сообщения: 201
Зарегистрирован: Пт июл 25, 2008 14:09:04
Откуда: Зауралье
Контактная информация:

Re: Мелкие вопросы по МК и ПЛИС.

Сообщение Vicont »

Gudd-Head писал(а):Мдя. Значит, в ДШ ATtiny2313A/4313 ошибка — написано что 128 байт SRAM имеют адреса 0x060 – 0x0E0 :)))


Ну, возможно я немного неправильно выразился. читая обучалку я имел в виду это:
Итак, мы имеем 128 байт оперативной памяти (ОЗУ).
Смотрим рисунок из даташита:
Изображение
На нем изображена вся оперативная память, имеющаяся в контроллере. Она занимает диапазон значений $00…$DF , то есть – 224 байта.
Но адреса 0x0E0 там нет... :roll:
Последний раз редактировалось Vicont Чт сен 06, 2012 14:25:21, всего редактировалось 2 раза.
Ответить

Вернуться в «Разные вопросы по МК»