Прерывания в ARM-GCC (или опять LPC)

Здравствуйте!

Есть gcc version 3.4.0-macraigor1 и упорный камень LPC2106

Тема: "Опять 25" поморгать светиком по прерыванию таймера.

?нужны ли какие нибудь __attribute__ обработчику прерывания таймера void TIMER0_ISR (void); и как их корректно записать. ИНХО как минимум нужно сказать компилятору что данная подпрограмма работает в режиме ARM.

Не моргает зараза :-( А вот если не делать ENABLE_INTERRUPTS и не настроивать VIC, и в основном бесконечном цикле проверять флаг прерывания таймера то усё моргает как надо, то есть инициализация таймера прошла без косяков.

?на счёт __attribute__ мануалы курил, смотрел исходники arm.c но не понятен синтаксис, можно ли прописывать несколько атрибутов и как это делать (совершенно нет ярких примеров, а интернету потрачено на поиск экзампелей - уйма) Во всех ли случаях __attribute__ заменяет #pragma? особенно что касается обработчиков прерываний, и указаний какой код генерить arm/thumb/interwork.

Код приводится полностью. Запускается из RAM, ремап делается... ну что ещё нужно?!

/**********************************************************/ void Initialize(void); void feed(void); void Timer0_IRQ_Init (void); void Timer0_Init(void); void LPC210xInitVIC(void);

void IRQ_Routine (void) __attribute__ ((interrupt("IRQ"))); void FIQ_Routine (void) __attribute__ ((interrupt("FIQ"))); void SWI_Routine (void) __attribute__ ((interrupt("SWI"))); void UNDEF_Routine (void) __attribute__ ((interrupt("UNDEF"))); void TIMER0_ISR (void); void DefDummyInterrupt(void);

#include "LPC210x.h"

#define ENABLE_INTERRUPTS asm volatile ( \ "mrs r3,cpsr;" \ "bic r3,r3,#0xC0;" \ "msr cpsr,r3" \ : \ : \ : "r3" \ )

int main (void) { // Initialize the system Initialize(); Timer0_Init(); Timer0_IRQ_Init(); ENABLE_INTERRUPTS;

IODIR |= 0x0000FFFF; while (1) { /* Если раскоментарить нижнюю строку, но при инициализвции не разрешать прерывания, то светик буде моргать, значит прерывания от таймера всётаки генерятся.

*/ //if (TIMER0_IR !=0) {TIMER0_ISR();}; } }

void DefDummyInterrupt(void) {} void LPC210xInitVIC(void) { // Setup interrupt controller. VICProtection = VICIntSelect = 0; // VICIntEnClr = 0xffffffff; // Disable all interrupts VICDefVectAddr = (unsigned int)&DefDummyInterrupt; }

#define PLOCK 10<<1 void Initialize(void) { PLLCFG=0x25; feed(); PLLCON=0x1; feed(); while(!(PLLSTAT & PLOCK)) ; PLLCON=0x3; feed(); // Enabling MAM and setting number of clocks used for Flash memory fetch (4 cclks in this case) MAMCR=0x2; MAMTIM=0x3; /* Initialize MEMAP - re-map vector table to RAM */ MEMMAP = 0x02; VPBDIV=0x1; LPC210xInitVIC(); }

void feed(void) {PLLFEED=0xAA;PLLFEED=0x55;}

// Timer interrupt handler void TIMER0_ISR(void) { static unsigned char i=0; if ((i=!i)==0) {IOSET=0xFFFF;} else {IOCLR=0xFFFF;}; TIMER0_IR = 0xff; // Clear timer 0 interrupt line. }

//XTAL frequency in Hz #define XTALFREQ 11059200 * 6 //66355200

//pclk must always be XTALFREQ/4 when using the ROM monitor. #define PCLKFREQ (XTALFREQ/4) #define Delay_ms = 1000 #define Delay_HEX = - Delay_ms / PCLKFREQ #define TIMER0_START (TIMER0_TCR = 1)

void Timer0_Init(void) { IOSET = 0xFFFF;// red led on TIMER0_TCR = TIMER0_PC = TIMER0_CCR = TIMER0_EMR = 0;/* TIMER0_MR0 = 0x0024E1C0; TIMER0_MCR = 3; // Reset and interrupt on MR0 (match register 0). TIMER0_START; }

#define VIC_TIMER0_bit (1 << VIC_TIMER0) void Timer0_IRQ_Init (void){ VICIntSelect &= ~VIC_TIMER0_bit; // IRQ on timer 0 line. VICVectAddr0 = (unsigned int)&TIMER0_ISR; VICVectCntl0 = 0x20 | VIC_TIMER0; // Enable vector interrupt for timer 0.*/ VICIntEnable |= 0xFFFF;//VIC_TIMER0_bit; // Enable timer 0 interrupt. }

void IRQ_Routine (void) { unsigned int vector = VICVectAddr; void (*interrupt_function)() = (void(*)())vector; (*interrupt_function)(); VICVectAddr = 0; } void FIQ_Routine (void) { while (1) ;} void SWI_Routine (void) { while (1) ;} void UNDEF_Routine (void) { while (1) ;}

C уважением, Герасимов.

;-)

Reply to
Gerasimov Gerasim
Loading thread data ...

Здравствуйте!

Что-то я так и не дождался ответа на свой вопрос. Мож спросил не так? Информация дополнительная нужна (makefile)?

Вот, реальный чел (Я) решил освоить могучий arm-elf-gcc, начав с примитива, запросил помощи у Знатоков, но так и осталься один в поле :-(

C уважением, Герасимов.

;-)

Reply to
Gerasimov Gerasim

Привет Gerasimov!

07 Dec 05 12:54, Gerasimov Gerasim писал Gerasimov Gerasim:

GG> Что-то я так и не дождался ответа на свой вопрос. GG> Мож спросил не так? Информация дополнительная нужна (makefile)?

GG> Вот, реальный чел (Я) решил освоить могучий arm-elf-gcc, начав с GG> примитива, запросил помощи у Знатоков, но так и осталься один в поле GG> :-(

Hу смотрел я твой пример, криминала не увидел. Скорее всего у тебя проблема вовсе не в сишном модуле, а в ассемблерном. Регистры там какие-нибудь не сохраняешь, или вектор на неверный адрес управление передает, или стек не там где-нибудь... Я еще там не очень понял по поводу закоментаренного разрешения прерываний. Если при ее раскомментаривании светодиод перестает мигать - то почти наверняка это проблемы со входом или выходом из прерывания.

А gcc - чего там спрашивать? Он всего лишь из сишного кода генерит ассемблерный. Смотри что он выдает и анализируй. Если что-то конкретно кажется не так - спрашивай. А "почему-то не работает" - очень уж неконкретные симптомы. :)

GG> C уважением, Герасимов.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Смотрю куда глаза глядят...

Reply to
Alex Mogilnikov

Здравствуйте!

Боле менее разобрался, пока мигаю светиками из прерываний двух таймеров, но приходится работать только из FLASH, из RAM мой код исполнятся не захотел и возится с этим явлением наскучило. Буду пока FLASH`ку протирать :-)

В общем в статапе _vectors: .............. ldr PC, IRQ_Addr ............... IRQ_Addr: .word IRQ_Routine /* defined in main.c */ ........................

в main.c

void IRQ_Routine (void) __attribute__ ((interrupt("IRQ"))); ............ void IRQ_Routine (void) { unsigned int vector = VICVectAddr; void (*interrupt_function)() = (void(*)())vector; VICVectAddr = 0; (*interrupt_function)(); } void TIMER0_ISR(void) { ................ timer0->IR.d = 0xff; }

// Timer1 interrupt handler void TIMER1_ISR(void) { ................ timer1->IR.d = 0xff; }

Вот появились вопросы (мануал предварительно читал)

1) Как заставить gcc сохранять регистры (все, или только необходимые)при входе в заданную процедуру, например void TIMER1_ISR(void)? Писать для этого макрос? Например CodeWarrior понимает #pragma interrupt_called что заставляет его сохранять все регистры при входе в процедуру (не обязательно обработчик прерываний)

2) Возникает естественное желание (на этапе освоения нового проца)посмотреть, какой ассемблерный код получается после компилятора, ключ -S помогает, но плохо, (во первых он отключает саму компиляцию и приходится стирать все о-файлы иначе листинг не получается) в общем как "собрать" исходники и одновременно получить их асслемблерные листинги, и желательно общий листинг с абсолютными адресами (но их знает только ld из memory-map), или это невозможно?

AM> А gcc - чего там спрашивать? Он всего лишь из сишного кода генерит AM> ассемблерный. Смотри что он выдает и анализируй. Если что-то конкретно AM> кажется не так - спрашивай. А "почему-то не работает" - очень уж AM> неконкретные симптомы. :)

C уважением, Герасимов.

;-)

Reply to
Gerasimov Gerasim

Hello, Gerasimov! You wrote to Alex Mogilnikov on Thu, 12 Jan 2006 04:11:02 +0000 (UTC):

GG> Боле менее разобрался, пока мигаю светиками из прерываний двух GG> таймеров, но приходится работать только из FLASH, из RAM мой код GG> исполнятся не захотел и возится с этим явлением наскучило. Буду пока GG> FLASH`ку протирать :-) Не понятно, в какой среде ты работаешь. Если CrossStudio, то там с этим все нормально. Чтобы работали прерывания из RAM, должен быть соответствующим образом инициализирован регистр MEMMAP. В CrossStudio это делается само из скрипта Philips_LPC210X_Target.js . Чтобы быстро вызывались обработчики прерываний, достаточно в векторе написать "ldr pc, [pc, #-0xFF0]" , таким образом он дотягивается до VICVectAddr относительно pc, и сразу из вектора прыгает куда надо. В CrossStudio это включается дефайном VECTORED_IRQ_INTERRUPTS.

GG> 2) Возникает естественное желание (на этапе освоения нового GG> проца)посмотреть, какой ассемблерный код получается после компилятора, GG> ключ -S помогает, но плохо, (во первых он отключает саму компиляцию и GG> приходится стирать все о-файлы иначе листинг не получается) в общем как GG> "собрать" исходники и одновременно получить их асслемблерные листинги, GG> и желательно общий листинг с абсолютными адресами (но их знает только GG> ld из memory-map), или это невозможно? В CrossStudio можно посмотреть неплохой дизассембированный листинг, просто открывая объектники или выходной .elf из project manager-а. Также в gcc есть ключ, предписывающий сохранять промежуточные файлы: -save-temps.

With best regards, Sergey Belyakov. E-mail: snipped-for-privacy@mail.ru

Reply to
Sergey Belyakov

Привет Gerasimov!

12 Jan 06 07:11, Gerasimov Gerasim писал Alex Mogilnikov:

GG> Вот появились вопросы (мануал предварительно читал) GG> 1) Как заставить gcc сохранять регистры (все, или только GG> необходимые)при входе в заданную процедуру,

Вынеси эту функцию в отдельный модуль и компилируй с -fcall-saved-reg.

Еще можно дать этой функции атрибут naked и сделать ей пролог и эпилог ассемблерными вставками. Hо это слишком низкоуровневое решение чтобы применять его только ради сохранения регистров.

GG> например void TIMER1_ISR(void)? Писать для этого макрос?

? Как макрос может влиять на кодогенерацию? Разберись, какая программа что делает в процессе сборки: кто из цепочки препроцессор-компилятор-ассемблер-линкер какую части работы выполняет, что получает на вход и что выдает на выход.

GG> 2) Возникает естественное желание (на этапе освоения нового GG> проца)посмотреть, какой ассемблерный код получается после компилятора, GG> ключ -S помогает, но плохо, (во первых он отключает саму компиляцию и

Hе отключает:

alx% arm-elf-gcc --help|grep -- -S -S Compile only; do not assemble or link

Ассемблерный код как раз и получается в результате компиляции. -S отключает ассемблирование и линковку. Компиляцию отключает -E:

alx% arm-elf-gcc --help|grep -- -E -E Preprocess only; do not compile, assemble or link

GG> приходится стирать все о-файлы иначе листинг не получается)

