demiurg1978 1 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Что-то диалог в тупик зашел. На ассемблере я могу контролировать. Как я могу изначально контролировать, что мне накомпилирует компилятор си? Уровень оптимизицаии да, вид оптимизации да. Но стек данных? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Но стек данных? Данные, поростите, это компилятор сам себе придумывает, или все-же Вы ему приказываете создать??? Причем в общем даже даже говорите где и кроме всего прочего можете выказывать свое требования и/или предпочтения к размещению переменных через квалификаторы. Что-то диалог в тупик зашел И я даже знаю почему - Вы с тупым упорством не желаете заглянуть в листинг в котором видны использования стеков. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба На всякий случай уточню: листинг - это файл с расширением .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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Но стек данных? Да при чем тут стеки вообще?! Банально не хватает памяти, данные в ОЗУ (обычные данные, не стек) заняли столько места, что даже под более чем скромный стек места нет. Ну найдете 2 байта, дальше что? - программу дальше не увеличить. Или уж очень криво написана, или контроллер на пределе. И я даже знаю почему - Вы с тупым упорством не желаете заглянуть в листинг в котором видны использования стеков. А первичная причина в том, что в ИАРе по умолчанию они не выводятся, нужно галку поставить ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба А первичная причина в том, что в ИАРе по умолчанию они не выводятся, нужно галку поставить ;) Не подскажете, что за галочка, и где в настройках? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DogPawlowa 0 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Не подскажете, что за галочка, и где в настройках? option/C-C++ compiler/list Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба А первичная причина в том, что в ИАРе по умолчанию они не выводятся, нужно галку поставить ;) Я не в курсе галочек IAR среды, ибо пользуюсь компиляторами, в том числе и IAR, но не всякими дивными недоношенными IDE оболочками раздаваемыми в качестве халявы с компиляторами. А то-бы я давно с ума сошел от разых IDE. Так-что ставлю всегда ключик в командной строке выводить листинги. Но вообще-то Автор утверждал следущее :"Листинги модулей есть." Так-что разговор и пошел про просмотреть их. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 9 сентября, 2015 Опубликовано 9 сентября, 2015 (изменено) · Жалоба Банально не хватает памяти, данные в ОЗУ (обычные данные, не стек) заняли столько места, что даже под более чем скромный стек места нет. А первичная причина в том, что в ИАРе по умолчанию они не выводятся, нужно галку поставить ;) Памяти хватает. Есть 64 байт. Компилятор пишет что занято 61 байт. Учитываем глубину вложений, прерывания. Я поставил 8 байт. Хватает. Гонял программу в симуляторе на всю глубину вложений+прерывания. Остается стек данных. Листинг включен. Показаны CSTACK и RSTACK. Если смотреть по каждому файлу листинга криминала не вижу. Осталось понять, как компилятор подсчитывает память. И на какие цифры в будущем смотреть, чтобы выявить проблему. Изменено 9 сентября, 2015 пользователем demiurg1978 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Осталось понять, как компилятор подсчитывает память. Вообще-то осталось понять, что компилятор НЕ ПОДСЧИТЫВАЕТ ПАМЯТЬ выделемую для стеков! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Вообще-то осталось понять, что компилятор НЕ ПОДСЧИТЫВАЕТ ПАМЯТЬ выделемую для стеков! Вот что вы нервничаете? Мы знакомы? Ни я вам ни вы мне ничего не сделали, чтобы вы позволяли себе такую резкость. Я на си пишу не так давно. До этого писал на асме. Ессно, некоторые вещи представляют для меня некоторую трудность. Терминология опять же. Для вас-то что-то можеть быть уже пройденный вдоль и поперек этап. А мне пока некоторые вещи еще в новинку. Скажите спасибо, что не на ардуине или CVAVR проекты пишу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Вот что вы нервничаете?Да ладно. Вы тоже не переживайте))) Это у него стиль общения такой. Без zltigo на форуме последние пару лет было даже как-то пусто... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Вот что вы нервничаете? Зачем? чтобы вы позволяли себе такую резкость. Это Вы себе позволяете НЕ читать и НЕ понимать того, что Вам пишут, причем неоднократно. Я на си пишу не так давно. До этого писал на асме. Вынужден Вам сообщить, что стеки это не Си и не ACM, это контроллер. И память под эти стеки должна быть выделена, и указатели проинициализированы, хоть на чем пишите, хоть в кодах, хоть на суахили. Так-что как Вы "писали" на АСМ, сейчас видно как Вы пишите на Си :( Скажите спасибо, что не на ардуине или CVAVR проекты пишу... Спасибо. Спасибо мне ничего не стоит, в отличие от затрат времени на объяснения и повторения. Без zltigo на форуме последние пару лет было даже как-то пусто... Увы, не могу обещать, что надолго вернулся :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 9 сентября, 2015 Опубликовано 9 сентября, 2015 (изменено) · Жалоба Так-что как Вы "писали" на АСМ, сейчас видно как Вы пишите на Си Не собираюсь вам что-то доказывать. Позволили себе фи в мою сторону, хлебайте теперь. Покажите делом. Поступим просто. Я собрал проект из единственного модуля. Покажите здесь криминал. Исходные данные: 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 Изменено 9 сентября, 2015 пользователем demiurg1978 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 9 сентября, 2015 Опубликовано 9 сентября, 2015 · Жалоба Не собираюсь вам что-то доказывать. А я и не спрашивал от Вас "доказательств" чего-либо по причине нахренненужности. Позволили себе фи в мою сторону Это констатация факта, так-что включайте мозг, а не эмоции. Покажите здесь криминал. Криминал Вам уже ПОКАЗАЛ линкер, кторый сказал, что RAM затребованной Вами при написании этой программы замного будет. http://electronix.ru/forum/index.php?showt...t&p=1363816 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg1978 1 9 сентября, 2015 Опубликовано 9 сентября, 2015 (изменено) · Жалоба ... Без эмоций уже не получится, вы пришли, на две страницы затроллили нахер тему, информации до сих пор я не получил. Хорошо, вы вытрепнулись. Я вам выложил листинг. Покажите мне пальцем, ткните носом, в каком месте не хватает ОЗУ. Если вы мне не ответите на этот вопрос, идите мимо, по хорошему вас прошу. Изменено 9 сентября, 2015 пользователем demiurg1978 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться