<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=23553&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-01-20T23:23:16+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23553&amp;mode</id>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2021-01-20T23:23:16+01:00</updated>
<published>2021-01-20T23:23:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23553&amp;p=230691#p230691</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23553&amp;p=230691#p230691"/>
<title type="html"><![CDATA[zewnętrzne pamięci - zapis / odczyt]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23553&amp;p=230691#p230691"><![CDATA[
Witam<br /><br />Pytanie dotyczy sposobu korzystania z zewnętrznych pamięci flash, eeprom, fram, sram, podłączonych przy użyciu I2C czy SPI.<br />Łatwo możemy sobie napisać obsługę w sensie sprzętowym. Możemy zapisać i odczytać bajt czy słowo a nawet łańcuch.<br />Moje pytanie jest związane z tym jak takie pamięci obsługiwać w sposób wygodny.<br />Przykładowo do obsługi wewnętrznej pamięci eeprom mamy wygodne funkcje wbudowane AVR GCC. Możemy za ich pomocą zapisać sobie np. struktury, co ładnie Mirek tłumaczy w swoim poradniku.<br />Jednak przy użyciu pamięci zewnętrznej np. eeprom czy fram podłaczonej przez i2c zastanawia mnie jak osiągnąć podobną funkcjonalność. <br />Przykładowo mamy strukturę w której mamy różne pola uint_x, int_x, czy nawet łańcuchy znakowe, albo inne struktury. Nasza struktura zajmuje jakąś ilość bajtów.<br />W programie możemy te ilość łatwo określić stosując operator sizeof(). Jednak gdy napiszemy sobie funkcję np:<br />[syntax=c]uint16_t fram_wr(uint8_t fram_address, uint16_t mem_address, void * buffer);<br />// fram_address adres urządzenia I2C<br />// mem_address adres w pamięci fram/eeprom<br />// buffer to co chcemy zapisać[/syntax]<br /><br />W celu uzyskania uniwersalności przekazujemy wskaźnik na zmienną typu void.<br />Pamięć jest zorientowana bajtowo, funkcja musi wiedzieć ile bajtów będzie zapisywanych. <br />Oczywiście, że możemy przekazać te wartość jako dodatkowy argument typu uint_x.<br />Ale to skraca nam o głowę uniwersalność funkcji i wygodę użycia. W końcu typy danych mogą być różne, o różnych długościach.<br />Otóż w ciele funkcji nie możemy użyć zapisu:<br />[syntax=c]len = sizeof(*buffer)[/syntax]<br />Ponieważ kompilator w chwili kompilacji tej funkcji nie wie jaki argument zostanie przekazany, a może być to argument dowolny (użyliśmy void *)<br /><br />Drugim problemem jest to czy mamy pewność, że w przypadku struktury rezydującej w pamięci ram, jej poszczególne pola rozłożone są w takiej kolejności<br />jak jest to opisane w deklaracji...<br />Moim zdaniem nie jest to oczywiste. Analogiczny problem będziemy mieli przy odczycie.<br /><br />Jak podejść do tego tematu? <br />Żeby było funkcjonalnie, wygodnie, jednoznacznie i uniwersalnie. <br /><br />pozdrawiam serdecznie<br />Michał<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 20 sty 2021, o 23:23</p><hr />
]]></content>
</entry>
</feed>