Jump to content

    
Sign in to follow this  
IF_P

Листинг программ, подключенных по "include"

Recommended Posts

Я перевел несколько Си-шных файлов из директории проекта в один файл с main и подключил их через "include". Но теперь листинг этих программ только на ассеблере, без си-команд. Есть ли возможность видеть полный листинг, как при раздельной компиляции? Может есть какие-то настройки компилятора? Я пока ничего не нашел.

Share this post


Link to post
Share on other sites
50 минут назад, IF_P сказал:

Я перевел несколько Си-шных файлов из директории проекта в один файл с main и подключил их через "include". Но теперь листинг этих программ только на ассеблере, без си-команд.

 

Пожалуйста, напишите вопрос вразумительно. 

1. Что такое "один файл с main"?

2. "подключил их" - кого "их"? Каким образом вы этих "их" подключили куда-то, если вели речь о том что, cодержимое одних файлов вставили в какой-то другой файл (некий main.c или в котором функция main())?

3. Каких "этих программ"? У вас несколько программ (проектов)? Или о чём речь?  :wacko2:

4. А на каком ещё языке должен быть листинг если не на ассемблере? Неужели бывают листинги на других языках??? Не знал.... :umnik2: Просветите!  :wink2:

5. Что такое "си-команды"? Пишу на си уже 20+ лет, а до сих пор не знаю ни одной таковой...  :umnik2:

50 минут назад, IF_P сказал:

Есть ли возможность видеть полный листинг, как при раздельной компиляции? Может есть какие-то настройки компилятора? Я пока ничего не нашел.

IAR-ов много разных в природе. Какой у вас - спросим видимо у телепатов, когда они вернутся с карантина.

А в моём IAR for ARM v7.80.4 генерация листингов включается галкой "Output list file" в разделе "C/C++ Compiler".

 

PS: Слышал в новостях, что во время действия режима самоизоляции в РФ резко выросли продажи спиртного, но не думал что на столько сильно....  :unknw:

Share this post


Link to post
Share on other sites
1 час назад, IF_P сказал:

Я перевел несколько Си-шных файлов из директории проекта в один файл с main и подключил их через "include". Но теперь листинг этих программ только на ассеблере, без си-команд. Есть ли возможность видеть полный листинг, как при раздельной компиляции? Может есть какие-то настройки компилятора? Я пока ничего не нашел.

Действительно, на IAR ARM v7 такой эффект наблюдается. Может не стоит идти такими левыми путями и сделать стандартно, как было? И не включать ххх.с файлы через "include" ?

Share this post


Link to post
Share on other sites
11 минут назад, Baser сказал:

Действительно, на IAR ARM v7 такой эффект наблюдается. Может не стоит идти такими левыми путями и сделать стандартно, как было? И не включать ххх.с файлы через "include" ?

Если автор включил содержимое каких-то си-файлов в другой си-файл с помощью #include, то естественно листинг будет этого результирующего файла. Это не "эффект" какого-то компилятора, а так и должно быть в любом компиляторе, так как листинг генерится компилятором после препроцессинга.

Ну если только в компиляторе нет каких-то особых спец.средств на такой случай, что сомнительно.

Share this post


Link to post
Share on other sites
50 minutes ago, jcxz said:

PS: Слышал в новостях, что во время действия режима самоизоляции в РФ резко выросли продажи спиртного, но не думал что на столько сильно....  :unknw:

Не покупаю. Употребляю свое домашнее вино (умеренно).

 

Share this post


Link to post
Share on other sites
2 hours ago, IF_P said:

Я перевел несколько Си-шных файлов из директории проекта в один файл с main и подключил их через "include". Но теперь листинг этих программ только на ассеблере, без си-команд. Есть ли возможность видеть полный листинг, как при раздельной компиляции? Может есть какие-то настройки компилятора? Я пока ничего не нашел.

При появлении в исходном исполнимом коде "#include" (в смысле, не в части декларирования), возникает шизофрения с номерацией строк исходного кода.

