Осваиваю БАСКОМ. Не могу понять для чего необходимо определять значения $hwstack - $swstack - $framesize и чтоэто за переменные ?
Для примера пользую мегу 32, какие значения надо выставить. По справке БАСКОМа ничего не понял.
$hwstack - $swstack - $framesize - подскажите новичку.
Сообщений 1 страница 21 из 21
Поделиться12011-02-08 11:38:29
Поделиться22011-02-08 12:28:46
(Примечание переводчика: стековый фрейм - область памяти, выделяемая всякий раз, когда вызывается функция. Предназначается для временного хранения аргументов и локальных переменных функции)
Команды изменения параметров компиляции
Аппаратный стек
Описывает количество байт, отведенных для аппаратного стека. Когда вы используете команды 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 байт
Поделиться32011-02-08 12:36:08
а кикае могут быть проблемы если не прописывать размеры стека и фрейма? я обхожусь без этих строк и все вроде работает
Поделиться42011-02-08 13:46:06
в программе можно даже не прописывать имя контроллера и частоту. Тогда компилятор будет брать всё из настроек
Поделиться52011-02-08 13:57:32
крайне НЕ советую делать через Меню настроек (Визард, волшебник)!!!
Во-первых, код делается очень ненаглядным: приходится постоянно в Меню настроек залезать и смотреть что и как настроено
В-вторых, все настройки хранятся НЕ в файле программы, а во внешнем файле. Когда будете передавать\выкладывать свою программу придется и файл настроек давать, ибо без него - сыромятина, а не source - "сырец, исходное"
Поделиться62011-02-08 19:00:47
Когда вы используете две команды GOSUB, в стеке запоминаются 4 байта
Это если они вложенные, а не находящиеся на одном уровне.
Поделиться72011-02-10 17:22:19
Читаем А.В.Евстифеев "Во всех микроконтроллерах семейства Mega стек реализован программно. Он размещается в памяти данных, и его глубина определяется только размером свободной области памяти программ." Тогда вопрос - для чего необходимо определять параметры аппаратного и программного стека?
Поделиться82011-02-10 17:47:23
это надо компилятору
я же выше дал информацию из справочной системы!
Поделиться92011-02-10 17:56:50
Спасибо за ответ попробую разобраться.
Поделиться102011-02-10 18:28:38
Во всех микроконтроллерах семейства Mega стек реализован программно.
Нет, он аппаратный, но располагается в ОЗУ!
Тогда вопрос - для чего необходимо определять параметры аппаратного и программного стека?
Что знать сколько памяти зарезервировать под стеки чтобы они не попортили друг-друга и произошло перекрытие с областью переменных.
Поделиться112011-03-14 22:04:00
Александр Д.
Спасибо за разъяснения. Но хотел попроситвсе таки помочь на спичках -) Вот мои переменные
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 байта? А что за передачи переменных - я наверно в терминологии путаюсь.
Поделиться122011-03-14 22:11:05
не понял Вашего примера
При чем тут резервирование памяти и стек?
Стек будет задействован при передаче параметров в подпрограмму
Поделиться132011-03-14 22:19:20
Александр Д.
Следующее - у меня в програме 16 раз используется GOSUB, как быть здесь? 16 *2 = 32? они не вложенные . Плюс переодически наступает прерывание от таймера - еще 32? Итого 64?
Поделиться142011-03-14 22:31:34
не понял Вашего примера
При чем тут резервирование памяти и стек?
Стек будет задействован при передаче параметров в подпрограмму
Это Вы мне?
Поделиться152011-03-14 22:51:10
в стеке будет (как я понял) кол-во вложенных подпрограмм умножить на 2 и умножить на кол-во передаваемых в них переменных
я еще в ассме не смотрел, что и как творит баском... надо заняться, а то уже дважды были глюки из-за выделения памяти
Поделиться162011-03-14 23:41:14
в стеке будет (как я понял) кол-во вложенных подпрограмм умножить на 2 и умножить на кол-во передаваемых в них переменных
Слова русские, но не понял. Простите за не осведомленность.
Вложенные подпрограммы это когда условием одного перехода, является другой, потом третий и т д. ?
Не вложенные, это когда выполнился один переход, что то исполнилось , завершилось и потом другой. Правильно?
Надо почитать, только вот что? Не подскажете? Перешел с м32 на 2313 и работает несколько циклов , потом зависает. Ресетом чик опять пашет. Что то обнулять надо, знать бы что и как.
Поделиться172011-03-16 10:05:49
Разобрался - привожу на примере своей проги и Тини 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)
Поделиться182011-03-17 14:48:21
Вот тогда прошу тоже расписать на пальцах:
$regfile = "attiny13.dat" $crystal = 9600000 $hwstack = 32 $swstack = 8 $framesize = 24 Config Portb = Output Dim A As Byte Do Loop End
пишет ошибку типа у нас нет для вас места
меняем -$framesize = 16 и всё в поряде. и влазит куча переменных
???
Поделиться192011-03-21 09:03:23
Посмотрел в Протеусе. Никаких лишних переменных. Присвойте значение A и увидете ее в эмуляторе. А вот с размерами действительно проблема есть. Надо подумать, правда над бессмысленной задачей лень.
Поделиться202011-03-21 09:47:46
По всей видимости дело вот в этом, выдержка из даташета на 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)
Поделиться212014-01-03 23:36:31
В даташите нашёл $HWCHECK, $FRAMECHECK, $SOFTCHECK. Подскажите, я правильно понял, что программа высчитывает стек? Как пользоваться ? вставить программу в свою программу. Я пробывал, в симуляторе прогонял, в разных программах выдавло одно и то-же.
и ещё, с Тини работать не будет?
Похожие темы
Конфигурация стеков | FAQ по Bascom AVR и МК | 2019-05-09 |