Перейти к содержанию
    

IAR. Помогите разобраться с настройками

Что-то диалог в тупик зашел. На ассемблере я могу контролировать. Как я могу изначально контролировать, что мне накомпилирует компилятор си? Уровень оптимизицаии да, вид оптимизации да. Но стек данных?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но стек данных?

Данные, поростите, это компилятор сам себе придумывает, или все-же Вы ему приказываете создать??? Причем в общем даже даже говорите где и кроме всего прочего можете выказывать свое требования и/или предпочтения к размещению переменных через квалификаторы.

Что-то диалог в тупик зашел

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На всякий случай уточню: листинг - это файл с расширением .lst

В этом файле, ближе к концу, есть сводная табличка по использованию стеков в функциях:

   Maximum stack usage in bytes:

   CSTACK RSTACK Function
   ------ ------ --------
       8      4  Device::Check_Para()
                   8 2 -> SPI::Set_DAC_Reg(char *)
       0      2  Device::Gen_OFF()
       0      2  Device::Gen_ON()
       8      4  Device::Handler()
                   8 2 -- Indirect call

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но стек данных?

Да при чем тут стеки вообще?!

Банально не хватает памяти, данные в ОЗУ (обычные данные, не стек) заняли столько места, что даже под более чем скромный стек места нет.

 

Ну найдете 2 байта, дальше что? - программу дальше не увеличить.

Или уж очень криво написана, или контроллер на пределе.

 

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

А первичная причина в том, что в ИАРе по умолчанию они не выводятся, нужно галку поставить ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А первичная причина в том, что в ИАРе по умолчанию они не выводятся, нужно галку поставить ;)

Не подскажете, что за галочка, и где в настройках?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А первичная причина в том, что в ИАРе по умолчанию они не выводятся, нужно галку поставить ;)

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

А то-бы я давно с ума сошел от разых IDE.

Так-что ставлю всегда ключик в командной строке выводить листинги.

 

Но вообще-то Автор утверждал следущее :"Листинги модулей есть." Так-что разговор и пошел про просмотреть их.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Банально не хватает памяти, данные в ОЗУ (обычные данные, не стек) заняли столько места, что даже под более чем скромный стек места нет.

 

А первичная причина в том, что в ИАРе по умолчанию они не выводятся, нужно галку поставить ;)

Памяти хватает. Есть 64 байт. Компилятор пишет что занято 61 байт. Учитываем глубину вложений, прерывания. Я поставил 8 байт. Хватает. Гонял программу в симуляторе на всю глубину вложений+прерывания. Остается стек данных.

 

Листинг включен. Показаны CSTACK и RSTACK. Если смотреть по каждому файлу листинга криминала не вижу.

 

Осталось понять, как компилятор подсчитывает память. И на какие цифры в будущем смотреть, чтобы выявить проблему.

Изменено пользователем demiurg1978

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Осталось понять, как компилятор подсчитывает память.

Вообще-то осталось понять, что компилятор НЕ ПОДСЧИТЫВАЕТ ПАМЯТЬ выделемую для стеков!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще-то осталось понять, что компилятор НЕ ПОДСЧИТЫВАЕТ ПАМЯТЬ выделемую для стеков!

Вот что вы нервничаете? Мы знакомы? Ни я вам ни вы мне ничего не сделали, чтобы вы позволяли себе такую резкость. Я на си пишу не так давно. До этого писал на асме. Ессно, некоторые вещи представляют для меня некоторую трудность. Терминология опять же. Для вас-то что-то можеть быть уже пройденный вдоль и поперек этап. А мне пока некоторые вещи еще в новинку. Скажите спасибо, что не на ардуине или CVAVR проекты пишу...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот что вы нервничаете?
Да ладно. Вы тоже не переживайте))) Это у него стиль общения такой. Без zltigo на форуме последние пару лет было даже как-то пусто...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот что вы нервничаете?

Зачем?

чтобы вы позволяли себе такую резкость.

Это Вы себе позволяете НЕ читать и НЕ понимать того, что Вам пишут, причем неоднократно.

Я на си пишу не так давно. До этого писал на асме.