Ни разу так не делал, даже не представляю как оно поведет себя при отладке. (как поведет себя при "шаге" F10 на(?) #include)

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:
 

Пожалуйста, напишите вопрос вразумительно. 

1. Что такое "один файл с main"?

2. "подключил их" - кого "их"? Каким образом вы этих "их" подключили куда-то, если вели речь о том что, cодержимое одних файлов вставили в какой-то другой файл (некий main.c или в котором функция main())?

3. Каких "этих программ"? У вас несколько программ (проектов)? Или о чём речь?  :wacko2:

4. А на каком ещё языке должен быть листинг если не на ассемблере? Неужели бывают листинги на других языках??? Не знал.... :umnik2: Просветите!  :wink2:

Я думал, что для специалистов будет понятно.

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

 

проект 1.jpg

проект 2.jpg

проект 3.jpg

Edited by IF_P

Share this post


Link to post
Share on other sites
3 минуты назад, IF_P сказал:

В первом варианте шла раздельная компиляция файлов, создавался листинг. Например, "delay.lst". В этом листинге присутствуют команды C с их ассемблерной мнемоникой.

Всё правильно. #include "delay.c" - команда препроцессора, выполняющаяся до компиляции. Которая делает текстовую подстановку текста файла delay.c в файл функции main(). Потом уже компилятор выполняет компиляцию результирующего файла. Файл уже - единый, значит и листинг должен быть единый.

Share this post


Link to post
Share on other sites
2 minutes ago, jcxz said:

Всё правильно. #include "delay.c" - команда препроцессора, выполняющаяся до компиляции. Которая делает текстовую подстановку текста файла delay.c в файл функции main(). Потом уже компилятор выполняет компиляцию результирующего файла. Файл уже - единый, значит и листинг должен быть единый.

Конечно, листинг единый. Но в этом листинге все, что в main() идет с Си-шной символикой и ассемблерным расширением. А все, что за пределами main(), только ассемблер. Я привел пример ф-ции delay_Ms() из файла "delay.c" и листинги для обеих вариантов

Share this post


Link to post
Share on other sites
4 минуты назад, IF_P сказал:

Конечно, листинг единый. Но в этом листинге все, что в main() идет с Си-шной символикой и ассемблерным расширением. А все, что за пределами main(), только ассемблер. Я привел пример ф-ции delay_Ms() из файла "delay.c" и листинги для обеих вариантов

Возможно содержимое этих файлов просто автоматически заинлайнилось. Так как вызываются только однажды. В таких случаях IAR for ARM как раз так и делает, насколько помню.

Попробуйте сделать несколько вызовов функции из разных мест. Чтобы она не инлайнилась.

Также можно попробовать понизить уровень оптимизации.

Share this post


Link to post
Share on other sites
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" вызывается множество раз в разных местах. А оптимизация вообще выключена.

Share this post


Link to post
Share on other sites
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

Только это очень неудобно, т.к. в листинг включаются ВСЕ хидеры на всю их вложенность :biggrin:

Edited by Baser
Добавил версию компилятора

Share this post


Link to post
Share on other sites
5 minutes ago, Baser said:

В оболочке отключаете опции в закладке List (чтобы не мешали),
и в закладке Extra Options добавляете
-lCNH main.lst

Не получается.

err.jpg

extra.jpg

Share this post


Link to post
Share on other sites
1 час назад, IF_P сказал:

Не получается.

Тогда посмотрите в руководстве по вашей версии ИАРа, есть ли там эта опция (H) в параметрах выдачи листинга. В ИАР АРМ 7.5 работает, я проверил.

Share this post


Link to post
Share on other sites
1 hour ago, Baser said:

Тогда посмотрите в руководстве по вашей версии ИАРа, есть ли там эта опция (H) в параметрах выдачи листинга. В ИАР 7.5 работает, я проверил.

Не нашел или плохо искал.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this