Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: непонятность с IAR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Метценгерштейн
внутри локальной ф-ии объявляю символ и передаю его на печать в консольку- в этом варианте работает
Код
    char x1, x2, x3, x4, x5, x6, x7, x8;
    //  char xx[8];
      x1='y';
      putString("\r\n");
      putchar(x1);
      putString("\r\n");


так уже не работает
Код
// char x1, x2, x3, x4, x5, x6, x7, x8;
      char xx[8];
      xx [0]='h';
      putString("\r\n");
      putchar(xx [0]);
      putString("\r\n");


а добавив static, работает
Код
// char x1, x2, x3, x4, x5, x6, x7, x8;
      static char xx[8];
      xx [0]='h';
      putString("\r\n");
      putchar(xx [0]);
      putString("\r\n");


и почему себя так ведет?
Xenia
Цитата(Метценгерштейн @ Sep 1 2013, 21:44) *
и почему себя так ведет?


Скорее всего, стека было мало отведено.
Метценгерштейн
для меги8 сколько нормально?
сейчас 0x20 стоит
Xenia
Цитата(Метценгерштейн @ Sep 1 2013, 22:45) *
для меги8 сколько нормально?
сейчас 0x20 стоит


Это не от типа МК зависит, а от того, как много локальных переменных вы заводите в функциях, и как глубоко они у вас вложены.
Для начала увеличьте стек на те самые 8 байт, и проверьте мою гипотезу.

Только имейте в виду, что IAR заводит два стека! Это RStack (для возвратов из подпрограмм) и CStack (для хранения локальных переменных). Вам надо увеличить второй.
Метценгерштейн
гипотеза полностью подтвердилась
Код
// char x1, x2, x3, x4, x5, x6, x7, x8;
      char xx[8];
      xx [0]='a';
      putString("\r\n");
      putchar(xx [0]);
      putString("\r\n");

код работает только со стеком 0x28, со стеком 0x20 не хочет работать.

Спасибо.

Вообще, какой размер стека оптимален, чтобы и глюки подобные не ловить и чтобы не слишком глубокий был?
Xenia
Цитата(Метценгерштейн @ Sep 1 2013, 23:02) *
Вообще, какой размер стека оптимален, чтобы и глюки подобные не ловить и чтобы не слишком глубокий был?


Трудно считать размер стеков. На сей счет уйма разговоров было.
Много стека жрут процедуры обработки прерываний, хотя визуально этого не видно.

Лично я отдаю под стеки всю оставшуюся память SRAM и успокаиваюсь на мысли, что сделала всё возможное sm.gif.
Метценгерштейн
вот у нас в меге8 1 КБайт SRAM. Как мне узнать, сколько оставшаяся память? А сколько он будет расходовать в процессе работы?
Xenia
Цитата(Метценгерштейн @ Sep 1 2013, 23:26) *
вот у нас в меге8 1 КБайт SRAM. Как мне узнать, сколько оставшаяся память? А сколько он будет расходовать в процессе работы?


Вы не поняли мою шутку sm.gif.
В map-файле читаем завершающие строки. Например, такие:
Код
CSTACK               DATA          00000061 - 000000C0          60   dse    0
RSTACK               DATA          000000C1 - 00000140          80   dse    0
.................

3 267 bytes of CODE memory (+ 10 range fill )
  519 bytes of DATA memory (+ 36 absolute )

Отсюда вычисляем сколько осталось свободной DATA-памяти:
1024-(519+36)=469
и отдаем все это стекам. Т.е. добиваемся того, чтобы компилятор в map-файле сообщил, что вся DATA-память занята (=1024 байта).
Такое состояние будет означать, что размер стеков максимален, и увеличить их более нельзя.
Метценгерштейн
а DATA- это у нас SRAM и есть, получается?
Заметил, что при изменении размера стека, так же в МАР файле меняется размер DATA памяти. Это он весь стек и заполняет? Или он резерв тоже просто учитывает?
заодно подскажите пож-ста, Вы же заведуете ИАРом на Сахаре wink.gif , в новых версиях не появилась удобная IDE типа Eclipse?

заметил еще одну странность:
сделал стек 512 байт.

странное поведение- лью код
Код
      putString("\r\n");
      char xx[8];
      xx [0]='J';
      putString("\r\n");
      putchar(xx [0]);
      putString("\r\n");

