LINUX.ORG.RU

CortexM3. С чего начать.

 , ,


1

2

Всем доброго времени суток.

На полке в шкафу откопал вот такую вот платку ( http://www.starterkit.ru/html/index.php?name=shop&op=view&id=5 ) на основе LPC1788 от NXP и решил попробовать реализовать свою детскую мечту и помигать светодиодиками. В наличии так же имеется SEGGER J-Link ARM, которым планируется плату прошивать.

Но в итоге я так и не смог понять, откуда мне стоит начинать свои изыскания. В интернете хватает статей о том, как написать код для этой/подобной платы. Я уже успел поставить себе LPCXpresso.

Вся проблема в том, что я не очень хорошо себе представляю, что должно произойти с моим кодом, чтобы он начал выполнятся на плате.

1. Скомпилировать (каким компилятором?)
2. Слинковать в исполняемый файл/готовую прошивку (чем это сделать?)
3. (самое сложное) Как залить исполняемый код на плату.

LPCXpresso может скомпилировать и слинковать нечто, но после уверенно сообщает о том, что ни одна плата к PC не подключена и заливать/запускать код отказывается наотрез.

Собственно буду благодарен за любую помощь, в том числе за ссылки на иностранном языке.

P.S. Нашел в репозиториях openocd, возможно это то, что необходимо для «заливки» кода на плату? Официальные утилиты от SEGGER скачать не получается, т.к. программатор покупался у местных перекупщиков, которые выдают его за свое творение и теперь невозможно узнать его реальный серийный номер.

Для пришедших за информацией - вот полезные ссылки

http://pygmy.utoh.org/riscy/cortex/led-lpc17xx.html - есть скрипт линкера и, видимо, куча другой полезной инфы - все же неправильный

http://we.easyelectronics.ru/CADSoft/ubuntu-eclipse-code-sourcery-openocd-j-l... - описание, как настроить среду для работы в Ubuntu

http://we.easyelectronics.ru - тут вообще много полезных статей

Внутри темы есть правильный скрипт для линкера и ссылки на правильный startup.S В скрипте необходимо будет сделать небольшие изменения, информация об этом так же есть в теме ниже.

★★★★★

Последнее исправление: CYB3R (всего исправлений: 3)

Я с STM'овскими помаленьку разбираюсь. На работе 2 макетки: на F103 и на F407. Быдлокод выкладываю на сосфорж. Если интересно — смотри исходники.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Так дело-то сейчас не в исходниках, они как бы уже есть. Сейчас проблема - чем все это собрать и как все это залить/запустить.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

чем все это собрать

arm-none-eabi

как все это залить

st-flash

запустить

reset на платке нажать, если программатор его автоматом не "нажмет"

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

кстати, относительно недавно стал доступен для заказа кит STM32F429I-DISCO

qbe
()
Ответ на: комментарий от Eddy_Em

статья вполне пойдёт для начального понимания, как запускать связку openocd + segger j-link.

qbe
()

С LPC за***шься, тем более с таким сетапом. Общий подход - собрать gcc (кроссом для арма) с нужным startup.s под твой камень и ld скриптом (гугли), далее objcopy в bin или ihex, в зависимости от того, что жрет программа пошива, далее оной прогой во флеш мк.

ncrmnt ★★★★★
()
Ответ на: комментарий от ncrmnt

А вообще STM32 от LPC сильно отличается. Другой LD, другие скрипты, и совсем другая периферия. У мемня кстати в antares поддержки LPC нема, так как нема хардвари под рукой. Щупал их только под виндой во времена arm7tdmi.

ncrmnt ★★★★★
()
Ответ на: комментарий от ncrmnt

Видел это, но использовать не решился. Пока скатываюсь только до использования готовых заголовков и некторых сторонних библиотек.

amaora ★★
()
Ответ на: комментарий от amaora

Попробуй на досуге, а то я в начале 14го хочу 0.2-rc2 релизить, а тестировщиков не хватает ;)

ncrmnt ★★★★★
()
Ответ на: комментарий от ncrmnt

Нда, я тоже с такого начинал... Закончил в итоге этим

