Goto page Previous 1, 2, 3, 4 Next
Marek
Guest
Sat Feb 06, 2016 8:19 pm
On Sat, 6 Feb 2016 11:18:29 +0100, Sebastian
Biały<heby@poczta.onet.pl> wrote:
Quote:
A co zrobisz z pgm_read_float, pgm_read_byte i okolicą?
Po co to, nie można tam wskaźnikiem lub tablicą?
--
Marek
Sebastian BiaĹy
Guest
Sat Feb 06, 2016 8:48 pm
On 2016-02-06 20:19, Marek wrote:
Quote:
A co zrobisz z pgm_read_float, pgm_read_byte i okolicą?
Po co to, nie można tam wskaźnikiem lub tablicą?
Obsluga pamięci ROM i RAM wymaga dwóch różnych instrukcji maszynowych.
Dlatego istnieją makra i funkcje, ktore wymuszają traktowanie pointera
do ROM a nie RAM. W harvardach ktore mają jeden typ wskaźnika (wiele
ARMów) to zadanie wykonywane jest przez hardware dekodera adresów. W AVR
nie ma takiego dekodera i kod sam decyduje czy wskaźnik jest do ROM czy
RAM. To powoduje że sprawy nie da się łatwo załatwić makrem przy
deklaracji pointera. Trzeba również w miejscu użycia wskazać do czego
ten pointer jest.
Marek
Guest
Sun Feb 07, 2016 2:20 am
On Sat, 6 Feb 2016 20:48:17 +0100, Sebastian
Biały<heby@poczta.onet.pl> wrote:
Quote:
Obsluga pamięci ROM i RAM wymaga dwóch różnych instrukcji
maszynowych.
Ale to ja wiem, odpowiedz nie na temat.
Pytam po co te pgm_costam?
Jak user chce tabklice we flash to ustawia, jej specjalny atrybut
przy definicji/deklaracji i to wszystko. A dalejj czyta ją przez
tab[ndex] lub przez wskaźnik.
Wewnetrznie kompilator wie z jakim rodzajem pamięci ma do czynienia
i stosuje odpowiednie instrukcje.
A jak chce się skompilować czymś co nie odróżnia atrybutów flash/ram
robi się #define atrybut , który go "znika".
Tak jest w picach. W ten sposób można swobodnie kompilować kod na
architekturę, która nie odróżnia fkash/ram (np. z pic18 na pic32}.
--
Marek
slawek
Guest
Sun Feb 07, 2016 8:28 am
On Sat, 6 Feb 2016 00:08:06 +0100, Grzegorz Kurczyk
<grzegorz.skasuj@control.usun.slupsk.pl> wrote:
Quote:
AVR ma oddzielną pamięć programu i danych co powoduje, że np do
Intel x86 też ma oddzielnie segmenty kodu i danych. I co? I jakoś z
tym żyjemy.
Quote:
odczytania bajtu z pamięci programu (która ma szynę 16-bitową)
służy
inny rozkaz procesora niż do czytania bajtu z pamięci danych z szyną
Intel x86 też ma oddzielne instrukcje mov i in.
Sebastian BiaĹy
Guest
Sun Feb 07, 2016 10:20 am
On 2016-02-07 08:28, slawek wrote:
Quote:
AVR ma oddzielną pamięć programu i danych co powoduje, że np do
Intel x86 też ma oddzielnie segmenty kodu i danych. I co? I jakoś z tym
żyjemy.
Nie. Mówisz o tym że x86 ma idiotyczny sposób uzywania wskaźników. Ale
mimo tego idiotyzmu wskaźnik 0x1234:5678 jednoznacznie wskazuje na
konkretna dana w konkretnej pamięci.
W przypadku AVR posiadanie wskaźnika 0x1234 uniemozliwia zgadnięcie czy
to jest wskaźnik do ROM (adresowane od 0) czy do RAM (adresowane od 0).
Dopiero fizyczna instrukcja ładowania danej określa jak go traktować.
Quote:
odczytania bajtu z pamięci programu (która ma szynę 16-bitową)
służy
inny rozkaz procesora niż do czytania bajtu z pamięci danych z szyną
Intel x86 też ma oddzielne instrukcje mov i in.
Ale dotyczą one mało użytecznego mechanizmu I/O odziedziczonego jeszcze
po 8080 gdzie niezwykle rzadko mówi się o "wskaźniku na rejestr IO".
Raczej o ideksie. Pomińmy milczeniem wygłupy firmy Intel z okolic 8080
które miały zaoszczędzić na mmu po stronie implementacji. To głupie
było. Inne procki z tamtych lat (np 6502) nie miały oddzielnej "pamięci
IO" i świat się kręcił.
PS. Podpieranie się że x86 to von Neumann to troche zabawne jest, bo to
procesor który nie da się chyba sklasyfikować z powodu swoich
idiotyzmów. Weź 680x0 jako bardziej wzorcowy
Sebastian BiaĹy
Guest
Sun Feb 07, 2016 10:43 am
On 2016-02-07 02:20, Marek wrote:
Quote:
Ale to ja wiem, odpowiedz nie na temat.
Pytam po co te pgm_costam?
Ponieważ o ile pamietam dla gcc pointer jest tylko "wartością" i nie
zawiera innych znaczeń. To ogranieczenie pochodzi z faktu że developing
gcc odbywał się na w miarę normalnych architekturach gdzie nie był to
kłopot i tak zostało.
Problem tak naprawde nie jest w gcc tylko w C/C++ (np wskaźnik na
funkcje nie jest kompatybilny z void* [1] co jest zrobione m.in. z
powodu jakiś dziwacznych architektur).
Quote:
Wewnetrznie kompilator wie
Nie wie. Byly próby aby się dowiedział w postaci propozycji zmiany.
Zdaje się że nie udało się wpuscić tego do mainstream, spodziewam się że
takie ficzery trafią wcześniej do clang. Nie mogę teraz znaleźć pdfa
który tą zmianę prezentował, jak znajdę to go tu wrzucę.
[1]
http://stackoverflow.com/questions/12358843/why-are-function-pointers-and-data-pointers-incompatible-in-c-c
J.F.
Guest
Sun Feb 07, 2016 11:28 am
Dnia Sat, 6 Feb 2016 00:08:06 +0100, Grzegorz Kurczyk napisał(a):
Quote:
W dniu 05.02.2016 o 21:22, Atlantis pisze:
W dniu 2016-02-05 o 18:47, Sebastian Biały pisze:
Przy czym zaznaczam że czasami harvardowatość jest ukryta przed kodem
usera. Mówimy o procesorach gdzie jest to widoczne, jak na przykład AVR.
Tam jezyk C z definicji bedzie musiał być wspierany w mało przenośny
sposób aby wydajnie programować.
Hmm... O jakich aspektach kodu pod AVR tutaj mówimy?
AVR ma oddzielną pamięć programu i danych co powoduje, że np do
odczytania bajtu z pamięci programu (która ma szynę 16-bitową) służy
inny rozkaz procesora niż do czytania bajtu z pamięci danych z szyną
8-bitową. Czyli jeśli z poziomu języka wyższego poziomu chcesz np.
wyświetlić jakiś napis, to masz dwie różne definicje łańcucha
określające w jakiej pamięci ma być umieszczony i dwie różne procedury
do wyświetlania tego łańcucha w zależności gdzie był umieszczony.
Przy czym zauwaz, ze to jest luzno zwiazane z "harvardowoscia".
Osobna pamiec programu ... program w C w zasadzie programu nie rusza,
a tam gdzie rusza (adres funkcji), tam kontekst jest z gory ustalony.
Problemem sa dane przechowywane w pamieci programu.
Cos w zasadzie sprzeczne z harwardowoscia :-)
C sie z tym boryka od dawna - byl chocby segment danych
niezainicjowanych i zainicjowanych czy nawet stalych.
Oczywiscie w uC przez dlugi czas bylo malo pamieci, co zachecalo do
uzycia ROM, z drugiej strony ROM jest wolny, a RAM szybki, co zacheca
do przepisania programu do RAM. Nawet jesli to specjalny RAM,
wydzielony tylko na program :-)
Quote:
Przy architekturze von Neumanna nie ma rozdzielenia pamięci danych od
pamięci programu. O tym czy procesor widzi pamięć w danej chwili kostkę
RAM, EPROM czy rejestr jakiegoś I/O decyduje dekoder adresów. Procek
może wykonywać rozkazy umieszczone w dowolnym obszarze przestrzeni
adresowej.
Harvard Harvardem, ale w co bardziej uniwersalnych systemach jest
potrzeba aby program tworzyl program do wykonania w RAM, czy nawet
zaczytywal go z dysku. I dostep do pamieci programu musi byc, nawet
jesli to pamiec specjalna.
J.
J.F.
Guest
Sun Feb 07, 2016 11:30 am
Dnia Sat, 6 Feb 2016 11:18:29 +0100, Sebastian Biały napisał(a):
Quote:
On 2016-02-06 10:48, Marek wrote:
Dlaczego? Wystarczy zrobić
#define PROGMEM
A co zrobisz z pgm_read_float, pgm_read_byte i okolicą?
#define na najprostsza konstrukcje "zwyklego C" ?
J.
J.F.
Guest
Sun Feb 07, 2016 11:39 am
Dnia Sun, 07 Feb 2016 02:20:45 +0100, Marek napisał(a):
Quote:
On Sat, 6 Feb 2016 20:48:17 +0100, Sebastian
Biały<heby@poczta.onet.pl> wrote:
Obsluga pamięci ROM i RAM wymaga dwóch różnych instrukcji
maszynowych.
Ale to ja wiem, odpowiedz nie na temat.
Pytam po co te pgm_costam?
No przeciez wiesz - zeby program w C wiedzial, gdzie czytac
Quote:
Jak user chce tabklice we flash to ustawia, jej specjalny atrybut
przy definicji/deklaracji i to wszystko. A dalejj czyta ją przez
tab[ndex] lub przez wskaźnik.
No w zasadzie tak. Moze to poklosie wczesniejszych czasow, gdy
kompilator byl glupszy ?
A moze jednak ma zalety, takie bezposrednie podkreslenie, ze tu jest
cos inaczej, a nie - zdefiniowane trzy strony wczesniej.
J.
Sebastian BiaĹy
Guest
Sun Feb 07, 2016 12:22 pm
On 2016-02-07 11:30, J.F. wrote:
Quote:
Dlaczego? Wystarczy zrobić
#define PROGMEM
A co zrobisz z pgm_read_float, pgm_read_byte i okolicą?
#define na najprostsza konstrukcje "zwyklego C" ?
Pytanie co zrobisz gdy portujesz harvard->harvard i obie implementacje
radośnie wymysliły własny lepszy sposób na grzebanie w rom.
janusz_k
Guest
Sun Feb 07, 2016 12:57 pm
W dniu 2016-02-07 o 02:20, Marek pisze:
Quote:
On Sat, 6 Feb 2016 20:48:17 +0100, Sebastian Biały<heby@poczta.onet.pl
wrote:
Obsluga pamięci ROM i RAM wymaga dwóch różnych instrukcji
maszynowych.
Ale to ja wiem, odpowiedz nie na temat.
Pytam po co te pgm_costam?
Jak user chce tabklice we flash to ustawia, jej specjalny atrybut przy
definicji/deklaracji i to wszystko. A dalejj czyta ją przez tab[ndex]
lub przez wskaźnik.
No ale Ci tłumaczą wszyscy że w avr-ach nie czyta, musi czytać przez
pgr_read_xxx(tab[index]), to jest konsekwencja innego dostępu do pam
programu która pokrywa się adresami z pamięcią ram.
Quote:
Wewnetrznie kompilator wie z jakim rodzajem pamięci ma do czynienia i
stosuje odpowiednie instrukcje.
Nie, nie wie, to ty mu okreslasz skąd ma czytać.
--
Pozdr
Janusz_K
janusz_k
Guest
Sun Feb 07, 2016 1:03 pm
W dniu 2016-02-07 o 08:28, slawek pisze:
Quote:
On Sat, 6 Feb 2016 00:08:06 +0100, Grzegorz Kurczyk
grzegorz.skasuj@control.usun.slupsk.pl> wrote:
AVR ma oddzielną pamięć programu i danych co powoduje, że np do
Intel x86 też ma oddzielnie segmenty kodu i danych. I co? I jakoś z tym
żyjemy.
To kompilator ma a nie procek, x86 od zawsze miały wspólną przestrzeń
danych i programu. Te segmenty są na siłę robione i to dopiero ostatnimi
czasy jak się pojawiły wirusy korzystające z przepełnienia
stosu.
Quote:
Intel x86 też ma oddzielne instrukcje mov i in.
Łaskawco rozrózniaj instrukcje dostępu do pamięci "mov" od instrukcji
we/wy "in", bo jak na razie to mieszasz pojęcia.
--
Pozdr
Janusz_K
Marek
Guest
Sun Feb 07, 2016 1:05 pm
On Sun, 7 Feb 2016 12:57:03 +0100, janusz_k <Janusz_kk@o2.pl> wrote:
Quote:
Nie, nie wie, to ty mu okreslasz skąd ma czytać.
Pisałem ogólnie o kompilatorach, np. sdcc umie, stąd nie widziałem,
że gcc-avr ma z tym problem, ale już Sebastian wyłuszczył dlaczego.
--
Marek
Zbych
Guest
Sun Feb 07, 2016 8:06 pm
W dniu 2016-02-07 o 10:43, Sebastian Biały pisze:
Quote:
On 2016-02-07 02:20, Marek wrote:
Ale to ja wiem, odpowiedz nie na temat.
Pytam po co te pgm_costam?
Ponieważ o ile pamietam dla gcc pointer jest tylko "wartością" i nie
zawiera innych znaczeń. To ogranieczenie pochodzi z faktu że developing
gcc odbywał się na w miarę normalnych architekturach gdzie nie był to
kłopot i tak zostało.
GCC jakiś czas temu nauczyło się rozróżniać przestrzenie adresowe:
https://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html
Sebastian BiaĹy
Guest
Sun Feb 07, 2016 8:39 pm
On 2016-02-07 20:06, Zbych wrote:
Quote:
To nie wystarczy. Np. w przypadku AVR każda funkcja przyjmująca wskaźnik
musiala by się generować osobno dla każdej kombinacji typów
wskaźnikowych jakie w programie wystąpią. Dlatego nalezy użyć __flash
przy wskaźnikowym argumencie funkcji, czyli znowu wychodzi na to że bez
rękodzieła ani rusz.
Goto page Previous 1, 2, 3, 4 Next