Jak zmusić kompilator AVR-GCC do wykonania dyrektywy języka C inline Jak do tej pory wszystkie procedury są wywoływane przez CALL
Czy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tam
[b]inline[/b] void Funkcja(void)
{
...
}
void main(void)
{
Funkcja();
}
BoskiDialer napisał:aby funkcja była inline i była przez kompilator wstawiona pisze się np:[b]inline[/b] void Funkcja(void) { ... } void main(void) { Funkcja(); }
GienekS napisał:Mnie nawet jek się znajduje w tym samym pliku też zawsze jest tylko "wywoływana"
#include <avr/io.h>
inline void Send(uint8_t data){
PORTA=data+10;
}
int main(void){
uint8_t a;
a=10;
Send(a);
while(1);
}
int main(void){
d0: cf ef ldi r28, 0xFF ; 255
d2: d0 e1 ldi r29, 0x10 ; 16
d4: de bf out 0x3e, r29 ; 62
d6: cd bf out 0x3d, r28 ; 61
d8: 84 e1 ldi r24, 0x14 ; 20 <- tu jest inline !!!
da: 8b bb out 0x1b, r24 ; 27 <-
uint8_t a;
a=10;
Send(a);
while(1);
dc: ff cf rjmp .-2 ; 0xdc
#include "io.h"
/* Ustawienie lini portów do komunikacji
*/
void Init_IO (void)
{
DDRC = 0x0f;
}
/* Procedura nadaje bajt do linijki */
void SendBajt (u08 bajt)
{u08 j = 1;
do {
if (bajt & j)
Q0 = 1;
else
Q0 = 0;
CLK = 1;
j <<= 1;
CLK = 0;
} while (j>0);
}
/* Procedura nadaje blok do linijki */
void SendBlok (u08* adres, u08 ilosc)
{
while (ilosc) {
SendBajt (*adres++);
ilosc--;
}
Strob ();
}
/* Strob przepisuje dane w 4094 */
inline void Strob (void)
{
STR = 1;
asm ("nop\n\t"
"nop\n\t");
STR = 0;
OE = 1; // włączenie 4094
}/* Procedura nadaje blok do linijki */
void SendBlok (u08* adres, u08 ilosc)
{
b2: 0f 93 push r16
b4: 1f 93 push r17
b6: cf 93 push r28
b8: 8c 01 movw r16, r24
ba: c6 2f mov r28, r22
while (ilosc) {
bc: 66 23 and r22, r22
be: 39 f0 breq .+14 ; 0xce
SendBajt (*adres++);
c0: f8 01 movw r30, r16
c2: 81 91 ld r24, Z+
c4: 8f 01 movw r16, r30
c6: 0e 94 4c 00 call 0x98
ilosc--;
ca: c1 50 subi r28, 0x01 ; 1
cc: c9 f7 brne .-14 ; 0xc0
}
Strob ();
ce: 0e 94 6d 00 call 0xda
}
d2: cf 91 pop r28
d4: 1f 91 pop r17
d6: 0f 91 pop r16
d8: 08 95 ret
inline void Strob (void)
{
STR = 1;
asm ("nop\n\t"
"nop\n\t");
STR = 0;
OE = 1; // włączenie 4094
}
#define Strob() { STR = 1; \
asm ("nop\n\t" \
"nop\n\t"); \
STR = 0; \
OE = 1; }
GienekS napisał:Czyli cały czas jest ta procedura wywoływana a nie inline
Dlaczego !!!
void Sprawdz(void)
{
PobierzDane();
}
void PobierzDane(void)
{
}
BoskiDialer napisał:Zbych_: prototyp funkcji robi się wtedy kiedy do funkcji odwołujemy się nad jej właściwą implementacją.. np kod:
Cytat:undefined reference to `io_init'
inline int f(int) __attribute__((always_inline))
{
.......
}
Dr.Vee napisał:Poza tym jest kilka parametrów które kontrolują ten proces - wszystkie są wymienione na powyższej stronie.