Jak získat ukazatel na pole umístěné v paměti programu – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Jak získat ukazatel na pole umístěné v paměti programu – Mikrokontroléry – Fórum – Programujte.comJak získat ukazatel na pole umístěné v paměti programu – Mikrokontroléry – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
23. 5. 2017   #1
-
0
-

Ahoj

mám 8051, používám IDE EW8051 a v jazyce C jsem narazil na problém se získáním ukazatele na pole, které je umístěno v paměti programu: 

__code const char pole[] = {0x25, 0x35, 0x78};
char *p;

p = pole;  //nefunguje

"Klasický c-čkovský" přístup nefunguje, překladač pole a ukazatel p považuje za různé datové typy a nezkompiluje to. Přetypování na char* sice zkompiluje, ale pracuje s RAM. 

Potřebuji, aby ukazatel byl v proměnné a jejím prostřednictvím se s polem pracovalo. Jak na to?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
gna
~ Anonymní uživatel
1891 příspěvků
23. 5. 2017   #2
-
0
-

   

__code const char *p;

Kdybys chtěl "univerzální" pointer, tak to bude něco jako __far. Ten ale zase budeš muset "downgradovat" (zkopírovat data) pro funkce, které ho neberou (RTL), nebo můžeš změnit paměťový model celého programu (což bude asi nejjednodušší, ale pro pár řádků kódu zbytečné a přijdeš o spoustu optimalizací).

EW8051 neznám, ale hledej tímhle směrem.

Nahlásit jako SPAM
IP: 213.211.51.–
24. 5. 2017   #3
-
0
-

#2 gna
nemůže existovat jako autovariable, do takové proměnné nelze přiřadit hodnotu za běhu. Zatím mne napadlo použití XRAM nebo EEPROM, které jsou na čipu nebo generického ukazatele. A poslední možnost dvourozměrné pole místo několika jednorozměrných, tato změna koncepce by odstranila nutnost vrátit ukazatel na pole, ale pro změnu by vedla k vracení ukazatele na funkci, což by mohlo být schůdné. A na závěr nechat překladač umístit tyto pole plný konstant do RAM, pak by to bylo z pohledu psaní kódu snadné. Akorát tý RAM tam moc není, nějakých 80 Byte by byla citelná ztráta.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
24. 5. 2017   #4
-
0
-

#3 hlucheucho
čau, neměl bys tu adresu pole do p přiřazovat přes nějakou direktivu? nebo nějakým znakem p = [znak(*&...)]pole případně mě ještě napadá p = *pole[0], to je vše co bych zkoušel, ale ber mě s rezervou, snažím se pomoci aniž bych to nějak extra používal, ale sem tam něco zahlídnu když hledám řešení pro svůj program.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Grafoman
24. 5. 2017   #5
-
0
-

#4 MilanL
všude vidím konstrukce typu

char *p=&pole;

Nahlásit jako SPAM
IP: 185.112.167.–
24. 5. 2017   #6
-
0
-

Direktivu jsem v manuálu nenašel, počkám na vyjádření TP IAR Systems. Ikdyž jsem to vyřešil jinak, docela by mne to zajímalo do budoucna.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
Řešení
gna
~ Anonymní uživatel
1891 příspěvků
25. 5. 2017   #7
-
+1
-
Zajímavé
Vyřešeno Nejlepší odpověď

   

const char __code *p = pole;
Nahlásit jako SPAM
IP: 213.211.51.–
25. 5. 2017   #8
-
0
-

#7 gna
znovu: nelze použít jako autovariable, nelze tomu přiřadit ukazatel za běhu programu.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
KIIV
~ Moderátor
+43
God of flame
25. 5. 2017   #9
-
0
-

Na praci s __code jsou tam extra funkce se suffixem _P z headeru  pgmspace.h. Takze minimalne to musi jit predat jako parametr:

#define PGM_P      const char __code *
#define PGM_VOID_P const void __code *

/* Prototypes using PGM_P suffixed _P */
MEMORY_ATTRIBUTE int    memcmp_P(const void *, PGM_VOID_P, size_t);
MEMORY_ATTRIBUTE void  *memcpy_P(void *, PGM_VOID_P, size_t);
MEMORY_ATTRIBUTE int    printf_P(PGM_P,...);
MEMORY_ATTRIBUTE int    puts_P(PGM_P);
MEMORY_ATTRIBUTE int    scanf_P(PGM_P,...);
MEMORY_ATTRIBUTE int    sprintf_P(char *,PGM_P,...);
MEMORY_ATTRIBUTE int    sscanf_P(const char *, PGM_P,...);
MEMORY_ATTRIBUTE char  *strcat_P(char *, PGM_P);
MEMORY_ATTRIBUTE int    strcmp_P(const char *, PGM_P);
MEMORY_ATTRIBUTE char  *strcpy_P(char *, PGM_P);
MEMORY_ATTRIBUTE PGM_P  strerror_P(int);
MEMORY_ATTRIBUTE size_t strlen_P(PGM_P s);
MEMORY_ATTRIBUTE char  *strncat_P(char *, PGM_P, size_t);
MEMORY_ATTRIBUTE int    strncmp_P(const char *, PGM_P, size_t);
MEMORY_ATTRIBUTE char  *strncpy_P(char *, PGM_P, size_t);
Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
25. 5. 2017   #10
-
0
-

#9 KIIV
Takto je to vyřešené u Atmel Studia. Jsi už druhý, kdo radí zpřeházet modifikátory. K mému překvapení to má vliv. 

#define PGM_P      const char __code *
__code const char pole[] = {25, 14, 38};

PGM_P pokus()
{
  return pole;
}

a vrací 01BB kde se to pole fakticky nachází. Ale logiku to má: __code* jako ukazatel do paměti programu

hu

Nahlásit jako SPAM
IP: 195.178.67.–
25. 5. 2017   #11
-
0
-

#7 gna
Máš pravdu, přišel jsi s tím první. Až když KIIV dal funkční kód z Atmel Studia, došlo mi, že by to pořadí mohlo mít zásadní vliv.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
512 příspěvků
25. 5. 2017   #12
-
0
-

#1 hlucheucho
je to aj v manuálu :)

http://www.keil.com/support/man/docs/c51/c51_le_memspecificptrs.htm

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:8cf4:...–
25. 5. 2017   #13
-
0
-

#12 Jerry
u IAR jsem to v manuálu nenašel, asi má Keil lepší dokumentaci

hu

Nahlásit jako SPAM
IP: 195.178.67.–
gna
~ Anonymní uživatel
1891 příspěvků
25. 5. 2017   #14
-
0
-

#12 Jerry
Dokonce aj v tom k překladači, o kterém je řeč!   

Nahlásit jako SPAM
IP: 213.211.51.–
KIIV
~ Moderátor
+43
God of flame
25. 5. 2017   #15
-
0
-
Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
25. 5. 2017   #16
-
0
-

#14 gna
jestli jsi to v něm našel, zajímalo by mne jak. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
25. 5. 2017   #17
-
0
-

#15 KIIV
nechal jsem prohledat celý disk a ten soubor jsem nenašel. Jen si matně pamatuju, že tak pojmenovaný soubor u Atmel Studia (nemám ho nainstalované) existoval.

Člověk se celý život učí.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý