IF_P 0 Posted May 15, 2020 · Report post Я перевел несколько Си-шных файлов из директории проекта в один файл с main и подключил их через "include". Но теперь листинг этих программ только на ассеблере, без си-команд. Есть ли возможность видеть полный листинг, как при раздельной компиляции? Может есть какие-то настройки компилятора? Я пока ничего не нашел. Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted May 15, 2020 · Report post 50 минут назад, IF_P сказал: Я перевел несколько Си-шных файлов из директории проекта в один файл с main и подключил их через "include". Но теперь листинг этих программ только на ассеблере, без си-команд. Пожалуйста, напишите вопрос вразумительно. 1. Что такое "один файл с main"? 2. "подключил их" - кого "их"? Каким образом вы этих "их" подключили куда-то, если вели речь о том что, cодержимое одних файлов вставили в какой-то другой файл (некий main.c или в котором функция main())? 3. Каких "этих программ"? У вас несколько программ (проектов)? Или о чём речь? 4. А на каком ещё языке должен быть листинг если не на ассемблере? Неужели бывают листинги на других языках??? Не знал.... Просветите! 5. Что такое "си-команды"? Пишу на си уже 20+ лет, а до сих пор не знаю ни одной таковой... 50 минут назад, IF_P сказал: Есть ли возможность видеть полный листинг, как при раздельной компиляции? Может есть какие-то настройки компилятора? Я пока ничего не нашел. IAR-ов много разных в природе. Какой у вас - спросим видимо у телепатов, когда они вернутся с карантина. А в моём IAR for ARM v7.80.4 генерация листингов включается галкой "Output list file" в разделе "C/C++ Compiler". PS: Слышал в новостях, что во время действия режима самоизоляции в РФ резко выросли продажи спиртного, но не думал что на столько сильно.... Quote Ответить с цитированием Share this post Link to post Share on other sites
Baser 0 Posted May 15, 2020 · Report post 1 час назад, IF_P сказал: Я перевел несколько Си-шных файлов из директории проекта в один файл с main и подключил их через "include". Но теперь листинг этих программ только на ассеблере, без си-команд. Есть ли возможность видеть полный листинг, как при раздельной компиляции? Может есть какие-то настройки компилятора? Я пока ничего не нашел. Действительно, на IAR ARM v7 такой эффект наблюдается. Может не стоит идти такими левыми путями и сделать стандартно, как было? И не включать ххх.с файлы через "include" ? Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted May 15, 2020 · Report post 11 минут назад, Baser сказал: Действительно, на IAR ARM v7 такой эффект наблюдается. Может не стоит идти такими левыми путями и сделать стандартно, как было? И не включать ххх.с файлы через "include" ? Если автор включил содержимое каких-то си-файлов в другой си-файл с помощью #include, то естественно листинг будет этого результирующего файла. Это не "эффект" какого-то компилятора, а так и должно быть в любом компиляторе, так как листинг генерится компилятором после препроцессинга. Ну если только в компиляторе нет каких-то особых спец.средств на такой случай, что сомнительно. Quote Ответить с цитированием Share this post Link to post Share on other sites
IF_P 0 Posted May 15, 2020 · Report post 50 minutes ago, jcxz said: PS: Слышал в новостях, что во время действия режима самоизоляции в РФ резко выросли продажи спиртного, но не думал что на столько сильно.... Не покупаю. Употребляю свое домашнее вино (умеренно). Quote Ответить с цитированием Share this post Link to post Share on other sites
k155la3 0 Posted May 15, 2020 · Report post 2 hours ago, IF_P said: Я перевел несколько Си-шных файлов из директории проекта в один файл с main и подключил их через "include". Но теперь листинг этих программ только на ассеблере, без си-команд. Есть ли возможность видеть полный листинг, как при раздельной компиляции? Может есть какие-то настройки компилятора? Я пока ничего не нашел. При появлении в исходном исполнимом коде "#include" (в смысле, не в части декларирования), возникает шизофрения с номерацией строк исходного кода. Ни разу так не делал, даже не представляю как оно поведет себя при отладке. (как поведет себя при "шаге" F10 на(?) #include) Quote Ответить с цитированием Share this post Link to post Share on other sites
IF_P 0 Posted May 15, 2020 (edited) · Report post 1 hour ago, jcxz said: Пожалуйста, напишите вопрос вразумительно. 1. Что такое "один файл с main"? 2. "подключил их" - кого "их"? Каким образом вы этих "их" подключили куда-то, если вели речь о том что, cодержимое одних файлов вставили в какой-то другой файл (некий main.c или в котором функция main())? 3. Каких "этих программ"? У вас несколько программ (проектов)? Или о чём речь? 4. А на каком ещё языке должен быть листинг если не на ассемблере? Неужели бывают листинги на других языках??? Не знал.... Просветите! Я думал, что для специалистов будет понятно. IAR AVR 6.80.1 Вначале файлы были в директории самого проекта ("проект 1.jpg" ). Файлы - это набор п/п, например для работы с com-портом или FRAM-памятью ит.д. А потом я перенес их в общий файл с ф-цией main() и подключил по "include". Например, вот так #include <ioavr.h> #include <inavr.h> #include <pgmspace.h> #include "main.h" #include "TWI_Master.h" #include "delay.c" #include "klaviatp.c" /*******************************************************************************/ #pragma vector=TIMER1_OVF_vect __interrupt void Timer1_Interrupt(void ) { static uint8_t counter_T1; counter_T1++; if (counter_T1 == 56 && flag_t1_end != 1) { TCNT1 = 0xBFFF; counter_T1 = 0; flag_t1_end = 1; return; } if (flag_t1_end == 1) { counter_T1 = 0; flag_t1_end = 0; counter_sec++; } if (counter_sec == 2) { counter_sec = 0; flag_second = 1; second++; } if (second >= 60) { second = 0; flag_minute = 1; } } /*******************************************************************************/ uint8_t TWI_Act_On_Failure_In_Last_Transmission ( uint8_t TWIerrorMsg ) { if ( (TWIerrorMsg == TWI_MTX_ADR_NACK) | (TWIerrorMsg == TWI_MRX_ADR_NACK) ) { error_TWI++; if (error_TWI > 16) { TWI_statusReg.lastTransOK = TRUE; error_TWI = 0; } else { TWI_Start_Transceiver(); } } return TWIerrorMsg; } /******************************************************************************* * MAIN * *******************************************************************************/ void main (void) { TWI_Master_Initialise(); __enable_interrupt(); Init_Const(); Init_Timer(); Init_Com_1(); В первом варианте шла раздельная компиляция файлов, создавался листинг. Например, "delay.lst". В этом листинге присутствуют команды C с их ассемблерной мнемоникой ("проект 3.jpg" ) Во втором варианте получил вот такой листинг: \ In segment CODE, align 2, keep-with-next \ __version_3 void Delay_Ms(unsigned int) \ Delay_Ms: \ 00000000 2F39 MOV R19, R25 \ 00000002 2F48 MOV R20, R24 \ 00000004 E081 LDI R24, 1 \ 00000006 E090 LDI R25, 0 \ ??Delay_Ms_0: \ 00000008 1708 CP R16, R24 \ 0000000A 0719 CPC R17, R25 \ 0000000C F058 BRCS ??Delay_Ms_1 \ 0000000E E0E1 LDI R30, 1 \ 00000010 E0F0 LDI R31, 0 \ ??Delay_Ms_2: \ 00000012 39E8 CPI R30, 152 \ 00000014 E023 LDI R18, 3 \ 00000016 07F2 CPC R31, R18 \ 00000018 F418 BRCC ??Delay_Ms_3 \ 0000001A 0000 NOP \ 0000001C 9631 ADIW R31:R30, 1 \ 0000001E CFF9 RJMP ??Delay_Ms_2 \ ??Delay_Ms_3: \ 00000020 9601 ADIW R25:R24, 1 \ 00000022 CFF2 RJMP ??Delay_Ms_0 \ ??Delay_Ms_1: \ 00000024 2F84 MOV R24, R20 \ 00000026 2F93 MOV R25, R19 \ 00000028 9508 RET Edited May 15, 2020 by IF_P Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted May 15, 2020 · Report post 3 минуты назад, IF_P сказал: В первом варианте шла раздельная компиляция файлов, создавался листинг. Например, "delay.lst". В этом листинге присутствуют команды C с их ассемблерной мнемоникой. Всё правильно. #include "delay.c" - команда препроцессора, выполняющаяся до компиляции. Которая делает текстовую подстановку текста файла delay.c в файл функции main(). Потом уже компилятор выполняет компиляцию результирующего файла. Файл уже - единый, значит и листинг должен быть единый. Quote Ответить с цитированием Share this post Link to post Share on other sites
IF_P 0 Posted May 15, 2020 · Report post 2 minutes ago, jcxz said: Всё правильно. #include "delay.c" - команда препроцессора, выполняющаяся до компиляции. Которая делает текстовую подстановку текста файла delay.c в файл функции main(). Потом уже компилятор выполняет компиляцию результирующего файла. Файл уже - единый, значит и листинг должен быть единый. Конечно, листинг единый. Но в этом листинге все, что в main() идет с Си-шной символикой и ассемблерным расширением. А все, что за пределами main(), только ассемблер. Я привел пример ф-ции delay_Ms() из файла "delay.c" и листинги для обеих вариантов Quote Ответить с цитированием Share this post Link to post Share on other sites
jcxz 0 Posted May 15, 2020 · Report post 4 минуты назад, IF_P сказал: Конечно, листинг единый. Но в этом листинге все, что в main() идет с Си-шной символикой и ассемблерным расширением. А все, что за пределами main(), только ассемблер. Я привел пример ф-ции delay_Ms() из файла "delay.c" и листинги для обеих вариантов Возможно содержимое этих файлов просто автоматически заинлайнилось. Так как вызываются только однажды. В таких случаях IAR for ARM как раз так и делает, насколько помню. Попробуйте сделать несколько вызовов функции из разных мест. Чтобы она не инлайнилась. Также можно попробовать понизить уровень оптимизации. Quote Ответить с цитированием Share this post Link to post Share on other sites
IF_P 0 Posted May 15, 2020 · Report post 22 minutes ago, k155la3 said: При появлении в исходном исполнимом коде "#include" (в смысле, не в части декларирования), возникает шизофрения с номерацией строк исходного кода. Ни разу так не делал, даже не представляю как оно поведет себя при отладке. (как поведет себя при "шаге" F10 на(?) #include) У меня все работает. ... else { TWI_Act_On_Failure_In_Last_Transmission( TWI_Get_State_Info( ) ); } } // if ( ! TWI_Transceiver_Busy() ) #include "main_prog.c" } } // end main() Но здесь уже "main_prog.c" не функция, а кусок программы. Отладку делаю в Proteus. 3 minutes ago, jcxz said: Возможно содержимое этих файлов просто автоматически заинлайнилось. Так как вызываются только однажды. В таких случаях IAR for ARM как раз так и делает, насколько помню. Попробуйте сделать несколько вызовов функции из разных мест. Чтобы она не инлайнилась. Также можно попробовать понизить уровень оптимизации. Функция "delay_Ms()" из файла "delay.c" вызывается множество раз в разных местах. А оптимизация вообще выключена. Quote Ответить с цитированием Share this post Link to post Share on other sites
Baser 0 Posted May 15, 2020 (edited) · Report post 2 часа назад, IF_P сказал: Я думал, что для специалистов будет понятно. Да все у вас понятно написано, не переживайте. Вообщем, есть такая опция у компилятора IAR ARM v7.5 , просто ее нет в графической оболочке. Цитата H - Include source lines from header files in output. Without this option, only source lines from the primary source file are included В оболочке отключаете опции в закладке List (чтобы не мешали), и в закладке Extra Options добавляете -lCNH main.lst Только это очень неудобно, т.к. в листинг включаются ВСЕ хидеры на всю их вложенность Edited May 15, 2020 by Baser Добавил версию компилятора Quote Ответить с цитированием Share this post Link to post Share on other sites
IF_P 0 Posted May 15, 2020 · Report post 5 minutes ago, Baser said: В оболочке отключаете опции в закладке List (чтобы не мешали), и в закладке Extra Options добавляете -lCNH main.lst Не получается. Quote Ответить с цитированием Share this post Link to post Share on other sites
Baser 0 Posted May 15, 2020 · Report post 1 час назад, IF_P сказал: Не получается. Тогда посмотрите в руководстве по вашей версии ИАРа, есть ли там эта опция (H) в параметрах выдачи листинга. В ИАР АРМ 7.5 работает, я проверил. Quote Ответить с цитированием Share this post Link to post Share on other sites
IF_P 0 Posted May 15, 2020 · Report post 1 hour ago, Baser said: Тогда посмотрите в руководстве по вашей версии ИАРа, есть ли там эта опция (H) в параметрах выдачи листинга. В ИАР 7.5 работает, я проверил. Не нашел или плохо искал. Quote Ответить с цитированием Share this post Link to post Share on other sites