avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [avr-gcc-list] More on optimization


From: Dean Ferreyra
Subject: RE: [avr-gcc-list] More on optimization
Date: Thu, 10 Oct 2002 11:58:31 -0700

How about inside your cli() sei(), assigning the value of gval to a local
uint8_t variable, manipulating it as necessary, then assigning the final
result back to gval?

Dean

-----Original Message-----
From: address@hidden [mailto:address@hidden
Behalf Of Tvrtko A. Ursulin
Sent: Thursday, October 10, 2002 10:41 AM
To: address@hidden
Subject: [avr-gcc-list] More on optimization



First of all, many thanks to everyone for help with "volatile" issue. Yes, I
now see it is the first question in the FAQ, but until now, I didn't even
know that such a FAQ exists.

So excuse me for asking that, and let me thank everyone once more.

Another thing I was unable to find is the list of all -O options avr-gcc
understands and some details on them. A link woudl be ok.

Then, back to the volatile issue.

Declaring variables volatile really makes the compiler store them after
changing. But I am looking for something more than that and I hope doing
everything in assembler won't be the answer.

Examine this:

volatile uint8_t        gval;

DECLARE_TASK(task3);

void task3(void)
{
        uint8_t val;

        for (;;)
        {
                cli();
 10a:   f8 94           cli
                gval++;
 10c:   80 91 62 00     lds     r24, 0x0062
 110:   8f 5f           subi    r24, 0xFF       ; 255
 112:   80 93 62 00     sts     0x0062, r24
                gval--;
 116:   80 91 62 00     lds     r24, 0x0062
 11a:   81 50           subi    r24, 0x01       ; 1
 11c:   80 93 62 00     sts     0x0062, r24
                val = gval;
 120:   80 91 62 00     lds     r24, 0x0062
                sei();
 124:   78 94           sei
 126:   f1 cf           rjmp    .-30            ; 0x10a


So compiler does lds/sts pair too often? Ok, it is not wrong or a bug, but I
would like to somehow instruct it to behave differently if it is possible.

For my usage, I would like something like this:

cli
lds r24, 0x0060

HEY-MISTER-COMPILER -> although var. at 0x0060 is volatile leave it be until
not explicitly said otherwise

some operations with/on r24...

HEY-MISTER-COMPILER -> i am done with this var, procees

sts 0x0060, r24
sei
etc...

In a way, this would signal the compiler that the entire block surrounded
with
HEY-MISTER-COMPILER is atomic eg. no interrupts. So no need to lds/sts more
than once.

Am I doing something terribly wrong or it can be done? :)

Thanks!




avr-gcc-list at http://avr1.org


avr-gcc-list at http://avr1.org



reply via email to

[Prev in Thread] Current Thread [Next in Thread]