ATmega644 - ukazatel na funkci - špatná adresa – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

ATmega644 - ukazatel na funkci - špatná adresa – Mikrokontroléry – Fórum – Programujte.comATmega644 - ukazatel na funkci - špatná adresa – Mikrokontroléry – Fórum – Programujte.com

 
Hledat
Moderní platforma pro vytvoření vašeho nového webu – Wix.com.
Nyní už můžete mít web zdarma.
Vytvořte si vlastní webové stránky. Snadno, rychle a levně přes Saywebpage.com
Vybavení pro Laser Game
Spuštěn Filmový magazín
Laser Game Brno
Laser Game Ostrava

Smalsoft
~ Anonymní uživatel
4 příspěvky
27. 11. 2019   #1
-
0
-

Zdravím vespolek,

v jednom svém projektu jsem chtěl použít knihovnu I2C_slave (zde) ale zlobí mi to. Zjistil jsem že funkce I2C_setCallbacks uloží do ukazatele jinou adresu než je adresa požadované funkce a když je potom funkce volána skočí se na nesmyslnou adresu.

  I2C_setCallbacks(I2C_received, I2C_requested);
  9a:   68 e4           ldi     r22, 0x48       ; 72
  9c:   70 e0           ldi     r23, 0x00       ; 0
  9e:   85 e4           ldi     r24, 0x45       ; 69
  a0:   90 e0           ldi     r25, 0x00       ; 0
  a2:   02 d0           rcall   .+4             ; 0xa8 <I2C_setCallbacks>
  a4:   80 e1           ldi     r24, 0x10       ; 16

  // init I2C
  I2C_init(I2C_ADDR);
  a6:   09 c0           rjmp    .+18            ; 0xba <I2C_init>

000000a8 <I2C_setCallbacks>:
static void (*I2C_recv)(uint8_t);
static void (*I2C_req)();

void I2C_setCallbacks(void (*recv)(uint8_t), void (*req)())
{
  I2C_recv = recv;
  a8:   90 93 03 01     sts     0x0103, r25
  ac:   80 93 02 01     sts     0x0102, r24
  I2C_req = req;
  b0:   70 93 01 01     sts     0x0101, r23
  b4:   60 93 00 01     sts     0x0100, r22
  b8:   08 95           ret

Na adrese 0x0045 a 0x0048 ale funkce I2C_received a I2C_requested nejsou.

Zkusil jsem všechno možné, strávil několik dní hledáním na googlu, ale už mne nenapadá co s tím.

Díky

Nahlásit jako SPAM
IP: 185.16.181.–
gna
~ Anonymní uživatel
1017 příspěvků
27. 11. 2019   #2
-
0
-

A kde teda jsou a co je na těhle adresách?

Nahlásit jako SPAM
IP: 213.211.51.–
Smalsoft
~ Anonymní uživatel
4 příspěvky
27. 11. 2019   #3
-
0
-

#2 gna
I2C_received je na adrese 0x008a, I2C_requested na 0x0090. Od 0 do 0x64 je tabulka skoků na rutiny přerušení.

Nahlásit jako SPAM
IP: 185.16.181.–
27. 11. 2019   #4
-
0
-

Mám pocit, že jsi nám podstatnou část kódu zatajil.

Napiš dvě funkce v C tak, aby odpovídaly prototypu, který se má volat a předej ukazatel. Pro získání ukazatele na funkci se podívej do nějakého tutoriálu, jak na to (např. http://jazykc.inf.upol.cz/ukazatele-na-funkce/index.htm ). Pak se podívej, zda po zkompilování volá tvoje funkce.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Smalsoft
~ Anonymní uživatel
4 příspěvky
27. 11. 2019   #5
-
0
-

Jedná se o orig. zdrojáky z https://github.com/…vr-i2c-slave (dával jsem odkaz do úvodního dotazu), nic jsem s tím nedělal a jen zkusil zkompilovat. (samozřejmě jsem to zkoušel i ve svém projektu, ale když to nešlo, tak jsem zkusil přeložit orig. zdrojáky) a výsledek stejný.

Teď jsem ale zjistil, že požadovaná rutina je na adrese * 2 ... 0x45 * 2 = 0x8a a 0x47 * 2 = 0x90. To znamená že gcc zjistí adresu správně, ale použije poloviční hodnotu (možná jsem to teď blbě popsal :-) )

Nahlásit jako SPAM
IP: 185.16.181.–
gna
~ Anonymní uživatel
1017 příspěvků
27. 11. 2019   #6
-
0
-

Flashka se adresuje po wordech, takže to je správná adresa. Hmm, ale proč ti to teda nefuguje? :)

Nahlásit jako SPAM
IP: 213.211.51.–
27. 11. 2019   #7
-
0
-

Založil jsem projekt, zkopíroval soubory, zkompiloval. Funkce se nacházejí na 0xB4 a 0xB7 a oba ukazatelé jsou nastaveny správně.

Nezapomněl jsi v Solution inspectoru přidat do projektu I2CSlave.c?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Smalsoft
~ Anonymní uživatel
4 příspěvky
27. 11. 2019   #8
-
0
-

#7 hlucheucho
Začínám mít pocit že chyba bude přece jenom někde jinde. Že je flash adresovaná po wordech jsem věděl, ale myslel jsem že adresy jsou v bajtech, ale pouze sudé čísla. Prostě že funkce na adrese 0x04 je adresovaná call 0x04 a ono je to call 0x02.

Teď nemůžu kód otestovat, ale vypadá to že ukazatel je správně (poloviční) a chyba tedy bude jinde. Děkuji za nakopnutí. :-)

Nahlásit jako SPAM
IP: 185.16.181.–
27. 11. 2019   #9
-
0
-

Jak napsal gna, adresuje se po wordech. Jinými slovy: organizace paměti programu je něco x 16 bitů. Pro ilustraci pohled do Disassembly

0000009A  LDI R30,0xBC		Load immediate 
0000009B  LDI R31,0x00		Load immediate 
0000009C  STD Z+0,R1		Store indirect with displacement 

Adresa v levém sloupci se změní o 1, ale délku instrukce LDI odhaduji na 2 Byte (= kód instrukce a parametr). 

hu

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

Přidej příspěvek

×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, 2 hosté

Podobná vlákna

Ukazatel na funkci — založil Kenvelo

Ukazatel na funkci — založil Jirka

[DB] - špatná syntaxe — založil schimpanze

 

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