Объектные файлы и листинги генерятся одновременно. Если у тебя есть объектник, но нет листинга, значит ты просто не просил его сделать.

GG> в общем GG> как "собрать" исходники и одновременно получить их асслемблерные GG> листинги,

Листинг генерируется ассемблером при наличии -a:

-a[sub-option...] turn on listings Sub-options [default hls]: c omit false conditionals d omit debugging directives h include high-level source l include assembly m include macro expansions n omit forms processing s include symbols =FILE list to FILE (must be last sub-option)

GG> и желательно общий листинг с абсолютными адресами (но их GG> знает только ld из memory-map), или это невозможно?

Ты сам себе ответил. Это невозможно, так как ассемблер не знает, по каким адресам ассемблируемая секция будет потом размещена линкером. Абсолютные адреса смотрят в map-файле (который делает линкер, если ему сказать -Map) или в отладчике.

В SDCC'шном линкере была такая фича: он пытался найти листинг от линкуемых объектников, и если находил, вписывал в них абсолютные адреса. Hо такое поведение - экзотика.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Чудо-йогурт Био. Чемпион среди какао.

Reply to
Alex Mogilnikov

GG> 2) Возникает естественное желание (на этапе освоения нового GG> проца)посмотреть, GG> какой ассемблерный код получается после компилятора, ключ -S помогает, но GG> плохо, (во первых он отключает саму компиляцию и приходится стирать все GG> о-файлы иначе листинг не получается) в общем как "собрать" исходники и GG> одновременно получить их асслемблерные листинги, и желательно общий листинг GG> с GG> абсолютными адресами (но их знает только ld из memory-map), или это GG> невозможно?

