PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Atmega: pgm



schorsch_76
11.09.2014, 11:13
Hallo zusammen!

Ich habe eine Menüstruktur welche durch eine Tabelle festgelegt wird.



// ---------------------------
261 // description of the pages
262 // ---------------------------
263 const menu_page_desc_t pages[] PROGMEM =
264 {
265 // page title page action line1 line2 line3
266 { page_overview, title_overview, nullptr, &overview_line1, &overview_line2, &overview_line3},
267 { page_overview_2, title_overview, nullptr, &overview2_line1, &overview2_line2, &overview2_line3},
268
269 { page_usage_water, title_usage_water, nullptr, &usage_water_print, nullptr, nullptr},
270 { page_usage_water_set, title_usage_water_set, &set_temp_usage_water_func, &usage_water_print, nullptr, nullptr},
271
272 { page_date, title_date, nullptr, &print_date, &print_time, nullptr},
273 { page_date_year_set, title_date_year_set, &set_year, &print_date, &print_time, nullptr},
274 { page_date_month_set, title_date_month_set, &set_month, &print_date, &print_time, nullptr},
275 { page_date_day_set, title_date_day_set, &set_day, &print_date, &print_time, nullptr},
276 { page_date_hour_set, title_date_hour_set, &set_hour, &print_date, &print_time, nullptr},
277 { page_date_min_set, title_date_min_set, &set_min, &print_date, &print_time, nullptr},
278 { page_date_dow_set, title_date_dow_set, &set_day, &print_date, &print_time, nullptr},
279 };



Wie man sihet sind die Seitenaktionen Funktionspointer. Mit pgm_read_byte() kann ich bsp. die Page ID lesen, aber: Wieviele Byte muss if für die funktionspointer lesen? Wie groß ist ein funktionspointer im AVR? Unter x86 sind es 4 byte unter x86_64 sind es eben 8. Wieviele beim AVR?

markusj
11.09.2014, 15:05
Wieviele beim AVR?

16 Bit, also 2 Byte. Statt den Wert fest in deinen Quellcode reinzukodieren kannst du auch sizeof(intptr_t) verwenden. intptr_t ist ein Datentyp, der garantiert einen Pointer speichern kann.

mfG
Markus

schorsch_76
11.09.2014, 17:08
Ich hab das jetzt so gelöst.



// read current page description into ram
memcpy_P(&page,&pages[current],sizeof(menu_page_desc_t));


Ich brauch eh die ganze Zeile ....

markusj
11.09.2014, 21:24
Vorbildlich ;)