Prechod z WinAvr na AvrToolchain

Zdravim vsechny.
Zacal jsem si pohravat s myslenkou ze vzhledem k tomu ze WinAvr uz neni dale vyvijeno prejdu na AvrToolchain. Po instalaci jsem vsak zjistil, ze me programy jsou napsany tak, ze v AvrToolchain nejdou prelozit.
Nejvetsi potiz mam se svym programkem MENU puvod zdeavrfreaks.net/index.php?module=Freaks%20Academy&func=viewItem&item_type=project&item_id=847.
Pouzivam ho ve spouste projektech, nicmene jsem zjistil ze nejde prelozit v toolchain a me vedomosti nestaci na to abych ho prepsal tak, aby sel prelozit v toolchain.
Pokud by mi byl nekdo schopen pomoci, byl bych velice vdecny.
V priloze je obrazek z prekladu.
program.png

Odkaz je pro nepřihlášené nefunkční. Bez kódu s tím asi nic nesvedem.

Kod kompletniho programu ktery sel prelozit ve winavr je v priloze.
Je tak obsahly, ze kdybych ho dal do code tak by clovek roloval az do rana.
Pouzivam WinAvr 4.19 a AvrToolchain 3.4.0.1146
Moc dekuji
Morse_3_1.zip (18.7 KB)

Dej sem chybovy hlasky co ti dava prekladac.

Ok.
V hlavnim programu mam menu nadefinovane nejak takto


//MENU 1
MAKE_MENU(MN100		, MN200		, NULL_ENTRY, NULL_ENTRY, MN101		, Main_Text, NULL_FUNC	,"1. Prehrat zpr.");
//Submenu Menu 1
MAKE_MENU(MN101		, MN102		, NULL_ENTRY, MN100		, NULL_ENTRY, Sibl_Text, func101	,"1.1 Hrat c.1");
MAKE_MENU(MN102		, MN103		, MN101		, MN100		, NULL_ENTRY, Sibl_Text, func102	,"1.2 Hrat c.2");
MAKE_MENU(MN103		, MN104		, MN102		, MN100		, NULL_ENTRY, Sibl_Text, func103	,"1.3 Hrat c.3");
MAKE_MENU(MN104		, NULL_ENTRY, MN103		, MN100		, NULL_ENTRY, Sibl_Text, func104	,"1.4 Hrat c.4");
//MENU 2
MAKE_MENU(MN200		, MN300		, MN100		, NULL_ENTRY, MN201		, Main_Text, NULL_FUNC	,"2. Upravit zpr.");
//Submenu Menu 2
MAKE_MENU(MN201		, MN202		, NULL_ENTRY, MN200		, NULL_ENTRY, Sibl_Text, func201	,"2.1 Zmen c.1");
MAKE_MENU(MN202		, MN203		, MN201		, MN200		, NULL_ENTRY, Sibl_Text, func202	,"2.2 Zmen c.2");
MAKE_MENU(MN203		, MN204		, MN202		, MN200		, NULL_ENTRY, Sibl_Text, func203	,"2.3 Zmen c.3");
MAKE_MENU(MN204		, NULL_ENTRY, MN203		, MN200		, NULL_ENTRY, Sibl_Text, func204	,"2.4 Zmen c.4");

V menu.h je to zpracovavano takto


#include <avr/pgmspace.h>

// Typedefs:
typedef void (*FuncPtr)(void);
typedef void (*WriteFuncPtr)(const char*);
typedef void (*ClrFuncPtr)(void);

typedef struct  PROGMEM{
	void       *Next;
	void       *Previous;
	void       *Parent;
	void       *Sibling;
	FuncPtr     SelectFunc;
	FuncPtr     EnterFunc;
	const char  Text];
} Menu_Item;

// Externs:
extern WriteFuncPtr*    WriteFunc;
extern ClrFuncPtr*    ClrFunc;
extern Menu_Item        Null_Menu;
extern Menu_Item*       CurrMenuItem;

// Defines and Macros:
#define NULL_ENTRY Null_Menu
#define NULL_FUNC  (void*)0
#define NULL_TEXT  0x00

#define PREVIOUS   *((Menu_Item*)pgm_read_word(&CurrMenuItem->Previous))
#define NEXT       *((Menu_Item*)pgm_read_word(&CurrMenuItem->Next))
#define PARENT     *((Menu_Item*)pgm_read_word(&CurrMenuItem->Parent))
#define SIBLING    *((Menu_Item*)pgm_read_word(&CurrMenuItem->Sibling))
#define ENTERFUNC  *((FuncPtr*)pgm_read_word(&CurrMenuItem->EnterFunc))
#define SELECTFUNC *((FuncPtr*)pgm_read_word(&CurrMenuItem->SelectFunc))

#define MAKE_MENU(Name, Next, Previous, Parent, Sibling, SelectFunc, EnterFunc, Text) \
    extern Menu_Item Next;     \
	extern Menu_Item Previous; \
	extern Menu_Item Parent;   \
	extern Menu_Item Sibling;  \
	Menu_Item Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Sibling, (FuncPtr)SelectFunc, (FuncPtr)EnterFunc, { Text }}

Pri prekladu to hlasi toto

../Menu.h:34:25: error: variable 'Null_Menu' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../Morse_3_1.c:120:1: error: variable 'MN200' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../Morse_3_1.c:120:1: error: variable 'Null_Menu' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../Morse_3_1.c:120:1: error: variable 'Null_Menu' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../Morse_3_1.c:120:1: error: variable 'MN101' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../Morse_3_1.c:120:1: error: variable 'MN100' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
Kod moc nechapu, takze jsem zkusil zmenit extern za const, ale potom to pise toto