Попробуй objdump из твоего набора (ключи по вкусу).

objdump -dStl твой.elf

Reply to
Eugene Markov

GG>> 2) Возникает естественное желание (на этапе освоения нового GG>> проца)посмотреть, какой ассемблерный код получается после компилятора, GG>> ключ -S помогает, но плохо, (во первых он отключает саму компиляцию и GG>> приходится стирать все о-файлы иначе листинг не получается) в общем как GG>> "собрать" исходники и одновременно получить их асслемблерные листинги, GG>> и желательно общий листинг с абсолютными адресами (но их знает только GG>> ld из memory-map), или это невозможно?

EM> Попробуй objdump из твоего набора (ключи по вкусу).

EM> objdump -dStl твой.elf

Не получилось, зато получилось с листингом, добавил -Wa,-ahlns=$(<:.c=.lst)при компиляции, однако (h) include high-level source так и не получил (так понимаю строки ассемблера должны предварять строки сишного исходника), странно почему?

;-)

Reply to
Gerasimov Gerasim

Привет Gerasimov!

17 Jan 06 13:02, Gerasimov Gerasim писал Eugene Markov:

GG> Hе получилось, зато получилось с листингом, добавил GG> -Wa,-ahlns=$(<:.c=.lst)при компиляции, однако (h) include high-level GG> source так и не получил (так понимаю строки ассемблера должны GG> предварять строки сишного исходника), странно почему?

