Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » FAQ по Bascom AVR и МК » $hwstack - $swstack - $framesize - подскажите новичку.


$hwstack - $swstack - $framesize - подскажите новичку.

Сообщений 1 страница 21 из 21

1

Осваиваю БАСКОМ. Не могу понять для чего необходимо определять значения $hwstack - $swstack - $framesize и чтоэто за переменные ?
Для примера пользую мегу 32, какие значения надо выставить. По справке БАСКОМа ничего не понял.

0

2

(Примечание переводчика: стековый фрейм - область памяти, выделяемая всякий раз, когда вызывается функция. Предназначается для временного хранения аргументов и локальных переменных функции)

Команды изменения параметров компиляции

Аппаратный стек
Описывает количество байт, отведенных для аппаратного стека. Когда вы используете команды CALL или GOSUB в стеке запоминаются по два байта.
Когда вы используете две команды GOSUB, в стеке запоминаются 4 байта. Некоторые из инструкций также используют стек. При использовании прерываний в стеке сохраняется 32 байта.

Программный стек
Описывает размер программного стека.
Каждая локальная переменная использует 2 байта. Каждая переменная, используемая в подпрограмме, также использует 2 байта. Если вы использовали 10 переменных в подпрограмме и 3 параметра было передано в подпрограмму, то вам необходимо:
13 * 2 = 26 байт

Размер фрейма
Описывает размер фрейма
Каждая локальная переменная запоминается в области памяти, которая называется 'фрейм'
Когда вы имеете 2 локальных переменных и символьную переменную длиной 10 символов, необходим фрейм размером (2*2) + 11 = 15 байт

Также фрейм используют подпрограммы конвертации типов переменных, такие как STR() или VAL() и подобные им. Это бывает, когда вы используете команды INPUT [числовая переменная] или PRINT [числовая переменная]

При это используется не более 16 байт памяти фрейма. Т.е, в нашем случае получим наилучшее значение размера фрейма равное 15+16 = 31 байт

+3

3

а кикае могут быть проблемы если не прописывать размеры стека и фрейма? я обхожусь без этих строк и все вроде работает :tomato:

0

4

в программе можно даже не прописывать имя контроллера и частоту. Тогда компилятор будет брать всё из настроек :flag:

0

5

крайне НЕ советую делать через Меню настроек (Визард, волшебник)!!!
Во-первых, код делается очень ненаглядным: приходится постоянно в Меню настроек залезать и смотреть что и как настроено
В-вторых, все настройки хранятся НЕ в файле программы, а во внешнем файле. Когда будете передавать\выкладывать свою программу придется и файл настроек давать, ибо без него - сыромятина, а не source - "сырец, исходное"

0

6

Александр Д. написал(а):

Когда вы используете две команды GOSUB, в стеке запоминаются 4 байта

Это если они вложенные, а не находящиеся на одном уровне.

0

7

Читаем А.В.Евстифеев "Во всех микроконтроллерах семейства Mega стек реализован программно. Он размещается в памяти данных, и его глубина определяется только размером свободной области памяти программ." Тогда вопрос - для чего необходимо определять параметры аппаратного и программного стека?

0

8

это надо компилятору
я же выше дал информацию из справочной системы!

0

9

Спасибо за ответ попробую разобраться.

0

10

AleksanderG написал(а):

Во всех микроконтроллерах семейства Mega стек реализован программно.

Нет, он аппаратный, но располагается в ОЗУ!

AleksanderG написал(а):

Тогда вопрос - для чего необходимо определять параметры аппаратного и программного стека?

Что знать сколько памяти зарезервировать под стеки чтобы они не попортили друг-друга и произошло перекрытие с областью переменных.

0

11

Александр Д.
Спасибо за разъяснения. Но хотел попроситвсе таки помочь на спичках -) Вот мои переменные
Dim I As Byte
Dim Nr As Byte
Dim Addrlo As Byte
Dim Adcnum As Byte
Dim Myrom(8) As Byte ,
Myrom55(8) As Byte
Dim Pio(8) As Byte       
Dim Ad_result As Byte       
Dim Bytedat As Byte       
Dim Bitdat As Bit       
Dim Piocom As Byte ,
Piocominv As Byte ,
Piocominvm As Byte
Dim B As Byte 
Dim H As Byte , E As Byte       
Dim M As Byte
Всего 16 переменных - значит минимум 32 байта? А что за передачи переменных - я наверно в терминологии путаюсь.

0

12

не понял Вашего примера
При чем тут резервирование памяти и стек?
Стек будет задействован при передаче параметров в подпрограмму

0

13

Александр Д.
Следующее - у меня в програме 16 раз используется GOSUB, как быть здесь? 16 *2 = 32? они не вложенные . Плюс переодически наступает прерывание от таймера - еще 32? Итого 64?

0

14

Александр Д. написал(а):

не понял Вашего примера
При чем тут резервирование памяти и стек?
Стек будет задействован при передаче параметров в подпрограмму

Это Вы мне?

0

15