../Morse_3_1.c:120:1: error: variable 'MN100' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../Morse_3_1.c:122:1: error: conflicting type qualifiers for 'MN100' ../Morse_3_1.c:120:1: note: previous definition of 'MN100' was here ../Morse_3_1.c:122:1: error: variable 'MN101' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../Morse_3_1.c:122:1: error: conflicting type qualifiers for 'MN101' ../Morse_3_1.c:120:1: note: previous declaration of 'MN101' was here
Momentalne jsem prepnuty na WinAvr, kde to funguje, ale chtelo by se to prevexlovat na ten toolchain, protoze ten se vyviji.

Tak nevim… Otevřel jsem, a přeložil bez chyb (vyjma varování o chybějící definici F_CPU). Toolchain 3.3.0.710. Zkusim stáhnout novější.

Ty chyby rikaj, ze mas mit promennou deklarovanou jako const, pokud ji chces mit v progmem. Nelibi se mu PROGMEM u struktury Menu_item.

V novější verzi to přeložit opravdu nejde.
Koukal jsem do toho programu, ale absolutně netušim, co se kam předává, jak to funguje a kde se berou ty konstanty způsobující chyby. Definice v souborech nevidím.
Zakomentování progmem jak píše kuto řeší problém překladu, ale netuším, jaký to bude mít vliv na funčnost programu, neboť jsou tam různé přístupy do flash a struktura se tím z flash odstraní (pokud tam vůbec byla někdy umístěna).

Takto chaotickej kód bych se bez podrobného popisu od “výrobce” použít neodvážil…

Ano, nechtel jsem mit pripominky ke kodu, kazdej pise po svym, ale kdyz uz to kolega nakousnul… prepis to znova a lepe :wink:

Ja jsem bohuzel jenom takovy uzivatel, ktery se snazi adaptovat jiz existujici vec k obrazu svemu.
Hledal jsem spousty menu pro AVR, moc jich neni a tohleto mi prislo jako nejjednodussi.
Me pracovni vytizeni mi neumoznuje zabyvat se jak to vyvinout odznova.
Jednoduche neflexibilni menu bych samozrejme udelal pres case, ale tohleto se mi libi.
Je mozne ze nejnovejsi toolchain je moc novy a vyjde nejaka oprava, zkusim pouzivat starsi.
Vtip je v tom, ze se tam pouzivaji makra a ne standartni funkce.
Pokud mate tip na hotove menu alfanumericky display pro AVR, popr. nabidnete sve budu moc rad.
S pozdravem

Na ty makra jsem koukal, ale hlavně jsem tam nikde neviděl definice toco, co bylo onomu víceřádkovýmu makru předhazováno.

Nějaký menu jsem sem už dával. Nevím, zda jsi ho zkoušel (samozřejmě nemusí vyhovovat).

Blbej google ani to neumi najit.
Zkusim ho, sice to znamena prekopat cely muj program, ale zase to funguje s toolchainem, takze v pohode.
Diky moc

To asi proto, že odkaz na kód je pouze na tomto fóru a navíc v místě s omezeným přístupem :smiley:.

Ahoj Piityy
Zkousel jsem i to tvoje menu a s nejnovejsim toolchain to dela to same.

../main.c:8:6: error: variable 'menuStr0' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../main.c:9:6: error: variable 'menuStr1' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../main.c:10:6: error: variable 'menuStr2' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../main.c:11:6: error: variable 'menuStr3' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../main.c:12:6: error: variable 'menuStr4' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ../main.c:13:6: error: variable 'menuStr5' must be const in order to be put into read-only section by means of '__attribute__((progmem))'
Muzes se na to prosim podivat?

Před deklaraci textu vlož “const” -> “const char menuStr0] PROGMEM = “no menu”;”
a do parametr inicializační funkce přetypuj na pointer na char -> “menuItemAdd((char *)menuStr1, 0, NULL);”.

Nemám to ovšem momentálně na čem vyzkoušet, nicméně překlad je vpořádku.

Ahoj.
Provedl jsem prislusne zmeny a poslusne hlasim, ze jsem to vyzkousel a overil a vsechno funguje.
a) Nechapu jak to funguje
b) Nechapu proc s jednou verzi toolchain to funguje a s druhou ne.

Mockrat dekuji.

Jak to funguje: spousta pointerování :smiley:. Bylo to takové odpolední cvičení abych se nenudil. Obyčejné pointery, parametry funkcí, pointery na funkce, pole pointerů… Prostě samý zábavný věci :wink:.

proč…: upgrage. Holt asi soudruhům připadalo PROGMEM jako nedostatečné označení paměťového místa a možnosti přístupu k němu…

Tak ono to vypliva z logiky veci. Nevim jak se tvari prekladac, kdyz se da zmena hodnoty promenne v progmem. Jestli hlasi chybu nebo ne. Pokud v progmem vyzaduje const, tak uz je pri prekladu jasne ze tu hodnotu nejde menit. Takze se tim omezi tento typ chyb v programu.

omlouvám se, že oživuju starý téma, ale to micromenu má novou verzi.
To co je na AVRfreaks je zastaralé. Autor psal, že je to kvůli rozbitým stránkám, takže všichni momentálně nemohou nahrávat svoje projekty. S novým příchodem stránek se snad vše vyřeší…
Tady je nová verze. Nezkoušel jsem…menu dělám prasácky přes switch :smiley:
github.com/abcminiuser/micromenu-v2