Позвонил отдыхающему на Тенерифе знакомому телепату (т.к. ты не указал всю строку запуска gcc). Он думает, что ты забыл указать -g.

GG> ;-)

Всего наилучшего, [Team PCAD 2000] Алексей М. ... В системе возможно бесконечное число процессов - до 256.

Reply to
Alex Mogilnikov

GG>> Hе получилось, зато получилось с листингом, добавил GG>> -Wa,-ahlns=$(<:.c=.lst)при компиляции, однако (h) include high-level GG>> source так и не получил (так понимаю строки ассемблера должны GG>> предварять строки сишного исходника), странно почему?

AM> Позвонил отдыхающему на Тенерифе знакомому телепату (т.к. ты не AM> указал всю строку запуска gcc). Он думает, что ты забыл указать -g. Во истину телепат :-)

Вот мейкфайл, я его писал не сам, только дополняю по мере необходимости

NAME = uart_test

CC = arm-elf-gcc LD = arm-elf-ld -v AR = arm-elf-ar AS = arm-elf-as CP = arm-elf-objcopy OD = arm-elf-objdump

CFLAGS = -I./ -с -fno-common -O3 -Wa,-ahls=$(<:.c=.lst) AFLAGS = -ahls -mapcs-32 -o LFLAGS = -Map main.map -Tflash.cmd CPFLAGS = -O ihex -Wa,-adhlns=$(<:.c=.lst) ODFLAGS = -dStl -x --syms -S

all: test