Ну это не конец, потом придешь к пониманию что нужна RTOS и стандартные интерфейсы

http://nuttx.org/

а бибилиотеки от производителей в основной массе это шлак, хотя конечно и исключения есть.

anonymous
()

В наличии так же имеется SEGGER J-Link ARM, которым планируется плату прошивать.

3. (самое сложное) Как залить исполняемый код на плату.

openocd -f interface/jlink.cfg -f target/lpc17xx.cfg

Затем gdb:

gdb <elf>
> target remote localhost:3333
> monitor reset halt
> load
Это зальет прошивку. А дальше можешь дебажить с помощью gdb почти как обычный код, например:
> break main
> continue

Все это можно засунуть в скрипт gdb или использовать IDE какую-нибудь.

Kosyak ★★★★
()

LPCXpresso может скомпилировать и слинковать нечто, но после уверенно сообщает о том, что ни одна плата к PC не подключена и заливать/запускать код отказывается наотрез.

Смотри. Твоя платка поддерживает заливку прошивки через компот. Попробуй настроить IDE на заливку через компот, залей, перезагрузи, мигай диодами.

aiqu6Ait ★★★★
()

Официальные утилиты от SEGGER скачать не получается, т.к. программатор покупался у местных перекупщиков, которые выдают его за свое творение и теперь невозможно узнать его реальный серийный номер.

Кстати, даже не пытайся. У тебя скорее всего китайский клон. Сеггеровская утилита сразу прошьет свою новую прошивку и китайщина бриканется. Придеться пляски с бубном устраивать чтоб её восстановить. А так, китайщина вроде через openocd нормально работает.

Kosyak ★★★★
()
Ответ на: комментарий от aiqu6Ait

настроить IDE на заливку через компот

Интересно, это какой же IDE можно так настроить? Для "заливки" через бутлодыря для STM32 есть stm32flash. Что там с ТСовским МК — непонятно.

А JLink, если на "казусе" не брешут, является обычным клоном STLink'а, т.е. утилита st-flash с ним (по идее) должна работать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

У меня и так ртос компоненты в планах впилить туда.

ncrmnt ★★★★★
()
Ответ на: комментарий от Eddy_Em

Не будет без патчей, говорю так как знаю сырцы texane/st-link (найдешь там в комит логе без труда мои патчи). Там забиты idшники stшных железок только. Это раз. Два ст-линк загружает вспомогательное приложение-флешер для пошива. А у lpc другая карта памяти и другой флеш контроллер. Короче - даже если ст-утил с ним и заработает, без кровавого патчинга по поддержке LPC не взлетит

ncrmnt ★★★★★
()
Ответ на: комментарий от ncrmnt

Фиговато.

Кстати, я себе JLink на ибее заказал. Как придет, чую, натрахаюсь я с ним, чтобы его к st-flash присобачить.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Но можно же openocd использовать для прошивки, он c J-Link почти полностью дружит (SWD пока не запилили, да). И даже без gdb.

openocd -f interface/jlink.cfg -f target/stm32f4x.cfg -c "program super_firmware.elf verify reset"

Kosyak ★★★★
()
Ответ на: комментарий от Kosyak

Хотелось бы попроще, безо всяких извращений вроде openocd!

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от ncrmnt

ld скриптом

Сейчас основные проблемы с этим. Вы могли бы подсказать, откуда можно начинать свои изыскания. В документации к LPC1788 есть директория со скриптами для линкера ( ldscript_iram_iar.icf ldscript_irom_iar.icf ), но какой из них верный, я так и не понял. К тому же ни один из них не подходит (валится с синтаксической ошибкой)

trex6 ★★★★★
() автор топика
Ответ на: комментарий от Kosyak

Вот такая проблема:

$ arm-none-eabi-gdb ./test1.elf 
GNU gdb (Sourcery G++ Lite 2011.03-42) 7.2.50.20100908-cvs
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=i686-pc-linux-gnu --target=arm-none-eabi".
For bug reporting instructions, please see:
<https://support.codesourcery.com/GNUToolchain/>...
Reading symbols from /home/trex/workspace/test1/Debug/test1.elf...done.
(gdb) target remote localhost:3333
Remote debugging using localhost:3333
0x00000000 in ?? ()
(gdb) monitor reset halt
JTAG tap: lpc1788.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Only resetting the Cortex-M3 core, use a reset-init event handler to reset any peripherals
target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x000000f8 msp: 0x10004860
(gdb) load
Start address 0x0, load size 0
Transfer rate: 0 bits in <1 sec.
(gdb) break main
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (main) pending.
(gdb)

Судя по

Start address 0x0, load size 0

ничего не загружается.

Не поможете решить проблему?

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от trex6

Гм, как-то странно, может слинковалось неправильно? Что

arm-none-eabi-objdump -h ./test1.elf 
выводит?

P.S. А в консоль openocd что-нибудь ещё говорит?

Kosyak ★★★★
()
Последнее исправление: Kosyak (всего исправлений: 1)
Ответ на: комментарий от Kosyak
$ arm-none-eabi-objdump -h ./test1.elf 

./test1.elf:     file format elf32-littlearm

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .ARM.attributes 00000025  00000000  00000000  00000034  2**0
                  CONTENTS, READONLY
  1 .comment      0000002a  00000000  00000000  00000059  2**0
                  CONTENTS, READONLY
  2 .stack        00000100  00000000  00000000  00000088  2**3
                  CONTENTS
  3 .heap         00001000  00000000  00000000  00000188  2**3
                  CONTENTS
  4 .debug_abbrev 0000005d  00000000  00000000  00001188  2**0
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_info   000000cb  00000000  00000000  000011e5  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_line   000000b8  00000000  00000000  000012b0  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_macinfo 000021b8  00000000  00000000  00001368  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_loc    00000038  00000000  00000000  00003520  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_pubnames 0000001b  00000000  00000000  00003558  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_aranges 00000048  00000000  00000000  00003578  2**3
                  CONTENTS, READONLY, DEBUGGING
 11 .debug_ranges 00000030  00000000  00000000  000035c0  2**3
                  CONTENTS, READONLY, DEBUGGING
 12 .debug_str    00000044  00000000  00000000  000035f0  2**0
                  CONTENTS, READONLY, DEBUGGING
 13 .debug_frame  0000002c  00000000  00000000  00003634  2**2
                  CONTENTS, READONLY, DEBUGGING

В openocd

Info : accepting 'gdb' connection from 3333
Warn : acknowledgment received, but no packet pending
undefined debug reason 6 - target needs reset
Info : JTAG tap: lpc1788.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Warn : Only resetting the Cortex-M3 core, use a reset-init event handler to reset any peripherals
target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x000000f8 msp: 0x10004860

Линкую вот так:

arm-none-eabi-gcc -T"lpc17xx.ld" -Xlinker --gc-sections -Wl,-Map,"test1.map" -mcpu=cortex-m3 -mthumb -g3 -o "test1.elf" ./main.o ./startup/gcc/startup_LPC177x_8x.o

Компилирую (точнее Eclipse компилирует) вот так:

arm-none-eabi-gcc -x assembler-with-cpp -Wall -Wa,-adhlns="startup/gcc/startup_LPC177x_8x.o.lst" -c -fmessage-length=0 -MMD -MP -MF"startup/gcc/startup_LPC177x_8x.d" -MT"startup/gcc/startup_LPC177x_8x.d" -mcpu=cortex-m3 -mthumb -g3 -o "startup/gcc/startup_LPC177x_8x.o" "../startup/gcc/startup_LPC177x_8x.S"

arm-none-eabi-gcc -O0 -ffunction-sections -fdata-sections -Wall -Wa,-adhlns="main.o.lst" -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -mcpu=cortex-m3 -mthumb -g3 -o "main.o" "../main.c"

Eclipse при линковке почему-то не указывает ни одного *.o файла, я их ручками дописал.

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от trex6

ээм, у тебя в эльфе все есть, кроме самого кода (.text) и данных (.data), т.е. по-сути он пустой. Где-то в сборке/линковке косяк.

Kosyak ★★★★
()
Ответ на: комментарий от Kosyak

