hi-tech compilator problem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

hi-tech compilator problem

Inlägg av dangraf »

Jag har lite problem med hi-tech v9.63 kompilatorn som jag inte riktigt vet hur jag ska lösa.
Det verkar som att kompilatorn optimerar bort kod som inte används. Tyvärr använder jag koden genom att kalla på funktionspekare och vet inte riktigt hur jag ska göra för att kompilatorn inte ska göra denna optimering.

exempel:

Kod: Markera allt

#include <typedef.h>
#include <BufferObjRam.h>


uint8 buffer[100];
BufferObjRamT mainObj;


uint8 disableInt(void)
{
  return 1;
}


void RestoreInt(uint8 dat)
{
  return;
}
void main(void)
{
  uint8 (*foo)(void) = NULL;
  foo = disableInt;
 /* Detta fungerar utmärkt */
  foo();

/* Detta ger felmeddelande 800, hittar inte "RestoreInt
 Error   [800] ; 0. undefined symbol "_RestoreInt"  */
  BufferInitBuffer( &mainObj,
                      buffer,
                      100,
                      1,
                      disableInt,
                      RestoreInt );
}
Det jag vill göra är att skicka adresserna till funktionerna "disableInt" och "RestoreInt" till min buffer-init funktion så att denna kan kalla på funktionerna från ett annat ställe i koden.
Lägger jag till ett funktionsanrop till "RestoreInt" så försvinner felet. Det hela verkar som att kompilatorn inte fattar att jag faktiskt använder funktionerna.
Mitt problem är att jag inte riktigt vet hur jag ska få kompilatorn att låta mina funktioner vara kvar och länka in dem i huvudprogrammet på ett vettigt sätt. Har tittat i manualen och försökt använda kommandot "GLOBAL" för att den ska nås från alla ställen. Men detta verkar bara kunna göras i assembler. Har även testat att stänga av optimeringen och även sätta den på level 1 och 9.

Någon som vet hur jag ska göra?

Mvh/
Daniel
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: hi-tech compilator problem

Inlägg av stekern »

är det inte adresserna till funktionerna som du vill skicka?
dvs &disableInt och &RestoreInt
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: hi-tech compilator problem

Inlägg av dangraf »

Jo, det är adressen. Har testat att kompilera med och utan "&" tecken och verkar inte vara någon skillnad när man kör koden. Men, som sagt, om jag kallar på både diableInt och RestoreInt i main programmet så kompilerar den utan problem. Tyvärr är detta en dålig lösning eftersom jag använder funktions-pekare på fler ställen i koden och är lokalt deklarerade.
Användarvisningsbild
stekern
Inlägg: 453
Blev medlem: 2 november 2008, 08:24:18
Ort: Esbo, Finland

Re: hi-tech compilator problem

Inlägg av stekern »

Det var meningen att jag skulle utveckla mitt inlägg lite mer men barn började gasta omkring mig...
Jo, det ska ju funka utan &-tecken med, men jag tänkte om hi-tech var kinkig utan (jag har inte använt hi-tech så jag vet inte).

Vad händer om du skickar t.ex. foo till BufferInitBuffer (utan att köra foo();)
Det som låter märkligt är att det inte fungerar när du slår av optimeringen heller.

Vad händer om BufferInitBuffer ligger i samma fil som RestoreInt och disableInt?
SvenW
Inlägg: 1156
Blev medlem: 24 april 2007, 16:23:10
Ort: Göteborg

Re: hi-tech compilator problem

Inlägg av SvenW »

Det här är en gissning, men prova att deklarera funktionerna 'volatile'.
Man brukar kunna göra så med variabler för att förhindra att de optimeras bort, så varför inte även funktioner?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: hi-tech compilator problem

Inlägg av sodjan »

Det kan ju vara så att funktionerna ju inte innehåller något "av värde"
(d.v.s de gör inget) så kompilatorn optimerar bort dom. I det första
fallet så verkar anropet ("foo()") att "fungera", men även det kan optimeras
bort eftersom kompilatorn redan vet att funktionen i alla fall inte gör något.
T.ex så är ju foo = disableInt; detsamma som foo = 1;och det skulle
kompilatorn kunna se och helt optimera bort funktionsanropet.

I det andra fallet kraschar det eftersom funktionen i alla fall inte finns (längre)
och då finns det inte heller någon adress till den.

Vad händer om du lägger in något i funktionerna utöver enbart en return ?

Men som SvenW också sa, det är bara en gissning... :-)

