После компиляции некоторого кода компилятор генерирует кучу файлов. У меня есть статистика, символы, дерево вызовов, ошибки, список, debug и exe. Я выяснил, что означает каждый, кроме файла списка. Какова функция файла списка. Это для пользователя или самого компьютера/встроенной системы?Список файлов в C (.LST)
ответ
Точное содержание файла списка незначительно варьируется в зависимости от инструмента и чип используется.
Основной частью файла будет перевод исходного кода С в инструкции по сборке, выполненные компилятором. Это полезно для отладки кода и проверки эффективности компилятора при переводе определенных конструкций исходного кода. В приведенном ниже примере каждому 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