Куда делась память? Глобальные переменные используют 1658 байт (80%) динамической памяти.
- Войдите на сайт для отправки комментариев
Втр, 20/11/2018 - 22:37
Добрый вечер.
Объясните пожалуйсте, что-то не пойму. Глобальных переменных у меня 3, но размер (при компеляции) глобальных переменных связан с содержимым getSong и ещё интересно, если в play_rtttl убрать Serial.println(song);, то память 9% становится.
Объясните пожалуйста, как разметить несколько длинных строк, при этом чтобы они не использовали глобальную память.
Спасибо. Код ниже...
#define DELAY_ITERATION 1000 // Время каждой итерации #define BEEP_PIN 12 // Пин динамика #define ON_PIN 10 // Пин тригер включения воспроизведения #define OFF_PIN 11 // Пин тригер выключения воспроизведения #define OCTAVE_OFFSET 0 // ? int song_len = 6; char getSong(int num){ if(0 == num) return "GoodBad:d=4,o=5,b=56:32p,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,d#,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,c#6,32a#,32d#6,32a#,32d#6,8a#.,16f#.,32f.,32d#.,c#,32a#,32d#6,32a#,32d#6,8a#.,16g#.,d#"; else if(1 == num) return "Entertainer:d=4,o=5,b=140:8d,8d#,8e,c6,8e,c6,8e,2c.6,8c6,8d6,8d#6,8e6,8c6,8d6,e6,8b,d6,2c6,p,8d,8d#,8e,c6,8e,c6,8e,2c.6,8p,8a,8g,8f#,8a,8c6,e6,8d6,8c6,8a,2d6"; else if(2 == num) return "StarWars:d=4,o=5,b=45:32p,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#.6,32f#,32f#,32f#,8b.,8f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32c#6,8b.6,16f#.6,32e6,32d#6,32e6,8c#6"; else if(3 == num) return "Indiana:d=4,o=5,b=250:e,8p,8f,8g,8p,1c6,8p.,d,8p,8e,1f,p.,g,8p,8a,8b,8p,1f6,p,a,8p,8b,2c6,2d6,2e6,e,8p,8f,8g,8p,1c6,p,d6,8p,8e6,1f.6,g,8p,8g,e.6,8p,d6,8p,8g,e.6,8p,d6,8p,8g,f.6,8p,e6,8p,8d6,2c6"; else if(4 == num) return "Flinstones:d=4,o=5,b=40:32p,16f6,16a#,16a#6,32g6,16f6,16a#.,16f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c6,d6,16f6,16a#.,16a#6,32g6,16f6,16a#.,32f6,32f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c6,a#,16a6,16d.6,16a#6,32a6,32a6,32g6,32f#6,32a6,8g6,16g6,16c.6,32a6,32a6,32g6,32g6,32f6,32e6,32g6,8f6,16f6,16a#.,16a#6,32g6,16f6,16a#.,16f6,32d#6,32d6,32d6,32d#6,32f6,16a#,16c.6,32d6,32d#6,32f6,16a#,16c.6,32d6,32d#6,32f6,16a#6,16c7,8a#.6"; else if(5 == num) return "MissionImp:d=16,o=6,b=95:32d,32d#,32d,32d#,32d,32d#,32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,a#,g,2d,32p,a#,g,2c#,32p,a#,g,2c,a#5,8c,2p,32p,a#5,g5,2f#,32p,a#5,g5,2f,32p,a#5,g5,2e,d#,8d"; } #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 #define NOTE_C6 1047 #define NOTE_CS6 1109 #define NOTE_D6 1175 #define NOTE_DS6 1245 #define NOTE_E6 1319 #define NOTE_F6 1397 #define NOTE_FS6 1480 #define NOTE_G6 1568 #define NOTE_GS6 1661 #define NOTE_A6 1760 #define NOTE_AS6 1865 #define NOTE_B6 1976 #define NOTE_C7 2093 #define NOTE_CS7 2217 #define NOTE_D7 2349 #define NOTE_DS7 2489 #define NOTE_E7 2637 #define NOTE_F7 2794 #define NOTE_FS7 2960 #define NOTE_G7 3136 #define NOTE_GS7 3322 #define NOTE_A7 3520 #define NOTE_AS7 3729 #define NOTE_B7 3951 int notes[] = { 0, NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4, NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5, NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6, NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7 }; int iteration = 0; void setup(){ Serial.begin(9600); Serial.println("Start"); pinMode(BEEP_PIN, OUTPUT); pinMode(ON_PIN, INPUT); pinMode(OFF_PIN, INPUT); } void loop(){ int on_pin_stat = digitalRead(ON_PIN); if(HIGH == on_pin_stat){ if(iteration >= song_len) iteration = 0; Serial.println(iteration); play_rtttl(iteration); delay(DELAY_ITERATION); ++iteration; } else delay(10); } void play_rtttl(int num){ char song = getSong(num); Serial.println(song); }
Разместить через PROGMEM. Прежде чем спросить "А как это?", воспользуйтесь, пожалуйста, Яндексом.
MaksVV, Спасибо!
Разместить через PROGMEM. Прежде чем спросить "А как это?", воспользуйтесь, пожалуйста, Яндексом.
2 часа гугления без толку.. MaksVV помог, ему спасибо. sadman41, а вам минус, за то что слишком умничаете. Не всё можно найти в поиске, особенно если не понимаешь как искать. А как я понимал, все варианты перепробывал и не нашел. Может вы мне покажете как надо искать?
2 часа гугления без толку..
только не надо врать про 2 часа. Между ответом sadman41 и вашей претензией и 10 минут не прошло. Вы хотя бы попробуйте поискать, прежде чем наезжать на тех, кто помогает.
кстати, код не рабочий, даже без учета памяти. Тип char, который возвращает ваша функция - это один символ, а вы в него пытаетесь всю песню запихнуть.
Посмотрите внимательно на тот скетч, с которого вы слизали свой -там все правильно.
а вы уверены что ваш изначальный скетч работает?
я не прикалываюсь. Вам дали ключевое слово для поиска - правильное слово - и попросили сначала поискать в гугле , а не задавать сразу глупых вопросов типа "а что это? как использовать?"
сдается мне, что он в сериал никакие ваши строки не отпраляет
а вы уверены что ваш изначальный скетч работает?
Нет, даже не заливал, т.к. искал возможность сократить память. Сейчас заменил char на String и всё как надо.
если по дурацки то заменить char на String и будет работать.
Нет, даже не заливал, т.к. искал возможность сократить память. Сейчас заменил char на String и всё как надо.
Ответ на вопрос "Куда делась память?" надеюсь, уже сами нашли?
я не прикалываюсь. Вам дали ключевое слово для поиска - правильное слово - и попросили сначала поискать в гугле , а не задавать сразу глупых вопросов типа "а что это? как использовать?"
b707, не хочу разводить холивар, но ключевое слов и посыл на яндекс это одно сообщение. Нужно подсказать было, а если стал дальше задавать глупые вопросы, то можно и в яндекс послать. Но в данном случае, это было одно сообщение. Поэтому я вполне аргументированно выразил недовольства. На этом считаю данную тему закрытой.
Нет, даже не заливал, т.к. искал возможность сократить память. Сейчас заменил char на String и всё как надо.
Ответ на вопрос "Куда делась память?" надеюсь, уже сами нашли?
Может я делаю что-то не так)) Но в консоле я увидел все "песни" которые и планировалось увидеть. https://yadi.sk/i/_y_qUb_raV1WFg
b707, не хочу разводить холивар, но ключевое слов и посыл на яндекс это одно сообщение. Нужно подсказать было, а если стал дальше задавать глупые вопросы, то можно и в яндекс послать. Но в данном случае, это было одно сообщение. Поэтому я вполне аргументированно выразил недовольства. На этом считаю данную тему закрытой.
вот и не разводите. "Посыл в Яндекс" - это уже стало оскорблением, что ли? тем более посыл абсолютно корректный, даже через "пожалуйста".
Надо быть благодарным. что вам дали четкий ориентир, что искать. На самом деле в 95% вопросов на форуме ничего больше и не требуется.
Может я делаю что-то не так)) Но в консоле я увидел все "песни" которые и планировалось увидеть. https://yadi.sk/i/_y_qUb_raV1WFg
если это ответ на ту строчку, которой теперь нет в сообщении - то это я не туда посмотрел. Как видите, я успел ее стереть сам, после ответа уже не смог бы.
Ну так почему мало памяти - поняли?
Ещё раз всем спасибо! MaksVV как не крути помог без лишних слов, огромное ему спасибо.
Ещё раз всем спасибо! MaksVV как не крути помог без лишних слов, огромное ему спасибо.
ну на самом деле он этим нарущил этикет форума :) - потому как правильнее было бы заставить вас самостоятельно найти свои ошибки, а так вы наверняка почти ничего не запомнили и не поняли.
Ну так почему мало памяти - поняли?
Честно? Даже не хочу разбираться, сделал, спросил, поправил, работает. А большего и не надо. Если ещё будет проблемы с памятью, то буду вникать дальше. Но просто как-то не логично получается...
Честно? Даже не хочу разбираться, сделал, спросил, поправил, работает. А большего и не надо. Если ещё будет проблемы с памятью, то буду вникать дальше. Но просто как-то не логично получается...
вооот! про это я и написал сообщением раньше. Максу строгий выговор с занесением за выдачу новичку готового ответа без принудительного изучения новичком теории.
Новички - они ж такие - получил ответ и убежал, нифига не поняв. С таким подходом еще раз десять придете с элментарными вопросами...
вооот! про это я и написал сообщением раньше. Максу строгий выговор с занесением за выдачу новичку готового ответа без принудительного изучения новичком теории.
Новички - они ж такие - получил ответ и убежал, нифига не поняв. С таким подходом еще раз десять придете с элментарными вопросами...
Это был вопрос из область "элементарные вопросы" ? Вы профи в этом и вам элементарно. А что я вижу: вижу лёгкие глобальные переменные, функции и локальные переменные. А он какого-то фига пишет что юзаю глобальные... Как-то не логично.
Это был вопрос из область "элементарные вопросы" ? Вы профи в этом и вам элементарно. А что я вижу: вижу лёгкие глобальные переменные, функции и локальные переменные. А он какого-то фига пишет что юзаю глобальные... Как-то не логично.
Извольте!
Где размещаются локальные переменные?
В стеке.
Нужна ли под них глобальная память?
Не нужна.
Почему?
--- ответьте на этот вопрос, исходя из логики
А могут ли "локальные" константы размещаться там же?
--- ответьте на этот вопрос
Почему?
--- ответьте на этот вопрос
Логика?
Извольте!
Где размещаются локальные переменные?
В стеке.
Вот я и говорю, вы иначе мыслите.
Хорошо, давайте зайдем с другой стороны: если у нас обычная неинициализированная переменная, она у нас появляется только в момент вызова функции и потом исчезает. А в случае с константой - где-то надо хранить то значение, которым эту константу инициализировать. Вот оно память и занимает.
Хорошо, давайте зайдем с другой стороны: если у нас обычная неинициализированная переменная, она у нас появляется только в момент вызова функции и потом исчезает. А в случае с константой - где-то надо хранить то значение, которым эту константу инициализировать. Вот оно память и занимает.
Так у меня функция хранящая строки (не в переменной) и переменная внутри функции другой функции, которая принимает разные значения, а не хранит все варианты значений. Причем тут константа?
Разместить через PROGMEM. Прежде чем спросить "А как это?", воспользуйтесь, пожалуйста, Яндексом.
2 часа гугления без толку..
...
Может вы мне покажете как надо искать?
Не трындите. С самого верха начинается и описание и примеры: https://yandex.ru/search/?text=PROGMEM&&lr=19
clgs, то, что у Вас изображено в строках с 10 по 15 - это константы. Где, по-вашему, должны храниться все те байтики, из которых эти константы состоят?
clgs, то, что у Вас изображено в строках с 10 по 15 - это константы. Где, по-вашему, должны храниться все те байтики, из которых эти константы состоят?
И опять же, причем тут это? Проблема в другом. К этим константам вопросов нет. Эти константы NOTE_* и int notes[] вообще можно удалить, суть останется не изменной.
тебе вот про это говорят:
"GoodBad:d=4,o=5,b=56:32p,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,d#,32a#,32d#6,32a#,32d#6,8a#.......
как ты думаешь, где вот это вот всё храница?
тебе вот про это говорят:
"GoodBad:d=4,o=5,b=56:32p,32a#,32d#6,32a#,32d#6,8a#.,16f#.,16g#.,d#,32a#,32d#6,32a#,32d#6,8a#.......
Ну, строки в функции? Или они являются константами? =)
И опять же, причем тут это? Проблема в другом. К этим константам вопросов нет. Эти константы NOTE_* и int notes[] вообще можно удалить, суть останется не изменной.
вы хотя бы читаете то, что вам пишут? - речь не про NOTE_*, а про ваши песенки в строка с 10 по 16-ую скетча из первого сообщения.
Вместо того, чтоб тупо спорить - давно б книжку какую почитали
Ну, строки в функции? Или они являются константами? =)
ну тупой.... дошло наконец?
Вот я и говорю, вы иначе мыслите.
Вот и весь форум тебе то же самое говорит.
как ты думаешь, где вот это вот всё храница?
Я так думаю что в коде программы, т.к. это всего лишь строки, а не значение переменных или констант.
это инициализированная константа и таки ты не поверишь она храница 2 раза, и в коде и в памяти.
Хоть бы какой Коран по языку почитал, штоли
это инициализированная константа и таки ты не поверишь она храница 2 раза, и в коде и в памяти.
Спасибо! Теперь ясно.
Я так думаю что в коде программы, т.к. это всего лишь строки, а не значение переменных или констант.
когда ты их запишешь через F(). они будут хранится в коде, а пока они занимают оперативку
Коллеги, по-моему это тупой троллинг кого-то из местных. таких упертых и тупых новичков не быыает
Почитай теперь чонить за PROGMEM
а он мошт не тупой, а альтернативно мыслящий
а он мошт не тупой, а альтернативно мыслящий
Зачет :-D
когда ты их запишешь через F(). они будут хранится в коде, а пока они занимают оперативку
Коллеги, по-моему это тупой троллинг кого-то из местных. таких упертых и тупых новичков не быыает
Я WEB программист (PHP и JS). Там всё иначе, отсюда такие пролемы с пониманием иной реальности =)
А то что нужно почитать, согласен. Думал освою на практике, но не всё тут так как думалось.
Я WEB программист (PHP и JS). Там всё иначе, отсюда такие пролемы с пониманием иной реальности =)
А то что нужно почитать, согласен. Думал освою на практике, но не всё тут так как думалось.
Дальше не продолжай, здесь это фактически диагноз и приговор.
как ты думаешь, где вот это вот всё храница?
Я так думаю что в коде программы, т.к. это всего лишь строки, а не значение переменных или констант.
А компилятору это откуда известно?
попробуй так, сколько места занимать будет?
Я WEB программист (PHP и JS). Там всё иначе, отсюда такие пролемы с пониманием иной реальности =)
А то что нужно почитать, согласен. Думал освою на практике, но не всё тут так как думалось.
Дальше не продолжай, здесь это фактически диагноз и приговор.
Не, деда, я тож владею PHP и JS, это ещё не приговор :) Приговор - в отсутствии системного подхода к знаниям, это тенденция не первых лет уже, к сожалению. И, похоже, это уже скорее правило, чем исключение, поэтому - придётся мамонтам либо привыкать, либо вымирать. Что касается меня лично - похоже, я быстрее вымру, чем привыкну :)
Я WEB программист (PHP и JS).
Собственно это всё, что нужно знать о современном вебе! ;)
как ты думаешь, где вот это вот всё храница?
Я так думаю что в коде программы, т.к. это всего лишь строки, а не значение переменных или констант.
А компилятору это откуда известно?
Из объявлений, тащемта. Когда парсер разбирает код, он строит AST, в котором хранится всякая магия. При том, что возвращаемое значение функции описано как char - не запрещает парсеру понимать, что внутри функции описаны строковые литералы, а из функции надо просто возвратить первый символ такого литерала.
Короче - авада кедавра :)
попробуй так, сколько места занимать будет?
Глобальные переменные используют 210 байт (10%) динамической памяти
т.е. не изменилось ВООБЩЕ, по отношению с использованием F.