clean: -rm crt.lst main.lst crt.o main.o main.out main.hex main.map main.dmp

test: main.out @ echo "...copying" $(CP) $(CPFLAGS) main.out main.hex $(OD) $(ODFLAGS) main.out > main.dmp

main.out: crt.o VIClowlevel.o main.o flash.cmd @ echo "..linking" $(LD) $(LFLAGS) -o main.out crt.o VIClowlevel.o main.o

VIClowlevel.o: VIClowlevel.c @ echo ".compiling" $(CC) $(CFLAGS) VIClowlevel.c

crt.o: crt.s @ echo ".assembling" $(AS) $(AFLAGS) crt.o crt.s > crt.lst

main.o: main.c @ echo ".compiling" $(CC) $(CFLAGS) main.c > main.lst

Так вот, если в строке CFLAGS = -I./ -с -fno-common -O3

-Wa,-ahls=$(<:.c=.lst) заменить -с на -g то вываливает ошибка arm-elf-gcc -I./ -g -fno-common -O3 -Wa,-ahls=main.lst main.c > main.lst /usr/local/lib/gcc/arm-elf/3.4.0-macraigor1/../../../../arm-elf/bin/ld: crt0.o: No such file: No such file or directory collect2: ld returned 1 exit status make: *** [main.o] Error 1 но листинг всётаким успевает появится, и там есть ссылки на номера строк исходников в виде 233 .loc 1 59 0 234 0114 CCC09FE5 ldr ip, .L14 235 0118 00009CE5 ldr r0, [ip, #0] 236 011c 002090E5 ldr r2, [r0, #0] 237 0120 0238C2E3 bic r3, r2, #131072 238 0124 01E883E3 orr lr, r3, #65536 239 0128 00E080E5 str lr, [r0, #0] 240 .loc 1 62 0 241 012c B8E09FE5 ldr lr, .L14+4 ............

А я то хочу увидить листинг вот в таком виде:

*** _PINSEL0->P0_8 = 1; // P0.8 to TX1 *** _PINSEL0->P0_9 = 1; // P0.9 to RX1 234 0114 CCC09FE5 ldr ip, .L14 235 0118 00009CE5 ldr r0, [ip, #0] 236 011c 002090E5 ldr r2, [r0, #0] 237 0120 0238C2E3 bic r3, r2, #131072 238 0124 01E883E3 orr lr, r3, #65536 239 0128 00E080E5 str lr, [r0, #0] *** uart1->DLM_IER.dIER = 0x00; // disable all interrupts 241 012c B8E09FE5 ldr lr, .L14+4 ........ Но как такого добиться?

;-)

Reply to
Gerasimov Gerasim

Привет Gerasimov!

18 Jan 06 08:12, Gerasimov Gerasim писал Alex Mogilnikov:

GG> Так вот, если в строке CFLAGS = -I./ -с -fno-common -O3 GG> -Wa,-ahls=$(<:.c=.lst) GG> заменить -с на -g то вываливает ошибка

И это логично, если посмотреть описание этих опций. Убирание -c приводит к тому, что после ассемблирования выполняется линковка. Очевидно, это совсем не то, что тебе надо. Hе убирай -c при добавлении -g, и наступит рулез. :)

GG> arm-elf-gcc -I./ -g -fno-common -O3 -Wa,-ahls=main.lst main.c >

GG> main.lst

Зачем ты перенаправляешь вывод в main.lst? Это не только не нужно, но и вредно. Ассемблерной опции -ahls=main.lst вполне достаточно чтобы ассемблер сам создал main.lst.

GG> но листинг всётаким успевает появится,

Тоже логично, ибо листинг создается ассемблером. Разберись-таки, какая программа что делает.

GG> А я то хочу увидить листинг вот в таком виде: GG> ........ GG> Hо как такого добиться?

alx% cat test.c int x; char y;

int fff(void) { if(x < 10) y = x + '0'; else y = x + 'a'; } alx% arm-elf-gcc -I./ -c -g -fno-common -O3 -Wa,-ahls=test.lst test.c alx% cat test.lst ARM GAS /var/tmp//ccvOdLkN.s page 1