Проверил объектники, в них все норм. Потом начал искать причину и судя по всему причина в неверном скрипте линковки. У меня это скрипт выглядит так:

$ cat lpc17xx.ld
/* Simple linker script for the NXP LPC1769 ARM Cortex M3.  Link the text
   of the program into on-board flash and use on-board RAM for data and stack.
*/

SECTIONS
{
        /* interrupt vectors start at zero */
        . = 0x0;  /* start of flash */

        .text :  {  *(.text)   }

        /* constant data follows code but still in flash */
        .data :
        {
          *(.data)
          *(.rom)
        }

        /* internal RAM starts at 0x10000000 */
        . = 0x10000000;
        .ram : { *(.ram) }

        .bss :
        {
          *(.bss)
          *(.ram)
        }
}

Если в опциях линковки его убрать, то получаем:

$ arm-none-eabi-size --format=berkeley test1.elf 
   text	   data	    bss	    dec	    hex	filename
     72	     12	      4	     88	     58	test1.elf

А с ним во всех секциях нули.

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Это для с****ного IAR'а. А надо для gcc, гуглить надо

ncrmnt ★★★★★
()
Ответ на: комментарий от Kosyak

Большое спасибо. Теперь вроде нормально слинковалось, но при попытке поставить брейкпоинт отвечает:

(gdb) target remote localhost:3333
Remote debugging using localhost:3333
0x00000000 in ?? ()
(gdb) monitor reset halt
JTAG tap: lpc1788.cpu tap/device found: 0x4ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x4)
Only resetting the Cortex-M3 core, use a reset-init event handler to reset any peripherals
target state: halted
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x000000f8 msp: 0x10004860
(gdb) load
Loading section .stack, size 0x300 lma 0x10000000
Start address 0x0, load size 768
Transfer rate: 6144 bits in <1 sec, 768 bytes/write.
(gdb) break main
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n])

Это нормально или я опять что-то не так сделал?

P.S. На всякий случай:

$ arm-none-eabi-objdump -h ./test1.elf 

./test1.elf:     file format elf32-littlearm

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .stack        00000300  10000000  10000000  00008000  2**3
                  CONTENTS, ALLOC, LOAD, DATA
  1 .ARM.attributes 00000025  00000000  00000000  00008300  2**0
                  CONTENTS, READONLY
  2 .heap         00001000  00000000  00000000  00008328  2**3
                  CONTENTS
  3 .comment      0000002a  00000000  00000000  00009328  2**0
                  CONTENTS, READONLY
  4 .debug_aranges 00000048  00000000  00000000  00009358  2**3
                  CONTENTS, READONLY, DEBUGGING
  5 .debug_pubnames 0000001b  00000000  00000000  000093a0  2**0
                  CONTENTS, READONLY, DEBUGGING
  6 .debug_info   000000cb  00000000  00000000  000093bb  2**0
                  CONTENTS, READONLY, DEBUGGING
  7 .debug_abbrev 0000005d  00000000  00000000  00009486  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_line   000000ae  00000000  00000000  000094e3  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_frame  0000002c  00000000  00000000  00009594  2**2
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_str    00000044  00000000  00000000  000095c0  2**0
                  CONTENTS, READONLY, DEBUGGING
 11 .debug_loc    00000038  00000000  00000000  00009604  2**0
                  CONTENTS, READONLY, DEBUGGING
 12 .debug_macinfo 000021b8  00000000  00000000  0000963c  2**0
                  CONTENTS, READONLY, DEBUGGING
 13 .debug_ranges 00000030  00000000  00000000  0000b7f8  2**3
                  CONTENTS, READONLY, DEBUGGING

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от geks

Проверяю объектник:

