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

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

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

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


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

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:

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


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

1 час назад, IF_P сказал:

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

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

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


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

11 минут назад, Baser сказал:

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

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

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

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


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

50 minutes ago, jcxz said:

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

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

 

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


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

2 hours ago, IF_P said:

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

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

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

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


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

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

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

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


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

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

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

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

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


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

2 minutes ago, jcxz said:

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

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

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


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

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

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

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

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

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

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


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

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

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


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

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:

Изменено пользователем Baser
Добавил версию компилятора

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


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

5 minutes ago, Baser said:

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

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

err.jpg

extra.jpg

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


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

1 час назад, IF_P сказал:

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

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

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


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

1 hour ago, Baser said:

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

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

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


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

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

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

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

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

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

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

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

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

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