Вынужден Вам сообщить, что стеки это не Си и не ACM, это контроллер. И память под эти стеки должна быть выделена, и указатели проинициализированы, хоть на чем пишите, хоть в кодах, хоть на суахили. Так-что как Вы "писали" на АСМ, сейчас видно как Вы пишите на Си :(

Скажите спасибо, что не на ардуине или CVAVR проекты пишу...

Спасибо. Спасибо мне ничего не стоит, в отличие от затрат времени на объяснения и повторения.

 

 

 

 

Без zltigo на форуме последние пару лет было даже как-то пусто...

Увы, не могу обещать, что надолго вернулся :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так-что как Вы "писали" на АСМ, сейчас видно как Вы пишите на Си

Не собираюсь вам что-то доказывать.

Позволили себе фи в мою сторону, хлебайте теперь. Покажите делом. Поступим просто. Я собрал проект из единственного модуля. Покажите здесь криминал. Исходные данные: ATTINY13. 64 байта ОЗУ. Настройки CSTACK 0x20. RSTACK 8. Найдите криминал в листинге:

###############################################################################
#                                                                             #
# IAR C/C++ Compiler V6.12.1.50500 for Atmel AVR        10/Sep/2015  01:38:52 #
# Copyright 1996-2012 IAR Systems AB.                                         #
#                                                                             #
#    Source file  =  F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\sys_timer.c      #
#    Command line =  F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\sys_timer.c      #
#                    --cpu=tiny13 -mt -o F:\Work\Projects\ATMEL\IAR\C\TIMER_E #
#                    ASY\Debug\Obj\ -lC F:\Work\Projects\ATMEL\IAR\C\TIMER_EA #
#                    SY\Debug\List\ -lA F:\Work\Projects\ATMEL\IAR\C\TIMER_EA #
#                    SY\Debug\List\ --initializers_in_flash --debug           #
#                    -DENABLE_BIT_DEFINITIONS -e --eeprom_size 64 --clib -Ohz #
#    List file    =  F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\List\sys_t #
#                    imer.lst                                                 #
#    Object file  =  F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\Debug\Obj\sys_ti #
#                    mer.r90                                                  #
#                                                                             #
#                                                                             #
###############################################################################

F:\Work\Projects\ATMEL\IAR\C\TIMER_EASY\sys_timer.c
     1          //========================================================================
     2          #include "sys_timer.h"

  \                                 In  segment ABSOLUTE, at 0x59
  \   union <unnamed> volatile __io _A_TIMSK0
  \                     _A_TIMSK0:
  \   00000000                      DS8 1

  \                                 In  segment ABSOLUTE, at 0x56
  \   union <unnamed> volatile __io _A_OCR0A
  \                     _A_OCR0A:
  \   00000000                      DS8 1

  \                                 In  segment ABSOLUTE, at 0x53
  \   union <unnamed> volatile __io _A_TCCR0B
  \                     _A_TCCR0B:
  \   00000000                      DS8 1

  \                                 In  segment ABSOLUTE, at 0x52
  \   union <unnamed> volatile __io _A_TCNT0
  \                     _A_TCNT0:
  \   00000000                      DS8 1
     3          //========================================================================
     4          
     5          //========================================================================
     6          u08 sys_tick;
     7          //========================================================================
     8          
     9          //========================================================================
    10          #pragma vector = TIM0_COMPA_vect

  \                                 In  segment CODE, align 2, keep-with-next
    11          __interrupt void Timer0Comp(void)
  \                     Timer0Comp:
    12          {
  \   00000000   93EA               ST      -Y, R30
  \   00000002   931A               ST      -Y, R17
  \   00000004   930A               ST      -Y, R16
  \   00000006   B71F               IN      R17, 0x3F
    13          	ST_OCR += SYS_TIME;
  \   00000008   B706               IN      R16, 0x36
  \   0000000A   560A               SUBI    R16, 106
  \   0000000C   BF06               OUT     0x36, R16
    14          	set_bit (sys_tick, SYS_TICK);
  \   0000000E   ....               LDI     R30, Timers_Queue
  \   00000010   8904               LDD     R16, Z+20
  \   00000012   6001               ORI     R16, 0x01
  \   00000014   8B04               STD     Z+20, R16
    15          }
  \   00000016   BF1F               OUT     0x3F, R17
  \   00000018   9109               LD      R16, Y+
  \   0000001A   9119               LD      R17, Y+
  \   0000001C   91E9               LD      R30, Y+
  \   0000001E   9518               RETI
  \   00000020                      REQUIRE _A_OCR0A
    16          //========================================================================
    17          
    18          //========================================================================

  \                                 In  segment CODE, align 2, keep-with-next
    19          void init_sys_timer (void)
  \                     init_sys_timer:
    20          {
    21          	sys_tick = 0;
  \   00000000   E000               LDI     R16, 0
  \   00000002   ....               LDI     R30, Timers_Queue
  \   00000004   8B04               STD     Z+20, R16
    22          	ST_TCNT = 0;
  \   00000006   BF02               OUT     0x32, R16
    23          	set_bit (ST_TIMSK, ST_OCIE);
  \   00000008   B709               IN      R16, 0x39
  \   0000000A   6004               ORI     R16, 0x04
  \   0000000C   BF09               OUT     0x39, R16
    24          	ST_OCR = SYS_TIME;
  \   0000000E   E906               LDI     R16, 150
  \   00000010   BF06               OUT     0x36, R16
    25          	ST_TCCR |= ((1<<CS0) | (1<<CS1));
  \   00000012   B703               IN      R16, 0x33
  \   00000014   6003               ORI     R16, 0x03
  \   00000016   BF03               OUT     0x33, R16
    26          }
  \   00000018   9508               RET
  \   0000001A                      REQUIRE _A_TCNT0
  \   0000001A                      REQUIRE _A_TIMSK0
  \   0000001A                      REQUIRE _A_OCR0A
  \   0000001A                      REQUIRE _A_TCCR0B

  \                                 In  segment TINY_Z, align 1, keep-with-next
  \   00000000                      REQUIRE `?<Segment init: TINY_Z>`
    27          //------------------------------------------------------------------------
    28          
    29          //------------------------------------------------------------------------
    30          struct tmrs_queue Timers_Queue [TMRS_QUANTITY];
  \                     Timers_Queue:
  \   00000000                      DS8 20
  \                     sys_tick:
  \   00000014                      DS8 1
    31          

  \                                 In  segment CODE, align 2, keep-with-next
    32          void service_timers(void)
  \                     service_timers:
    33          {
    34          	if (sys_tick & (1<<SYS_TICK))
  \   00000000   ....               LDI     R30, Timers_Queue
  \   00000002   8904               LDD     R16, Z+20
  \   00000004   FF00               SBRS    R16, 0
  \   00000006   C01A               RJMP    ??service_timers_0
    35          	{
    36          		clr_bit (sys_tick, SYS_TICK);
  \   00000008   7F0E               ANDI    R16, 0xFE
  \   0000000A   8B04               STD     Z+20, R16
    37          
    38                u08 i;
    39          
    40                for (i = 0; i < TMRS_QUANTITY; i++)
  \   0000000C   E000               LDI     R16, 0
    41                {
    42                   if (Timers_Queue [i]. tmr_flags & (1<<TMR_UNLOCK))
  \                     ??service_timers_1:
  \   0000000E   2F10               MOV     R17, R16
  \   00000010   0F11               LSL     R17
  \   00000012   0F11               LSL     R17
  \   00000014   0F10               ADD     R17, R16
  \   00000016   ....               LDI     R30, Timers_Queue
  \   00000018   0FE1               ADD     R30, R17
  \   0000001A   8110               LD      R17, Z
  \   0000001C   FF10               SBRS    R17, 0
  \   0000001E   C00B               RJMP    ??service_timers_2
    43                   {
    44                      Timers_Queue [i]. tmr_cnt--;
  \   00000020   8121               LDD     R18, Z+1
  \   00000022   8132               LDD     R19, Z+2
  \   00000024   5021               SUBI    R18, 1
  \   00000026   4030               SBCI    R19, 0
  \   00000028   8321               STD     Z+1, R18
  \   0000002A   8332               STD     Z+2, R19
    45          
    46                      if (Timers_Queue[i]. tmr_cnt == 0)
  \   0000002C   8121               LDD     R18, Z+1
  \   0000002E   2B23               OR      R18, R19
  \   00000030   F411               BRNE    ??service_timers_2
    47                         set_bit (Timers_Queue[i]. tmr_flags, TIME_OUT);
  \   00000032   6012               ORI     R17, 0x02
  \   00000034   8310               ST      Z, R17
    48                   }
    49                }
  \                     ??service_timers_2:
  \   00000036   9503               INC     R16
  \   00000038   3004               CPI     R16, 4
  \   0000003A   F348               BRCS    ??service_timers_1
    50          	}
    51          }
  \                     ??service_timers_0:
  \   0000003C   9508               RET
    52          
    53          //------------------------------------------------------------------------
    54          
    55          //------------------------------------------------------------------------

  \                                 In  segment CODE, align 2, keep-with-next
    56          void set_timer(u08 num_tmr, u16 time)
  \                     set_timer:
    57          {
    58          	set_bit (Timers_Queue [num_tmr]. tmr_flags, TMR_UNLOCK);
  \   00000000   ....               RCALL   ?Subroutine1
  \                     ??CrossCallReturnLabel_5:
  \   00000002   6001               ORI     R16, 0x01
  \   00000004   8300               ST      Z, R16
    59          	Timers_Queue [num_tmr]. tmr_cnt = time;
  \   00000006   8321               STD     Z+1, R18
  \   00000008   8332               STD     Z+2, R19
    60          }
  \   0000000A   9508               RET

  \                                 In  segment CODE, align 2, keep-with-next
  \                     ?Subroutine1:
  \   00000000   ....               RCALL   ?Subroutine2
  \                     ??CrossCallReturnLabel_1:
  \   00000002   ....               LDI     R30, Timers_Queue
  \   00000004   0FE0               ADD     R30, R16
  \   00000006                      REQUIRE ?Subroutine3
  \   00000006                      ;               // Fall through to label ?Subroutine3

  \                                 In  segment CODE, align 2, keep-with-next
  \                     ?Subroutine3:
  \   00000000   8100               LD      R16, Z
  \   00000002   9508               RET

  \                                 In  segment CODE, align 2, keep-with-next
  \                     ?Subroutine2:
  \   00000000   2F10               MOV     R17, R16
  \   00000002   0F00               LSL     R16
  \   00000004   0F00               LSL     R16
  \   00000006   0F01               ADD     R16, R17
  \   00000008   9508               RET
    61          //------------------------------------------------------------------------
    62          
    63          //------------------------------------------------------------------------

  \                                 In  segment CODE, align 2, keep-with-next
    64          u08 wait(u08 num_tmr)
  \                     wait:
    65          
    66          {
    67          	if(Timers_Queue [num_tmr]. tmr_flags & (1<<TIME_OUT))
  \   00000000   ....               RCALL   ?Subroutine1
  \                     ??CrossCallReturnLabel_6:
  \   00000002   FF01               SBRS    R16, 1
  \   00000004   C004               RJMP    ??wait_0
    68          	{
    69          		clr_bit (Timers_Queue [num_tmr]. tmr_flags, TIME_OUT);
  \   00000006   7F0D               ANDI    R16, 0xFD
  \   00000008   8300               ST      Z, R16
    70          		return 1;
  \   0000000A   E001               LDI     R16, 1
  \   0000000C   9508               RET
    71          	}
    72          		else
    73          		return 0;
  \                     ??wait_0:
  \   0000000E   E000               LDI     R16, 0
  \   00000010   9508               RET
    74          }
    75          //========================================================================
    76          

  \                                 In  segment CODE, align 2, keep-with-next
    77          void set_timer_time_out (u08 a)
  \                     set_timer_time_out:
    78          {
    79             set_bit (Timers_Queue [a] .tmr_flags, TIME_OUT);
  \   00000000   ....               RCALL   ?Subroutine0
  \                     ??CrossCallReturnLabel_2:
  \   00000002   6002               ORI     R16, 0x02
  \   00000004                      REQUIRE ?Subroutine4
  \   00000004                      ;               // Fall through to label ?Subroutine4
    80          }

  \                                 In  segment CODE, align 2, keep-with-next
  \                     ?Subroutine4:
  \   00000000   8300               ST      Z, R16
  \   00000002   9508               RET

  \                                 In  segment CODE, align 2, keep-with-next
  \                     ?Subroutine0:
  \   00000000   ....               RCALL   ?Subroutine2
  \                     ??CrossCallReturnLabel_0:
  \   00000002   2FE0               MOV     R30, R16
  \   00000004   ....               SUBI    R30, (-(Timers_Queue) & 0xFF)
  \   00000006   ....               RJMP    ?Subroutine3
    81          

  \                                 In  segment CODE, align 2, keep-with-next
    82          void set_timer_active (u08 a)
  \                     set_timer_active:
    83          {
    84             set_bit (Timers_Queue [a] .tmr_flags, TMR_UNLOCK);
  \   00000000   ....               RCALL   ?Subroutine0
  \                     ??CrossCallReturnLabel_3:
  \   00000002   6001               ORI     R16, 0x01
  \   00000004   ....               RJMP    ?Subroutine4
    85          }
    86          

  \                                 In  segment CODE, align 2, keep-with-next
    87          void set_timer_no_active (u08 a)
  \                     set_timer_no_active:
    88          {
    89             clr_bit (Timers_Queue [a] .tmr_flags, TMR_UNLOCK);
  \   00000000   ....               RCALL   ?Subroutine0
  \                     ??CrossCallReturnLabel_4:
  \   00000002   7F0E               ANDI    R16, 0xFE
  \   00000004   ....               RJMP    ?Subroutine4
    90          }

  \                                 In  segment INTVEC, offset 0xc, root
  \                     `??Timer0Comp??INTVEC 12`:
  \   0000000C   ....               RJMP    Timer0Comp

  Maximum stack usage in bytes:

  CSTACK RSTACK Function
  ------ ------ --------
      3      2  Timer0Comp
      0      2  init_sys_timer
      0      2  service_timers
      0      2  set_timer
      0      2  set_timer_active
      0      2  set_timer_no_active
      0      2  set_timer_time_out
      0      2  wait


  Segment part sizes:

  Bytes  Function/Label
  -----  --------------
      2  ??Timer0Comp??INTVEC 12
      8  ?Subroutine0
      6  ?Subroutine1
     10  ?Subroutine2
      4  ?Subroutine3
      4  ?Subroutine4
     32  Timer0Comp
     21  Timers_Queue
         sys_tick
      1  _A_OCR0A
      1  _A_TCCR0B
      1  _A_TCNT0
      1  _A_TIMSK0
     26  init_sys_timer
     62  service_timers
     12  set_timer
      6  set_timer_active
      6  set_timer_no_active
      4  set_timer_time_out
     18  wait
      4  -- Other


  4 bytes in segment ABSOLUTE
198 bytes in segment CODE
  4 bytes in segment INITTAB
  2 bytes in segment INTVEC
 21 bytes in segment TINY_Z

198 bytes of CODE memory (+ 6 bytes shared)
 21 bytes of DATA memory (+ 4 bytes shared)

Errors: none
Warnings: none

Изменено пользователем demiurg1978

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не собираюсь вам что-то доказывать.

А я и не спрашивал от Вас "доказательств" чего-либо по причине нахренненужности.

Позволили себе фи в мою сторону

Это констатация факта, так-что включайте мозг, а не эмоции.

Покажите здесь криминал.

Криминал Вам уже ПОКАЗАЛ линкер, кторый сказал, что RAM затребованной Вами при написании этой программы замного будет.

http://electronix.ru/forum/index.php?showt...t&p=1363816

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Без эмоций уже не получится, вы пришли, на две страницы затроллили нахер тему, информации до сих пор я не получил. Хорошо, вы вытрепнулись. Я вам выложил листинг. Покажите мне пальцем, ткните носом, в каком месте не хватает ОЗУ. Если вы мне не ответите на этот вопрос, идите мимо, по хорошему вас прошу.

Изменено пользователем demiurg1978

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...