Компиляция приложения c ++ для Linux и прошивка его на TI TIVA TM4C123GH6PM

Я компилирую приложение в 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

0

Решение

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 без опций, вы получите помощь первого уровня, после чего они показывают другие вещи, о которых вы можете получить помощь и копать (например, передачу параметров компоновщику или ассемблеру).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]