Dessutom skulle sannolikt antingen kompilator listningen eller assembler listningen
från kompilatorn tala om vad som faktiskt händer. Även hurvida funktionen faktiskt
finns kvar även i det första fallet med det direkta anropet.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: hi-tech compilator problem

Inlägg av Icecap »

Och en sak jag kom att tänka på:
Kan man inte, medelst ett kompiler-direktiv, slå av optimeringen just vid dessa funktioner, på det vis kan man hindra att de optimeras bort.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: hi-tech compilator problem

Inlägg av dangraf »

testade att fylla ut funktionerna med att läsa och skriva till en pinne vars register är definierat som "volatile", men det hjälpte tyvär inte. Testade även att göra funktionerna som "volatile" genom att skriva "volatile void RestoreInt(uint8 dat)" och även "void volatile RestoreInt(uint8 dat)".
Har även testat att deklarera funktionerna som "extern void RestoreInt(uint8 dat);" överst i filen för att berätta för kompilatorn att de finns någonstans, hjälpte inte heller.

Har även testat att lägga till ytterligare en testfunktion (TestFunc) i koden som gör ung samma sak som min "BufferInitBuffer" funktion men i samma fil.

Även här verkar kompilatorn optimera bort mina funktioner eftersom den inte fattar att jag faktiskt använder funktionerna.

Jag har letat i manualen för att försöka hitta något kommando som stänger av denna optimering som jag vet finns på hos andra kompilatorer men har inte hittat något ännu. Letar vidare..

såhär ser koden ut nu

Kod: Markera allt

#include <pic18.h>
#include <typedef.h>
#include <BufferObjRam.h>


uint8 buffer[100];
BufferObjRamT mainObj;

extern uint8 disableInt(void);
extern void RestoreInt(uint8 dat);

 uint8  disableInt(void)
{
  return RB4;
}


 void RestoreInt(uint8 dat)
{
  RB4 = dat;
  return;
}


void TestFunc( void (*RestInt)(uint8 dat), uint8 (*disInt)(void) )
{
  uint8 temp = disint();
  RestInt( temp );
}
void main(void)
{
  uint8 (*foo)(void) = NULL;
 // foo = disableInt;
  foo();

 TestFunc( RestoreInt, disableInt );
 /* BufferInitBuffer( &mainObj,
                      buffer,
                      100,
                      1,
                      disableInt,
                      RestoreInt );*/


//  BufferApiPut( &mainObj, buffer );
}
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: hi-tech compilator problem

Inlägg av Icecap »

Jag tror helt enkelt att det inte är för att de optimeras bort men för att du använder dom på fel sätt.

Har du kollat vad kompilern gör i listningen?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: hi-tech compilator problem

Inlägg av dangraf »

Jag har hittat en underlighet. När jag kompilerar och tittar på kommandot som exeveras så står det --opt=default hur jag än ställer in optimeringen. Det borde stå --opt=none enligt manualen.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47008
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: hi-tech compilator problem

Inlägg av TomasL »

Är det inte enklare att fråga Hitech?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: hi-tech compilator problem

Inlägg av dangraf »

jag har skrivit till microchip som verkar ha supporten för hi-tech. Trodde det var nått noobe fel eftersom jag inte använt kompilatorn tidigare.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47008
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: hi-tech compilator problem

Inlägg av TomasL »

Har de inte nått supportforum?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: hi-tech compilator problem

Inlägg av sodjan »

> ...men i samma fil.

Ah, det hade jag missat. Så de där funktionerna ligger i en C-fil och
dina anrop/referenser ligger i en annan ? Ja då är det kanske lite
svårare att säga vad som händer.

Varje C fil kompileras helt självständigt och har (vid kompileringen)
ingen som helst aning om vad du gör i den andra C filen. Så om du inte
ändrar något i den första filen (där funktionerna ligger) så spelar det
ingen roll alls vilka ändringar du gör i den andra. OK ?

Det är ju först vid länkiningen som länkaren ser att det finns kopplingar
mellan filerna, men då är det ju så dags, funktionerna är sannolikt redan
bort-optimerade vid det laget och de går inte att få tillbaka igen.

Du måste hitta en metod för den första C-filen som undertrycker den
optimeringen som plockar bort funktionerna. Det går säkert bara man hittar
rätt metod (och som sagt, ett HiTech forum är nog bättre).

Sedan borde det inte spela någon roll med vilka optimeringen som den
andra C-filen (med anropen/referenserna) kompileras.
Användarvisningsbild
lgrfbs
Inlägg: 7318
Blev medlem: 28 januari 2005, 15:48:53
Ort: X-län
Kontakt:

Re: hi-tech compilator problem

Inlägg av lgrfbs »

Skriv svar