Подскажите по Keil MDK-ARM Замучился с ним.
Оказывается, он в строке int i; переменную i кладёт не в .bss, а в .data. Ладно, день потратил, разобрался. Надо было дать опцию компилятора --bss_threshold=0.
Ещё проблема.
Есть часть кода, работающая из ОЗУ, я её размещаю в секции .fastcode. Программа не работает. Полдня рыл, и нарыл: при формировании hex (s19) файла из выходного .axf начинает появляться информация в области памяти FLASH, откуда она будет копироваться в ОЗУ стартапными кейловскими файлами. Соответственно, при запуске стартапный код берёт из флэша необходимые данные и тупо копирует её в ОЗУ, где размещается .fastcode. Логичное поведение. Однако, если я не формирую hex, а начинаю отладку посредством gdb из эклипса, то данные в флэш для секции .fastcode отсутствуют (их просто нет). gdbserver от JLink честно сообщает, что секция .fastcode выходит за границы ELF сегмента (warning: Loadable segment "ER_FASTCODE" outside of ELF segments).
Вопрос: кто виноват и что делать?
Вариант1: виноват кейл. Благо просмотр размера секций в выходном .axf файле показывает, что да, действительно, секция ER2 не содержит данных для инициализации других секций, и gdb сервер често выполняет свои действия по программированию секции ER2.
Почему в секции ER2 нет данных для инициализации секции .fastcode?
Прикладываю .map файл, а также вывод информации о размере секций в .axf файле.
.sct файл:
#! armcc -E ; code upper need to use #define ;------------------------------------------------------------------------------------- ; Keil scatter loading file ; For AT91SAM7A3 ;------------------------------------------------------------------------------------- #define FLASH_START (0x00100000) #define FLASH_END (0x00140000) #define FLASH_SIZE (FLASH_END-FLASH_START) ; адрес размещения сервисной таблицы #define FLASH_SRVCTBL 0x0013E700 ; адрес размещения таблицы преобразования "давление-поток" #define FLASH_FEXPTBL 0x0013E800 ; адрес размещения таблицы преобразования генератора потока #define FLASH_FGTBL 0x0013F000 ; Internal SRAM #define RAM_START 0x00200000 #define RAM_END 0x00208000 #define RAM_SIZE (RAM_END-RAM_START) ; посчитанное значение стеков из файла SAM7A3.asm ; место резервируется в SAM7A3.asm в секции STACK #define IRQ_STACKSIZE 0x540 ; Load region for main program LR1 FLASH_START FLASH_SIZE { ER_SRVCTBL FLASH_SRVCTBL UNINIT (FLASH_FEXPTBL-FLASH_SRVCTBL) { *.o(.rodata_service_flash) } ER_FEXPTBL FLASH_FEXPTBL UNINIT (FLASH_FGTBL-FLASH_FEXPTBL) { *.o(.rodata_flow_sensor) } ER_FGTBL FLASH_FGTBL UNINIT (FLASH_END-FLASH_FGTBL) { *.o(.rodata_flow_gen) } ER2 FLASH_START { *.o (.reset, +First) *(InRoot$$Sections) *(+RO) } ER_STACK (RAM_END-IRQ_STACKSIZE) RAM_SIZE { *.o(STACK) } ER_FASTCODE RAM_START NOCOMPRESS RAM_SIZE { *.o(.fastcode) } ER3 +0 (RAM_SIZE-ImageLength(ER_STACK)-ImageLength(ER_FASTCODE)) { *.o (.critical) } ER4 +0 (RAM_SIZE-ImageLength(ER3)-ImageLength(ER_STACK)-ImageLength(ER_FASTCODE)) { *.o (.criticalCRC) } ER5 +0 NOCOMPRESS (RAM_SIZE-ImageLength(ER3)-ImageLength(ER4)-ImageLength(ER_STACK)-ImageLength(ER_FASTCODE)) { *.o(+RW +ZI) } }Вот ещё вывод arm-none-eabi-readelf -e tst.axf
ELF Header: Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 Class: ELF32 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: ARM Version: 0x1 Entry point address: 0x100058 Start of program headers: 743232 (bytes into file) Start of section headers: 743264 (bytes into file) Flags: 0x5000002, has entry point, Version5 EABI Size of this header: 52 (bytes) Size of program headers: 32 (bytes) Number of program headers: 1 Size of section headers: 40 (bytes) Number of section headers: 23 Section header string table index: 22 Section Headers: [Nr] Name Type Addr Off Size ES Flg Lk Inf Al [ 0] NULL 00000000 000000 000000 00 0 0 0 [ 1] ER_SRVCTBL NOBITS 0013e700 000034 0000ac 00 WA 0 0 4 [ 2] ER_FEXPTBL NOBITS 0013e800 000034 0007d0 00 WA 0 0 4 [ 3] ER_FGTBL NOBITS 0013f000 000034 000ea8 00 WA 0 0 4 [ 4] ER2 PROGBITS 00100000 000034 027ea8 00 AX 0 0 8 [ 5] ER_STACK NOBITS 00207ac0 027edc 000540 00 WA 0 0 8 [ 6] ER_FASTCODE PROGBITS 00200000 027edc 00187c 00 AX 0 0 4 [ 7] ER3 NOBITS 0020187c 029758 0000c4 00 WA 0 0 4 [ 8] ER4 NOBITS 00201940 029758 000004 00 WA 0 0 4 [ 9] ER5 PROGBITS 00201944 029758 000078 00 WA 0 0 4 [10] ER5 NOBITS 002019bc 0297d0 0047ac 00 WA 0 0 8 [11] .debug_abbrev PROGBITS 00000000 0297d0 0005a4 00 0 0 1 [12] .debug_frame PROGBITS 00000000 029d74 0049cc 00 0 0 1 [13] .debug_info PROGBITS 00000000 02e740 029ae8 00 0 0 1 [14] .debug_line PROGBITS 00000000 058228 018158 00 0 0 1 [15] .debug_loc PROGBITS 00000000 070380 00ba8c 00 0 0 1 [16] .debug_macinfo PROGBITS 00000000 07be0c 01e0d0 00 0 0 1 [17] .debug_pubnames PROGBITS 00000000 099edc 0090ec 00 0 0 1 [18] .symtab SYMTAB 00000000 0a2fc8 00ae10 10 19 1658 4 [19] .strtab STRTAB 00000000 0addd8 007214 00 0 0 1 [20] .note NOTE 00000000 0b4fec 000038 00 0 0 4 [21] .comment PROGBITS 00000000 0b5024 000650 00 0 0 1 [22] .shstrtab STRTAB 00000000 0b5674 0000cc 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings) I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown) O (extra OS processing required) o (OS specific), p (processor specific) Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000034 0x00100000 0x00100000 0x2979c 0x2fc74 RWE 0x8 Section to Segment mapping: Segment Sections... 00 ER22. Виноват gdb. Потому что информация об адресе загрузки ER_FASTCODE есть в .axf, но её не понимает gdb. Зато её понимает утилита fromelf, которая из .axf получает .hex. Похоже, что надо из .axf получать .hex, сторонней утилитой программировать, и затем отлаживать. GDB -- жалкая поделка финских студентов!!! (c) (tm) fk0
-
- А если использовать J-link и встроенный отладчик? - Vladimir Ljaschko(30.04.2014 21:59)