1 .file "test.c" 2 .section .debug_abbrev,"",%progbits 3 .Ldebug_abbrev0: 4 .section .debug_info,"",%progbits 5 .Ldebug_info0: 6 .section .debug_line,"",%progbits 7 .Ldebug_line0: 8 0000 34000000 .text 8 02001A00 8 00000201 8 FB0E0A00 8 01010101 9 .Ltext0: 10 .align 2 11 .global fff 12 .type fff, %function 13 fff: 14 .LFB2: 15 .file 1 "test.c" 1:test.c **** int x; 2:test.c **** char y; 3:test.c **** 4:test.c **** int fff(void) 5:test.c **** { 16 .loc 1 5 0 17 @ args = 0, pretend = 0, frame = 0 18 @ frame_needed = 0, uses_anonymous_args = 0 19 @ link register save eliminated. 6:test.c **** if(x < 10) 20 .loc 1 6 0 21 0000 24109FE5 ldr r1, .L5 22 0004 003091E5 ldr r3, [r1, #0] 23 0008 090053E3 cmp r3, #9 7:test.c **** y = x + '0'; 24 .loc 1 7 0 25 000c 302083E2 add r2, r3, #48 8:test.c **** else 9:test.c **** y = x + 'a'; 26 .loc 1 9 0 27 0010 611083E2 add r1, r3, #97 28 .loc 1 7 0 29 0014 14309FD5 ldrle r3, .L5+4 30 .loc 1 5 0 31 @ lr needed for prologue 32 .loc 1 7 0 33 0018 0020C3D5 strleb r2, [r3, #0] 34 .loc 1 6 0 35 001c 0EF0A0D1 movle pc, lr 36 .loc 1 9 0 37 0020 08009FE5 ldr r0, .L5+4 38 0024 0010C0E5 strb r1, [r0, #0] 10:test.c **** } 39 .loc 1 10 0 40 0028 0EF0A0E1 mov pc, lr [ далее поскипано ]

GG> ;-)

Кстати, какая у тебя версия ассемблера?

Всего наилучшего, [Team PCAD 2000] Алексей М. ... Собака - вдруг человека...

Reply to
Alex Mogilnikov

Привет, Gerasimov !

17 Jan 06 , 13:02 Gerasimov Gerasim писал к Eugene Markov:

EM>> objdump -dStl твой.elf

GG> Hе получилось, зато получилось с листингом, добавил GG> -Wa,-ahlns=$(<:.c=.lst)при компиляции, однако (h) include high-level GG> source так и не получил (так понимаю строки ассемблера должны GG> предварять строки сишного исходника), странно почему?

GG> ;-)

Hаверное при компиляции деба-g инфу не производил? :)

. С уважением, Hикита. icq:240059686, lj-user:nicka_startcev ... купается с круглыми утками

Reply to
Nickita A Startcev

AM> Hе убирай -c при добавлении -g, и наступит рулез. :) AM> alx% arm-elf-gcc -I./ -c -g -fno-common -O3 -Wa,-ahls=test.lst test.c Сделал всё как доктор прописал, поначалу даже обрадывался Yes!!!, но полностью просмотрев листинг обнаружил, что комментарии из строк сишного исходника вставлены всего в три функции (причём мелких и не интересных), а их в исходнике с десяток, и та которая которая глючит представлена в неудобоваримом виде: номер строки в исходнике и ассемблерный текст, приходится два окна открывать, в одном исходник - в другом листинг, это же неудобно :-(

AM> Кстати, какая у тебя версия ассемблера? GNU assembler 2.15

;-)

Reply to
Gerasimov Gerasim

Привет Gerasimov!

19 Jan 06 06:53, Gerasimov Gerasim писал Alex Mogilnikov:

GG> Сделал всё как доктор прописал, поначалу даже обрадывался Yes!!!, но GG> полностью просмотрев листинг обнаружил, что комментарии из строк GG> сишного исходника вставлены всего в три функции (причём мелких и не GG> интересных), а их в исходнике с десяток, и та которая которая глючит GG> представлена в неудобоваримом виде: номер строки в исходнике и GG> ассемблерный текст, приходится два окна открывать, в одном исходник - GG> в другом листинг, это же неудобно :-(

Hикогда с такми не сталкивался. Хотя я очень редко листинги смотрю. Покажи пример исходного файла, я попробую воспроизвести. Если большой и сократить не получается, можешь выслать мне на alx<некошка>intellectronika.ru.

Всего наилучшего, [Team PCAD 2000] Алексей М. ... О сколько нам открытий чудных готовит открывашки крюк!

Reply to
Alex Mogilnikov

Hi!

Nickita A Startcev snipped-for-privacy@p19.f.n5030.z2.fido.cca.usart.ru>

writes:

NAS> EM>> objdump -dStl твой.elf NAS> NAS> GG> Hе получилось, зато получилось с листингом, добавил NAS> GG> -Wa,-ahlns=$(<:.c=.lst)при компиляции, однако (h) include high-level NAS> GG> source так и не получил (так понимаю строки ассемблера должны NAS> GG> предварять строки сишного исходника), странно почему? NAS> NAS> GG> ;-) NAS> NAS> Hаверное при компиляции деба-g инфу не производил? :)

Hаверно.

objdump - из ARM toolchain-а?

Вот мой Makefile для mcpgcc (с APM не работал) в листинге (superpuper.l43) есть все, включая сишные комментарии и абсолютные адреса.

- ---8<------8<------8<------8<------8<------8<------8<------8<---

NAME = superpuper CPU = msp430x147

#ADD_FLAGS = -D GDB_DEBUG #ADD_FLAGS = -D WDT_ON_MODE -D GDB_DEBUG ADD_FLAGS = -D WDT_ON_MODE

ASFLAGS = -mmcu=${CPU} -D_GNU_ASSEMBLER_ ${ADD_FLAGS} -Wa,-gstabs -g CFLAGS = -mmcu=${CPU} -O2 -Wall -g ${ADD_FLAGS} #CFLAGS = -mmcu=${CPU} -S

# switch the compiler (for the internal make rules) CC = msp430-gcc AS = msp430-gcc EMACS = c:/gnu/emacs-20.7/bin/emacs.exe

CLEANEXTS := *.bak *.tmp *.o *.d *.elf *.a43 *.l43 *.s

sources = $(wildcard *.c) $(wildcard *.S) objects = $(addsuffix .o,$(basename $(sources))) depends = $(objects:.o=.d)

.PHONY: all clean download download-jtag download-bsl dist tags dep build

all: ${NAME}.elf ${NAME}.hex ${NAME}.l43

build: clean all

# confgigure the next line if you want to use the serial download download: download-jtag # download: download-bsl

# additional rules for files main_const.h: main_const.el ${EMACS} -batch --unibyte --load=$< --funcall=eval-buffer

${NAME}.elf: ${objects} ${CC} -mmcu=${CPU} -o $@ $^

${NAME}.hex: ${NAME}.elf msp430-objcopy -O ihex $^ $@

${NAME}.l43: ${NAME}.elf msp430-objdump -dStl $^ >$@

download-jtag: all msp430-jtag -e ${NAME}.elf

download-bsl: all msp430-bsl -e ${NAME}.elf

clean: rm -f $(CLEANEXTS)

tags: find . -name '*.c' -print -or -name '*.h' -print -or -name '*.S' -print | xargs -e ctags -e

# backup archive dist: tar czf dist.tgz *.c *.h *.txt *.S Makefile

%.o: %.c $(CC) -MMD $(CFLAGS) -c -o $@ $<

%.o: %.S $(AS) -MMD $(ASFLAGS) -c -o $@ $<

%.d: %.c @echo "Making depends for $<" $(CC) -MM $(CPPFLAGS) $(CFLAGS) $< 1>$@

%.d: %.S @echo "Making depends for $<" $(CC) -MM $(CPPFLAGS) $(ASFLAGS) $< 1>$@

dep: $(depends)

include $(depends)

- --->8------>8------>8------>8------>8------>8------>8------>8---

Reply to
Eugene Markov

EM> А это кстати, не результат оптимизации (-O3)? EM> Ассемблерный код может принимать весьма причудливые формы :) EM> и становится непонятно к какому месту приткнуть исходный текст.

Так и есть, убрал оптимизацию - получил путёвый листинг! Всем спасибо.

С уважением, Герасимов.

ЗЫ ...но воросы по gcc ещё будут

Замути хитовый расколбас

Reply to
Gerasimov Gerasim

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.