в стеке будет (как я понял) кол-во вложенных подпрограмм умножить на 2 и умножить на кол-во передаваемых в них переменных

я еще в ассме не смотрел, что и как творит баском... надо заняться, а то уже дважды были глюки из-за выделения памяти

0

16

Александр Д. написал(а):

в стеке будет (как я понял) кол-во вложенных подпрограмм умножить на 2 и умножить на кол-во передаваемых в них переменных

Слова русские, но не понял. Простите за не осведомленность.

Вложенные подпрограммы это когда условием одного перехода, является другой, потом третий и т д. ?
Не вложенные, это когда выполнился один переход, что то исполнилось , завершилось и потом другой. Правильно?
Надо почитать, только вот что? Не подскажете? Перешел с м32 на 2313 и работает несколько циклов , потом зависает. Ресетом чик опять пашет. Что то обнулять надо, знать бы что и как.

0

17

Разобрался - привожу на примере своей проги и Тини 2313. Можно конечно сделать и как то иначе, но у меня сработало, думаю и у остальных.
Итак память ОЗУ в 2313 размер 128 байт организована и размещается так.

Код:
60: 09 00 00 00 65 3A 14 C5 B8 00 00 00 65 00 00 00 00 00 00 00 
74: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
88: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
9C: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
B0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
C4: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
D8: 00 00 00 00 06 76 00 63

Мои пременные я решил разместить по порядку с начала ОЗУ ( их у меня 14+ 3 массива по 8) - адрес &H60 (обратите внимание на синтаксис)
Да и еще хотел пояснить, для тех кто как я, не все понимает ;-) Адреса считаются так - например в строке с адресом &H60 - это первый байт , а нем размещено 09. А там где размещено 65 это уже ячейка ( байт ) с адресом &H64 и дальше по аналогии. C ноля до D. Запись о размещении переменной делается так Dim I As Byte At &H60, для массива Dim Myrom(8) As Byte At &H65 , следующая переменная уже с учетом длины массива Dim Myrom55(8) As Byte At &H6D . И так по порядку , проверяя требуемое количество байтов, для каждой переменной, дружненько их размещаем. Сразу оговорюсь, я не знаю как себя поведут переменные объявленные где то в подпрограммах, надеюсь кто то дополнит.
теперь смотрим ячейку DD. Вообще мрак. Это я так понимаю и есть стек. Он начинает заполнять байты-ячейки памяти с конца и вверх. Причем если не задать жестко размер и начальный адрес, то он у меня рос вверх , заполнял собой все ОЗУ и вырубал всю программу. Что бы этого избежать прописываем , что то типа этого SPL = &HDF( у Тини нет SPH , а у Мег уже есть, тогда надо распределять адреса для обоих). Этот пример для Тини 2313. Когда я прогнал в Протеусе, оказалось что для моей проги хватает стека в 8 байт, сделал 16, так как место осталось , работает. Да и еще, при распределнии места, это я гдето вычитал, следует учитывать, что $hwstack $swstack $framesize сумируются ( инфа не проверенная). Предлагаю свои находки со стеком публиковать здесь. А то три дня работы мозга :-)

Отредактировано nsl (2011-03-21 08:55:48)

0

18

Вот тогда прошу тоже расписать на пальцах:

Код:
 $regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 32
$swstack = 8
$framesize = 24
Config Portb = Output
Dim A As Byte

Do
Loop
End

пишет ошибку типа у нас нет для вас места %-)
меняем -$framesize = 16 и всё в поряде. и влазит куча переменных
???

0

19

Посмотрел в Протеусе. Никаких лишних переменных. Присвойте значение A и увидете ее в эмуляторе. А вот с размерами действительно проблема есть. Надо подумать, правда над бессмысленной задачей лень.

0

20

По всей видимости дело вот в этом, выдержка из даташета на 2313

The I/O memory space contains 64 addresses for CPU peripheral functions as Control Registers, and other I/O functions. The I/O Memory can be accessed directly, or as the
Data Space locations following those of the Register File, 0x20 - 0x5F. Это в десятичном виде 64 Это наверно и есть магическое число :-)

Я так методом втыка проверил - любая комбинация цифр в стеках не превышающая 63 ( с Вашей одной переменной) - работает. 64 и более ругается на отсутствие памяти. По крайней мере для Тини 2313. И еще, если добавляются переменные - то "магическое" число под стек уменьшается. Попробуйте сами - добавьте 2 переменные и стек придется уменьшать на 2.
P.S. Посмотрел на реальной проге - так переменные вроде и не влияют.

Отредактировано nsl (2011-03-21 10:01:26)

0

21

В даташите нашёл $HWCHECK, $FRAMECHECK, $SOFTCHECK. Подскажите, я правильно понял, что программа высчитывает стек? Как пользоваться ? вставить программу в свою программу. Я пробывал, в симуляторе прогонял, в разных программах выдавло одно и то-же.
и ещё, с Тини работать не будет?

0


Вы здесь » Программирование ATMEL в BASCOM. » FAQ по Bascom AVR и МК » $hwstack - $swstack - $framesize - подскажите новичку.