Umístění řetězce do SRAM
Napsal: 09 pro 2009, 14:00
Po letech na Unixu a Windows to chci zase zkusit na mikrokontrolérech. V AVR studiu s instalovaným pluginem WinAVR jsem v C zkusil následující:
#include <avr\io.h>
#include <string.h>
int main(int argc, char* arvg[])
{
char* ahoj = "ahoj";
char* ptr;
ahoj[2] = PINB;
ptr = strchr(ahoj, 'h');
PORTC = *++ptr;
}
problém je, že prográmek pracuje jinak , když není nastavena optimalizace (-O0) a jinak když je nějaká nastavena - třeba -Os.
Je-li optimalizace nastavena, kompilátor umístí řetězec ahoj do kódového segmentu a jelikož tam nelze zapisovat, tak vynechá celé řádky se čtením z portu B a s funkcí strchr() . Přitom není vydáno žádné varování, i když gcc má zapnuto -Wall .
Jak donutit kompilátor dávat řetězec do SRAM - přišel jsem na jediné:
volatile char* ahoj = "ahoj";
což se mi ovšem nepozdává, vzhledem k tomu, že volatile má primárně jiný význam. Existuje nějaký konformnější způsob?
#include <avr\io.h>
#include <string.h>
int main(int argc, char* arvg[])
{
char* ahoj = "ahoj";
char* ptr;
ahoj[2] = PINB;
ptr = strchr(ahoj, 'h');
PORTC = *++ptr;
}
problém je, že prográmek pracuje jinak , když není nastavena optimalizace (-O0) a jinak když je nějaká nastavena - třeba -Os.
Je-li optimalizace nastavena, kompilátor umístí řetězec ahoj do kódového segmentu a jelikož tam nelze zapisovat, tak vynechá celé řádky se čtením z portu B a s funkcí strchr() . Přitom není vydáno žádné varování, i když gcc má zapnuto -Wall .
Jak donutit kompilátor dávat řetězec do SRAM - přišel jsem na jediné:
volatile char* ahoj = "ahoj";
což se mi ovšem nepozdává, vzhledem k tomu, že volatile má primárně jiný význam. Existuje nějaký konformnější způsob?