компилю, заливаю.

пишутся буквы J на каждой строке.
теперь заливаю код
Код
putString("\r\n");
      char xx[8];
      xx [0]='D';
      putString("\r\n");
      putchar(xx [0]);
      putString("\r\n");

должен получить на каждой строке букву D, но!
вместо этого продолжает писать J, и только спустя минуты 3, пишет новую D.

если опять поменяю букву, то такая же картина- будет минуты 3 продолжать писать старую букву, а минуты через 3 напишет новую только.
А почему так?
Xenia
Цитата(Метценгерштейн @ Sep 2 2013, 09:37) *
а DATA- это у нас SRAM и есть, получается?
Заметил, что при изменении размера стека, так же в МАР файле меняется размер DATA памяти. Это он весь стек и заполняет? Или он резерв тоже просто учитывает?

Ага. CODE - это flash, а DATA - это SRAM.
Посчитывая размер DATA, компилятор учитывает все статьи расхода, включая стеки.
Резерв не подсчитывается, но легко определяется вручную по разнице между всем объемом SRAM, имеющейся у данного МК, и тем расходом, который пошел на DATA.

Цитата(Метценгерштейн @ Sep 2 2013, 09:37) *
заодно подскажите пож-ста, Вы же заведуете ИАРом на Сахаре wink.gif , в новых версиях не появилась удобная IDE типа Eclipse?

Я и здесь таким разделом заведую sm.gif. Появилась (в версиях с новой системой лицензирования) новая версия РЕДАКТОРА, но IDE внешне остался прежним. С Eclipse не работала, но новый редактор IAR оставил у меня очень хорошее впечатление, тогда как старый я просто терпеть не могла. А новый даже скобочки подсвечивает, показывая, где находится закрывающая. Полный список нововедений не скажу, т.к. пользусь лишь ограниченными возможностями - что-то скопировать с места на место, большего мне не надо.

Цитата(Метценгерштейн @ Sep 2 2013, 09:37) *
заметил еще одну странность:
сделал стек 512 байт.
странное поведение...
А почему так?

Не знаю. Но подозреваю, что слишком много стека тоже плохо sm.gif.
Честно говоря, распределение памяти по умолчанию в модели small мне не нравится. Не понимаю, зачем стеки вставили в середину между ABSOLUTE и NEAR. В тиньках хорошо было - стеки находились сверху, и тогда можно было просто поставить указатель RSTACKа на (пред)последний байт SRAM и жить себе припеваючи: какой бы ни была программа, стеки всегда имели максимально возможную величину. Тем более что RSTACK растет сверху вниз, а CSTACK (он программный, а не аппаратный) ему настречу - снизу вверх. А потому было неважно, кому из них сколько досталось байт, главное, чтобы в промежутке оставалось место. А сейчас в small-модели приходится отодвигать NEAR вверх, чтобы расширить место под стеки.
Я уж подумывала переписать config-файл линкера, подняв CSTACK и RSTACK на самый верх, но как-то стрёмно sm.gif.
Метценгерштейн
у меня версия
6.20.1
это какой редактор? Старый или новый уже?

вернул стек как был- 0x20, код
Код
      char x1;
      x1 = 'K';
      putString("\r\n");
      putchar(x1);
      putString("\r\n");

и все-равно происходит хрень с задержкой при заливке. Т.е. Букву меняю, сначала старую пишет, потом только через минуты 3 новую ???

А как сюда доступ на ФТП получить?

Это у меня TerraTerm глючила. Похоже, выдавала старые записи за новые, а новые копила и только потом их выдавала. А выглядело как все в реальном времени. И такое бывает ))
Xenia
Цитата(Метценгерштейн @ Sep 2 2013, 12:28) *
у меня версия 6.20.1
это какой редактор? Старый или новый уже?

Уже новый. Чем-то не нравится?

Цитата(Метценгерштейн @ Sep 2 2013, 12:28) *
А как сюда доступ на ФТП получить?

Заявление надо писать с клятвой sm.gif для поступления в "свои" и ждать когда на него придет положительное заключение админа - http://electronix.ru/forum/index.php?showtopic=2605

P.S. Письмо к вам в личку отправила, ловите.
Метценгерштейн
ничем не нравится)) Компилит только хорошо) Редактор вообще не айс, в сравнении со студией, например. Даже переменные не подставляет (дописывает).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.