Se variablel i gdb
Se variablel i gdb
Jag har problem med något helt grundläggande i gdb. Jag kan inte läsa variabelvärden med print. däremot finns rätt värde på rätt plats i minnet (se nedan). Någon som vet?
Saxat ur gdb:
Breakpoint 2, even () at demo.c:71
71 {
(gdb) print apa
$1 = -18483 <---------felaktigt värde
(gdb) print &apa
$2 = (int *) 0x800060 <---------stämmer med .map-filen
(gdb) x 0x800060
0x800060 <apa>: 0x00000002 <---gdb säger att apa ligger här, värdet rätt!
Det jag kör är WinAVR installerat rakt av på Windows XP. Programmet exekverar i simulavr. samma betende i insight och avr-gdb. (Förresten , insight verkar skakigt men en sak i taget...)
Saxat ur gdb:
Breakpoint 2, even () at demo.c:71
71 {
(gdb) print apa
$1 = -18483 <---------felaktigt värde
(gdb) print &apa
$2 = (int *) 0x800060 <---------stämmer med .map-filen
(gdb) x 0x800060
0x800060 <apa>: 0x00000002 <---gdb säger att apa ligger här, värdet rätt!
Det jag kör är WinAVR installerat rakt av på Windows XP. Programmet exekverar i simulavr. samma betende i insight och avr-gdb. (Förresten , insight verkar skakigt men en sak i taget...)
Jag har egentligen ingen aning om varför gdb beter sig så där. Men är du säker på att du har angivit rätt AVR i simulavr? Sen kan du prova att lägga till nyckelordet "volatile" innan "int" i deklarationen, så att det inte är det som spökar. Ett tips är att använda int16_t (uint16_t för unsigned) istället för int så att du enklare ser att det är ett 16-bitars-tal.
Visst kan jag det. En del kommentarer är fel, jag har hackat om demo.c utan att ändra i kommentarer osv.
Detta är vad som händer: main anropar second. second loopar tusen gånger, varannan gån anropas odd, varannan even. Både odd och even inkrementerar apa med ett. Det är alltså ett rent nonsensprogram för att testa lite.
/*
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <joerg@FreeBSD.ORG> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Joerg Wunsch
* ----------------------------------------------------------------------------
*
* Simple AVR demonstration. Controls a LED that can be directly
* connected from OC1/OC1A to GND. The brightness of the LED is
* controlled with the PWM. After each period of the PWM, the PWM
* value is either incremented or decremented, that's all.
*
* $Id: demo.c,v 1.4 2004/07/21 21:03:07 joerg_wunsch Exp $
*/
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#if defined(__AVR_AT90S2313__)
# define OC1 PB3
# define OCR OCR1
# define DDROC DDRB
#elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__)
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1
#elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || \
defined(__AVR_AT90S4434__) || defined(__AVR_AT90S8535__) || \
defined(__AVR_ATmega163__)
# define OC1 PD5
# define DDROC DDRD
# define OCR OCR1A
#elif defined(__AVR_ATmega8__)
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1A
# define PWM10 WGM10
# define PWM11 WGM11
#elif defined(__AVR_ATmega32__)
# define OC1 PD5
# define DDROC DDRD
# define OCR OCR1A
# define PWM10 WGM10
# define PWM11 WGM11
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
# define OC1 PB5
# define DDROC DDRB
# define OCR OCR1A
# define PWM10 WGM10
# define PWM11 WGM11
#else
# error "Don't know what kind of MCU you are compiling for"
#endif
#if defined(COM11)
# define XCOM11 COM11
#elif defined(COM1A1)
# define XCOM11 COM1A1
#else
# error "need either COM1A1 or COM11"
#endif
volatile int16_t apa;
void even()
{
apa++;
}
void odd()
{
apa++;
}
void
second (void)
{
int i = 100;
for(i = 0; i < 1000; i++){
if(0 == i % 2)
even();
else
odd();
}
/* loop forever, the interrupts are doing the rest */
for (;;) /* Note [6] */
;
return (0);
}
int
main (void)
{
second();
}
Detta är vad som händer: main anropar second. second loopar tusen gånger, varannan gån anropas odd, varannan even. Både odd och even inkrementerar apa med ett. Det är alltså ett rent nonsensprogram för att testa lite.
/*
* ----------------------------------------------------------------------------
* "THE BEER-WARE LICENSE" (Revision 42):
* <joerg@FreeBSD.ORG> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a beer in return. Joerg Wunsch
* ----------------------------------------------------------------------------
*
* Simple AVR demonstration. Controls a LED that can be directly
* connected from OC1/OC1A to GND. The brightness of the LED is
* controlled with the PWM. After each period of the PWM, the PWM
* value is either incremented or decremented, that's all.
*
* $Id: demo.c,v 1.4 2004/07/21 21:03:07 joerg_wunsch Exp $
*/
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#if defined(__AVR_AT90S2313__)
# define OC1 PB3
# define OCR OCR1
# define DDROC DDRB
#elif defined(__AVR_AT90S2333__) || defined(__AVR_AT90S4433__)
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1
#elif defined(__AVR_AT90S4414__) || defined(__AVR_AT90S8515__) || \
defined(__AVR_AT90S4434__) || defined(__AVR_AT90S8535__) || \
defined(__AVR_ATmega163__)
# define OC1 PD5
# define DDROC DDRD
# define OCR OCR1A
#elif defined(__AVR_ATmega8__)
# define OC1 PB1
# define DDROC DDRB
# define OCR OCR1A
# define PWM10 WGM10
# define PWM11 WGM11
#elif defined(__AVR_ATmega32__)
# define OC1 PD5
# define DDROC DDRD
# define OCR OCR1A
# define PWM10 WGM10
# define PWM11 WGM11
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
# define OC1 PB5
# define DDROC DDRB
# define OCR OCR1A
# define PWM10 WGM10
# define PWM11 WGM11
#else
# error "Don't know what kind of MCU you are compiling for"
#endif
#if defined(COM11)
# define XCOM11 COM11
#elif defined(COM1A1)
# define XCOM11 COM1A1
#else
# error "need either COM1A1 or COM11"
#endif
volatile int16_t apa;
void even()
{
apa++;
}
void odd()
{
apa++;
}
void
second (void)
{
int i = 100;
for(i = 0; i < 1000; i++){
if(0 == i % 2)
even();
else
odd();
}
/* loop forever, the interrupts are doing the rest */
for (;;) /* Note [6] */
;
return (0);
}
int
main (void)
{
second();
}
jag ser inte att du initierar apa nånstans. Den kan då få vilket konstigt värde som helst (och visst det kan bli samma flera gånger. jag har felsökt ögonen blodiga efter sådana här fel). Testa med det det kan funka.
En liten,liten optimering också:
Jag tror att % operatorn är ganska slö, kanske inte med % 2 bara men man kan juh byta ut if(0 == i % 2) mot
if(! (i & 0x01))
Hoppas det hjälper
En liten,liten optimering också:
Jag tror att % operatorn är ganska slö, kanske inte med % 2 bara men man kan juh byta ut if(0 == i % 2) mot
if(! (i & 0x01))
Hoppas det hjälper
Ja, visst. Men för att vara helt säker på att det inte är något som optimeras bort så kan det vara bra att testa det.Icecap skrev:"volatile" betyder bara att ett koll av värdet inte ska optimeras bort, värdet kan ändras av andra delar av programmet eller av hårdvara och därmed kan programmet inte utgå ifrån att värdet inte behöver kollas.
Används ofta som beskrivning av hårdvaru-portar osv.
JJ: Det fungerar bra att debugga den där koden i gdb. Jag provade att sätta en breakpoint på apa++ i odd() att det fungerar som det ska. Jag provade att köra den som en AT90s2313.
Ingen initiering => C runtime initierar variabel till 0.
Tack för optimeringstipset...jag skall försöka förstå när jag fåt gdb att funka överhuvudtaget.
cykze: Jag använde atmeg8 och det gjorde ingen skillnad att byta processor. Jag specificerar uC på två ställen: i make-filen och efter -d-flaggan i simulavr. Det behövs väl inte på fler ställen?
Ett annat sätt att visa mitt problem:
(Den här gången är korrekt värde = 1 och apa är unsigned int.)
(gdb) print *(&apa)
$3 = 1 <---korrekt
(gdb) print apa
$4 = 38401 <---hur kan detta vara annorlunda?
(gdb)
Det känns som om jag missat att konfigurera utskriftsformat eller något...fast jag tycker att jag kollat allt sådant.
Tack för optimeringstipset...jag skall försöka förstå när jag fåt gdb att funka överhuvudtaget.
cykze: Jag använde atmeg8 och det gjorde ingen skillnad att byta processor. Jag specificerar uC på två ställen: i make-filen och efter -d-flaggan i simulavr. Det behövs väl inte på fler ställen?
Ett annat sätt att visa mitt problem:
(Den här gången är korrekt värde = 1 och apa är unsigned int.)
(gdb) print *(&apa)
$3 = 1 <---korrekt
(gdb) print apa
$4 = 38401 <---hur kan detta vara annorlunda?
(gdb)
Det känns som om jag missat att konfigurera utskriftsformat eller något...fast jag tycker att jag kollat allt sådant.