Я компилирую приложение в Linux с помощью Makefile. Мой компилятор из Импера (мир ovp). После компиляции приложения я получаю файл * .elf, который я хочу прошить на TI TIVA TM4C123GH6PM с программным обеспечением Uniflash от TI.
Я всегда получаю эту ошибку, когда пытаюсь проверить изображение: «[ОШИБКА] CORTEX_M4_0: Загрузчик файла: Ошибка проверки: значения по адресу 0x00008000 не совпадают. Проверьте целевую память и карту памяти».
Мой Makefile выглядит так:
////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////
IMPERAS_HOME: = $ (shell getpath.exe «$ (IMPERAS_HOME)»)
include $ (IMPERAS_HOME) /bin/Makefile.include
ifndef IMPERAS_HOME
IMPERAS_ERROR: = $ (ошибка «IMPERAS_HOME не определена»)
ENDIF
Перекрестная = ARM_CORTEX_M4F
-include $ (IMPERAS_HOME) / lib / $ (IMPERAS_ARCH) / CrossCompiler / $ (CROSS) .makefile.include
ifeq ($ ($ (CROSS) _CXX),)
IMPERAS_ERROR: = $ (ошибка «Пожалуйста, установите цепочку инструментов для поддержки $ (CROSS)»)
ENDIF
ОПТИМИЗАЦИЯ = -Os
SRC = $ (sort $ (wildcard main.cpp)) $ (sort $ (подстановочный знак Configuration / Configuration.cpp)) $ (sort $ (подстановочный знак Segway / Simulation.cpp)) $ (sort $ (подстановочный знак Segway / Segway.cpp )) $ (sort $ (подстановочный знак Sensor / ADC.cpp)) $ (sort $ (подстановочный знак Sensor / ADCSensor.cpp)) $ (sort $ (подстановочный знак Antrieb / Motor.cpp)) $ (sort $ (подстановочный знак Sensor / GPIOSensor .cpp)) $ (sort $ (подстановочный знак Timer / Timer.cpp)) $ (sort $ (подстановочный знак Antrieb / PWM.cpp))
EXE = application.ARM_CORTEX_M4F.elf
все: $ (EXE)
% .elf: main.o Segway / Segway.o Таймер / Timer.o Датчик / ADC.o Датчик / ADCSensor.o Датчик / GPIOSensor.o Конфигурация / Конфигурация.o Antrieb / Motor.o Antrieb / PWM.o
$ (V) echo «# Linking $ @» $ (V) $ (IMPERAS_LINKXX) -o $ @ $ ^ $ (IMPERAS_LDFLAGS)
% .o:% .cpp
$ (V) echo «# Компиляция $<«$ (V) $ (IMPERAS_CXX) -g -c -o $ @ $< $ (ОПТИМИЗАЦИЯ) -lm
чистить:
-rm -f * .elf * .o
realclean: чистый
-rm -f * .log
////////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// ///////////////
Как я могу включить карту памяти в мой Makefile? Карта памяти определяется в файле * .cmd. Вот ссылка на файл: https://github.com/LuisAfonso95/TM4C123-Launchpad-Examples/blob/master/srf04/tm4c123gh6pm.cmd
У кого-нибудь есть решение моей проблемы и может ли он мне помочь?
Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.
Спасибо!
Johannes
Makefile
ARMGNU = arm-none-eabi
AOPS = --warn --fatal-warnings -mcpu=cortex-m4
COPS = -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -mcpu=cortex-m4
all : so.bin
clean:
rm -f *.bin
rm -f *.o
rm -f *.elf
rm -f *.list
flash.o : flash.s
$(ARMGNU)-as $(AOPS) flash.s -o flash.o
so.o : so.c
$(ARMGNU)-gcc $(COPS) -mthumb -c so.c -o so.o
so.bin : flash.ld flash.o so.o
$(ARMGNU)-ld -o so.elf -T flash.ld flash.o so.o
$(ARMGNU)-objdump -D so.elf > so.list
$(ARMGNU)-objcopy so.elf so.bin -O binary
flash.ld
MEMORY
{
rom : ORIGIN = 0x00000000, LENGTH = 0x1000
ram : ORIGIN = 0x20000000, LENGTH = 0x1000
}
SECTIONS
{
.text : { *(.text*) } > rom
.rodata : { *(.rodata*) } > rom
.bss : { *(.bss*) } > ram
}
flash.s
.thumb
.thumb_func
.global _start
_start:
stacktop: .word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.thumb_func
reset:
bl notmain
b hang
.thumb_func
hang: b .
.thumb_func
.globl PUT32
PUT32:
str r1,[r0]
bx lr
so.c
extern void PUT32 ( unsigned int, unsigned int );
int notmain ( void )
{
PUT32(0x20000400,0x12345678);
return(0);
}
делать
arm-none-eabi-as --warn --fatal-warnings -mcpu=cortex-m4 flash.s -o flash.o
arm-none-eabi-gcc -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding -mcpu=cortex-m4 -mthumb -c so.c -o so.o
arm-none-eabi-ld -o so.elf -T flash.ld flash.o so.o
arm-none-eabi-objdump -D so.elf > so.list
arm-none-eabi-objcopy so.elf so.bin -O binary
Изучите разборку, чтобы увидеть, что таблица векторов находится в нужном месте и построена правильно, может добавить глобальную переменную и сохранить ее значение (время выполнения), чтобы увидеть, что она также находится в правильном месте, если хотите.
Disassembly of section .text:
00000000 <_start>:
0: 20001000 andcs r1, r0, r0
4: 00000041 andeq r0, r0, r1, asr #32
8: 00000047 andeq r0, r0, r7, asr #32
c: 00000047 andeq r0, r0, r7, asr #32
10: 00000047 andeq r0, r0, r7, asr #32
14: 00000047 andeq r0, r0, r7, asr #32
18: 00000047 andeq r0, r0, r7, asr #32
1c: 00000047 andeq r0, r0, r7, asr #32
20: 00000047 andeq r0, r0, r7, asr #32
24: 00000047 andeq r0, r0, r7, asr #32
28: 00000047 andeq r0, r0, r7, asr #32
2c: 00000047 andeq r0, r0, r7, asr #32
30: 00000047 andeq r0, r0, r7, asr #32
34: 00000047 andeq r0, r0, r7, asr #32
38: 00000047 andeq r0, r0, r7, asr #32
3c: 00000047 andeq r0, r0, r7, asr #32
00000040 <reset>:
40: f000 f804 bl 4c <notmain>
44: e7ff b.n 46 <hang>
00000046 <hang>:
46: e7fe b.n 46 <hang>
00000048 <PUT32>:
48: 6001 str r1, [r0, #0]
4a: 4770 bx lr
0000004c <notmain>:
4c: b508 push {r3, lr}
4e: 4903 ldr r1, [pc, #12] ; (5c <notmain+0x10>)
50: 4803 ldr r0, [pc, #12] ; (60 <notmain+0x14>)
52: f7ff fff9 bl 48 <PUT32>
56: 2000 movs r0, #0
58: bd08 pop {r3, pc}
5a: bf00 nop
5c: 12345678 eorsne r5, r4, #120, 12 ; 0x7800000
60: 20000400 andcs r0, r0, r0, lsl #8
Хорошо смотрится таблица векторов в нужном месте, lsbit задает адреса таблиц векторов и т. Д.
Это очень универсальная программа cortex-m, которая должна работать практически на всех ядрах, некоторые из которых вам, возможно, придется уменьшить указатель стека init до 0x20000800 или меньше, аналогично укажите cortex-m0 в командной строке вместо m4, чтобы сделать его гораздо более универсальным , в этом случае он не генерировал никаких расширений armv7-m thumb2.
Посмотрите, что ваш инструмент говорит о сгенерированном файле so.elf, он становится проще, чем этот (удалите bl notmain), и только связывает flash.s в эльф, но не намного проще, чем этот. Если это не работает, то проблема может быть в чем-то другом, инструмент может что-то искать. Если это действительно часть tiva c, то, возможно, инструмент lm4flash сработает, и вам не понадобится какой-либо графический интерфейс, иначе openocd должен работать, если у вас есть решение SWD (st ядро или доска обнаружения, или вы работаете на панели запуска ti, или разделитель jlink или ftdi с правой частью ftdi (поддерживающей mpsse, а напряжения — правильный уровень для вашей цели). Если это не работает, возможно, инструмент ищет что-то особенное в файле elf, которое обычно не требуется Я предполагаю, прежде чем спросить здесь, вы посмотрели это сообщение об ошибке?
если он загружается и запускается, и если у вас есть отладчик, вы можете остановить процессор и прочитать 0x20000400, и вы должны увидеть 0x12345678, записанный программой, как дополнительное подтверждение того, что программа загрузилась и запустилась. Затем проверьте мой make-файл, скрипт компоновщика и где он используется в процессе компиляции против вашего.
Если вы пытаетесь вызвать всю цепочку инструментов с помощью gcc, то вам нужно знать кое-что еще, например:
arm-whatever-gcc other flags, -Xlinker '-T flash.ld' flash.s so.c -o so.elf
в основном один или два -Xlinker или любой другой правильный параметр командной строки, я думаю, я использую один -Xlinker для каждого параметра ld (-Xlinker -T -Xlinker flash.ld, но YMMV, у меня почти никогда нет gcc, выполняющего эту дополнительную работу, если Я могу избежать этого, предпочитая вызывать их напрямую, я позволю gcc вызвать ассемблер, чтобы сделать скомпилированный вывод объектом, но кроме этого …). Просто запустив gcc без опций, вы получите помощь первого уровня, после чего они показывают другие вещи, о которых вы можете получить помощь и копать (например, передачу параметров компоновщику или ассемблеру).
Других решений пока нет …