Список файлов в C (.LST)

После компиляции некоторого кода компилятор создает кучу файлов. У меня есть статистика, символы, дерево вызовов, ошибки, список, debug и exe. Я выяснил, что означает каждый, кроме файла списка. Какова функция файла списка. Это для пользователя или самого компьютера / встроенной системы?

Точное содержимое файла списка немного меняется при использовании инструмента и чипа.

Основной частью файла будет перевод исходного кода С в инструкции по сборке, выполненные компилятором. Это полезно для отладки кода и проверки эффективности компилятора при переводе определенных конструкций исходного кода. В приведенном ниже примере каждому 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 ? 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