После компиляции некоторого кода компилятор генерирует кучу файлов. У меня есть статистика, символы, дерево вызовов, ошибки, список, отладка и exe. Я понял, что означает каждое из них, за исключением файла списка. Какова функция файла списка. Это для пользователя или самого компьютера/встроенной системы?
Список файлов в C (.LST)
Ответы (2)
Точное содержимое файла списка немного зависит от используемого инструмента и чипа.
Большая часть файла будет переводом исходного кода C в инструкции по ассемблеру, выполненным компилятором. Это полезно для отладки кода и проверки эффективности компилятора при переводе определенных конструкций исходного кода. В приведенном ниже примере каждому Cline присвоен номер строки, а за ним указан ассемблер. (это пример для процессора AVR32).
171 /**********************************************************
172 * Test for a receive interrupt
173 **********************************************************/
174 if ( USART_CHANNEL[ Channel ] -> CSR.rxrdy )
000008 F8051502 LSL R5,R12,0x2
00000C ........ MOV R7,LWRD(USART_CHANNEL)
000010 EA17.... ORH R7,HWRD(USART_CHANNEL)
000014 EE0C0027 ADD R7,R7,R12<<0x2
000018 6E0C LD.w R12,R7[0x0]
00001A ........ MOV R6,LWRD(Serial_Receive_Queue)
00001E EA16.... ORH R6,HWRD(Serial_Receive_Queue)
000022 785B LD.w R11,R12[0x14]
000024 A19B LSR R11,0x1
000026 C0B2 BRCC ??USART_Process_Interrupt_1:C
HEX-значения, показанные выше как "....", представляют собой адреса, неизвестные во время компиляции, это символы, которые будут разрешены во время компоновки.
Файл списка также обычно предоставляет некоторую статистику, касающуюся размера кода, требований к оперативной памяти и использования стека для компилируемого модуля. Снова набор инструментов IAR для AVR32
Максимальное использование стека в байтах:
Function CSTACK
-------- ------
Serial_Ports_Initialise 36
-> gpio_enable_module 36
-> usart_init_rs232 36
-> Indirect call 36
-> Indirect call 36
-> Indirect call 36
-> Indirect call 36
Serial_Transmit_With_Length 20
-> xQueueGenericSend 20
-> vTaskDelay 20
USART0_INT_Handler 0
-> USART_Process_Interrupt 0
USART1_INT_Handler 0
-> USART_Process_Interrupt 0
USART2_INT_Handler 0
-> USART_Process_Interrupt 0
USART_Process_Interrupt 32
-> xQueueGenericSendFromISR 32
-> xQueueReceiveFromISR 32
Segment part sizes:
Function/Label Bytes
-------------- -----
Serial_Receive_Queue 24
Serial_Transmit_Queue
USART_CHANNEL 12
USART0_INT_Handler 8
USART1_INT_Handler 8
USART2_INT_Handler 12
USART_Process_Interrupt 112
Serial_Ports_Initialise 172
USART_Channel_In_Use 56
USART_GPIO_MAP
USART_OPTIONS
Serial_Transmit_With_Length 116
?<Initializer for USART_CHANNEL> 12
??USART1_INT_Handler??handle 4
Others 24
400 bytes in segment CODE32
56 bytes in segment DATA32_C
12 bytes in segment DATA32_I
12 bytes in segment DATA32_ID
24 bytes in segment DATA32_Z
28 bytes in segment EVSEG
4 bytes in segment HTAB
24 bytes in segment INITTAB
400 bytes of CODE memory
100 bytes of CONST memory (+ 24 bytes shared)
36 bytes of DATA memory
Errors: none
Warnings: 1
Также будут любые сообщения об ошибках или предупреждения, вставленные в соответствующую строку кода.
Таким образом, файл списка может использоваться в качестве вспомогательного средства для оценки использования стека и памяти, хотя использование стека является очень трудноразрешимой проблемой в любой встроенной системе и для просмотра кода уровня ассемблера, созданного компилятором.
Судя по опыту, файл списка не особенно полезен при использовании инструмента отладки на уровне исходного кода - обычно он показывает непосредственно соответствующий дизассемблированный код.
Файл списка (.LST) содержит блок кода C [закомментированный последовательностью символов точки], за которым следует ассемблерный код для этого блока.
Например:
.................... return FALSE;
0046: MOVLW 00
0047: MOVWF 21
0048: GOTO 049