$ arm-none-eabi-objdump -D ./main.o | grep main
./main.o:     file format elf32-littlearm
  18:	0c3f012e 	ldfeqs	f0, [pc], #-184	; ffffff68 <main+0xffffff68>
  1c:	0b3a0e03 	bleq	e83830 <main+0xe83830>
  34:	3b0b3a0e 	blcc	2ce874 <main+0x2ce874>
  40:	0b0b0024 	bleq	2c00d8 <main+0x2c00d8>
      ec:	555f5f00 	ldrbpl	r5, [pc, #-3840]	; fffff1f4 <main+0xfffff1f4>
     208:	555f5f00 	ldrbpl	r5, [pc, #-3840]	; fffff310 <main+0xfffff310>
     37c:	555f5f00 	ldrbpl	r5, [pc, #-3840]	; fffff484 <main+0xfffff484>
     41c:	555f5f00 	ldrbpl	r5, [pc, #-3840]	; fffff524 <main+0xfffff524>
     798:	555f5f00 	ldrbpl	r5, [pc, #-3840]	; fffff8a0 <main+0xfffff8a0>
     8b0:	555f5f00 	ldrbpl	r5, [pc, #-3840]	; fffff9b8 <main+0xfffff9b8>
     8f8:	555f5f00 	ldrbpl	r5, [pc, #-3840]	; fffffa00 <main+0xfffffa00>
     a18:	555f5f00 	ldrbpl	r5, [pc, #-3840]	; fffffb20 <main+0xfffffb20>
     bcc:	2b653638 	blcs	194e4b4 <main+0x194e4b4>
    172c:	4b48372d 	blmi	120f3e8 <main+0x120f3e8>
    17ac:	4b485538 	blmi	1216c94 <main+0x1216c94>
    17cc:	4b485538 	blmi	1216cb4 <main+0x1216cb4>
    1854:	4b35312d 	blmi	d4dd10 <main+0xd4dd10>
    191c:	4b4c3133 	blmi	130ddf0 <main+0x130ddf0>
    1950:	4b4c3133 	blmi	130de24 <main+0x130de24>
    19b4:	4b4c5530 	blmi	1316e7c <main+0x1316e7c>
    19e0:	4b4c5532 	blmi	1316eb0 <main+0x1316eb0>
    1afc:	4b4c4c55 	blmi	1314c58 <main+0x1314c58>
    1f30:	5a49535f 	bpl	1256cb4 <main+0x1256cb4>
    1f44:	5a49535f 	bpl	1256cc8 <main+0x1256cc8>
    1fb8:	5a49535f 	bpl	1256d3c <main+0x1256d3c>
    2014:	5a49535f 	bpl	1256d98 <main+0x1256d98>
    20ac:	4b524f57 	blmi	1495e10 <main+0x1495e10>
Disassembly of section .text.main:
00000000 <main>:
   c:	e000      	b.n	10 <main+0x10>
  20:	ddf5      	ble.n	e <main+0xe>
  28:	e7f2      	b.n	10 <main+0x10>
   0:	6d6f682f 	stclvs	8, cr6, [pc, #-188]!	; ffffff4c <main+0xffffff4c>
  20:	756f6300 	strbvc	r6, [pc, #-768]!	; fffffd28 <main+0xfffffd28>

После этого

$ arm-none-eabi-gcc -T"my.ld" -Xlinker --gc-sections -Wl,-Map,"test1.map" -mcpu=cortex-m3 -mthumb -g3 -o "test1.elf"  ./startup/gcc/startup_LPC177x_8x.o  ./main.o

Но при этом:

$ arm-none-eabi-objdump -D ./test1.elf | grep main
$ 

Судя по всему, опять какие-то проблемы с ld-скриптом.

Я использовал скрипт то этой ссылке http://code.google.com/p/rt-thread/source/browse/trunk/bsp/lpc178x/lpc17xx_ro...

P.S.

$ arm-none-eabi-objdump -D ./test1.elf | grep _start
00000000 <__cs3_heap_start>:

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от trex6

В эльфе опять кода нет (.text), и heap почему-то не там (если я правильно понял, с 0x10000000 у LPC начинается RAM)

Попробуй такой линкер-скрипт, он почти 1в1 как у stm32 (не забудь поменять LENGTH у флеша и памяти на соответствующие параметры твоего чипа)

MEMORY
{
  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 512K   /* 32k */
  RAM (rwx)  : ORIGIN = 0x10000000, LENGTH = 64K   /* 4k */
}

ENTRY(Reset_Handler)

SECTIONS
{
	.text :
	{
		KEEP(*(.isr_vector))
		*crti.o(.text*)
		*crtbegin.o(.text*)
		*crt0.o(.text*)
		. = DEFINED(__nxp_crp) ? 0x2fc : .;
		KEEP(*(.NXP.CRP))
		*(.text*)

		KEEP(*(.init))
		KEEP(*(.fini))

		/* .ctors */
		*crtbegin.o(.ctors)
		*crtbegin?.o(.ctors)
		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
		*(SORT(.ctors.*))
		*(.ctors)

		/* .dtors */
 		*crtbegin.o(.dtors)
 		*crtbegin?.o(.dtors)
 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
 		*(SORT(.dtors.*))
 		*(.dtors)

		*(.rodata*)

		KEEP(*(.eh_frame*))
	} > FLASH

	.ARM.extab :
	{
		*(.ARM.extab* .gnu.linkonce.armextab.*)
	} > FLASH

	__exidx_start = .;
	.ARM.exidx :
	{
		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
	} > FLASH
	__exidx_end = .;

	__etext = .;

	.data : AT (__etext)
	{
		__data_start__ = .;
		*(vtable)
		*(.data*)

		. = ALIGN(4);
		/* preinit data */
		PROVIDE_HIDDEN (__preinit_array_start = .);
		KEEP(*(.preinit_array))
		PROVIDE_HIDDEN (__preinit_array_end = .);

		. = ALIGN(4);
		/* init data */
		PROVIDE_HIDDEN (__init_array_start = .);
		KEEP(*(SORT(.init_array.*)))
		KEEP(*(.init_array))
		PROVIDE_HIDDEN (__init_array_end = .);


		. = ALIGN(4);
		/* finit data */
		PROVIDE_HIDDEN (__fini_array_start = .);
		KEEP(*(SORT(.fini_array.*)))
		KEEP(*(.fini_array))
		PROVIDE_HIDDEN (__fini_array_end = .);

		. = ALIGN(4);
		/* All data end */
		__data_end__ = .;

	} > RAM

	.bss :
	{
		__bss_start__ = .;
		*(.bss*)
		*(COMMON)
		__bss_end__ = .;
	} > RAM

	.heap :
	{
		__end__ = .;
		end = __end__;
		*(.heap*)
		__HeapLimit = .;
	} > RAM

	/* .stack_dummy section doesn't contains any symbols. It is only
	 * used for linker to calculate size of stack sections, and assign
	 * values to stack symbols later */
	.stack_dummy :
	{
		*(.stack)
	} > RAM

	/* Set stack top to end of RAM, and stack limit move down by
	 * size of stack_dummy section */
	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
	PROVIDE(__stack = __StackTop);

	/* Check if data + heap + stack exceeds RAM limit */
	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
}

Kosyak ★★★★
()
Ответ на: комментарий от trex6

Слинкуюй своим скриптом сначала все в один файл типа test1.o просто секциями .text, .data, а потом скорми его ld c lpc17xx_rom.ld

geks
()
Ответ на: комментарий от Kosyak
$ arm-none-eabi-objdump -h ./test1.elf 

./test1.elf:     file format elf32-littlearm

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         00000048  00000000  00000000  00008000  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000008  10000000  00000048  00010000  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000001  10000008  00000050  00010008  2**0
                  ALLOC
  3 .heap         00001000  10000010  10000010  00010008  2**3
                  CONTENTS
  4 .stack_dummy  00000100  10001010  10001010  00011008  2**3
                  CONTENTS
  5 .ARM.attributes 00000025  00000000  00000000  00011108  2**0
                  CONTENTS, READONLY
  6 .comment      0000002a  00000000  00000000  0001112d  2**0
                  CONTENTS, READONLY
  7 .debug_line   000000ae  00000000  00000000  00011157  2**0
                  CONTENTS, READONLY, DEBUGGING
  8 .debug_info   000000cb  00000000  00000000  00011205  2**0
                  CONTENTS, READONLY, DEBUGGING
  9 .debug_abbrev 0000005d  00000000  00000000  000112d0  2**0
                  CONTENTS, READONLY, DEBUGGING
 10 .debug_aranges 00000048  00000000  00000000  00011330  2**3
                  CONTENTS, READONLY, DEBUGGING
 11 .debug_ranges 00000030  00000000  00000000  00011378  2**3
                  CONTENTS, READONLY, DEBUGGING
 12 .debug_macinfo 000021b8  00000000  00000000  000113a8  2**0
                  CONTENTS, READONLY, DEBUGGING
 13 .debug_loc    00000038  00000000  00000000  00013560  2**0
                  CONTENTS, READONLY, DEBUGGING
 14 .debug_pubnames 0000001b  00000000  00000000  00013598  2**0
                  CONTENTS, READONLY, DEBUGGING
 15 .debug_str    00000044  00000000  00000000  000135b3  2**0
                  CONTENTS, READONLY, DEBUGGING
 16 .debug_frame  0000002c  00000000  00000000  000135f8  2**2
                  CONTENTS, READONLY, DEBUGGING

P.S. В итоге с получившимся файлом:

(gdb) load
Loading section .text, size 0x48 lma 0x0
Loading section .data, size 0x8 lma 0x48
Start address 0x0, load size 80
Transfer rate: 307 bytes/sec, 40 bytes/write.
(gdb) break main
Function "main" not defined.
Make breakpoint pending on future shared library load? (y or [n])y
(gdb)continue

P.P.S. В openocd:

Warn : acknowledgment received, but no packet pending
Warn : Verification will fail since checksum in image (0x6803b508) to be written to flash is different from calculated vector checksum (0x11c95673).
Warn : To remove this warning modify build tools on developer PC to inject correct LPC vector checksum.
Warn : Invalid ACK 0x7 in JTAG-DP transaction

trex6 ★★★★★
() автор топика
Последнее исправление: trex6 (всего исправлений: 2)
Ответ на: комментарий от geks

Слинкуюй своим скриптом сначала все в один файл типа test1.o просто секциями .text, .data

А вот с этим у меня сложности. Годный мануальчик не посоветуете?

потом скорми его ld c lpc17xx_rom.ld
lpc17xx_rom.ld

А где его можно взять?

trex6 ★★★★★
() автор топика
Ответ на: комментарий от trex6

Примерно так:

risc.xl:

SECTIONS
{
        .risc_text :  {
          startup_LPC177x_8x.*(.text)
          main.*(.text)   
        }

        .risc_data :
        {
          startup_LPC177x_8x.*(.data)
          main.*(.data)
        }
}

final.xl:

SECTIONS {
 
 . =0x0; 

 .text :
  {
     risc_text.* (.text);
  }
 
 .data :
  {
     risc_data.* (.data);
  }
 
  _gp = ALIGN(16);
  .lit4 : { *(.lit4) }
  .sdata : { *(.sdata) }
  .rodata : { *(.rodata) }
  . = ALIGN(8);
  PROVIDE (edata = .);
  _edata = .;
 
  _fbss = .;
  .sbss : { *(.sbss*) *(.scommon) *(*ABS*)}
 
  .bss  :
  {
     _bss_start = .;
     *(.bss);
     *(COMMON)
  }
 
  . += 0x00010000;
  PROVIDE(__stack = ALIGN(8));
  . += 0x10;
 
 
  PROVIDE(end = .);
  _end = .;
 
}

Makefile:

CFLAGS=-Wall -mcpu=cortex-m3 -mthumb -g3 -O0 
all:
	arm-none-eabi-gcc $(CFLAGS) -o ./startup/gcc/startup_LPC177x_8x.o ./startup/gcc/startup_LPC177x_8x.s  
	arm-none-eabi-gcc $(CFLAGS) -o ./main.o ./main.c
	arm-none-eabi-ld -g -r -N -T risc.xl ./startup/gcc/startup_LPC177x_8x.o ./main.o -o test1
	arm-none-eabi-ld -g -N -T final.xl test1 -o test1.elf

geks
()
Ответ на: комментарий от trex6

Ага, этот стартап похоже бесполезен для того ld-скрипта. Неужто NXP не поставляет нормальной связки стартап + ld-скрипт?

Здесь стартап, подходящий для того скрипта (startup_ARMCM3.S).

Kosyak ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.