Discussion:
Raspberry Pi 4
(too old to reply)
Matti Lehtiniemi
2020-03-24 07:09:50 UTC
Permalink
On tuossa pitkään pitänyt ottaa Linux kakkoskoneeksi , mutta asunnossani
ei ole oikein tilaa toiselle koneelle.On päässyt jopa UNIX -taidot
ruostumaan.

Innostuin sitten ostamaan Powerista 50 eurolla Raspberry Pi 4:n viime
syksynä(2 gigan muistilla).Sain nyt pari kuukautta sitten sen toimimaan
, kun loputkin härpäkkeet tuli kiinasta.

Oikein kiva pikku laite.Aluksi en tosin saanut kuvaa näyttöön , piti
väännellä asennustiedostoja Raspbianiin.Vähän ärsyttävää, luulisi että
noista olisi päästy jo eroon.Nimittäin Linux-nörtteilyistä, eihän
tavalliset käyttäjät osaa noita asennustiedostoja coffata.

Olisiko tämä syy, miksi noita 4 gigan aloituspakkauksia saa
verkkokaupasta noin halvalla ? (26% tarjous)

https://www.verkkokauppa.com/fi/product/65499/nftbb/Raspberry-Pi-4-model-B-aloituspakkaus?gclid=CjwKCAjwvOHzBRBoEiwA48i6AtD7l21-5HBKS58wPixXu3Q8X8m6v_2yF1b8_8WAPRsHS2-R6pakeBoCPc8QAvD_BwE

Tarkoitukseni on opetella ARM -assembleria , jotta saisin
niska-perseotteen näistä nykyisistä Android-tableteista ja
kännyköistä.Kääntäsin androidin sorsista ja tutkisin mitä ihmettä siinä
tapahtuu.
Olen ollut suunnattoman tyytyväinen Samsung -Androidtablettiini.Löhöö
vaan sängyssä ja katsoo streameja tai TV-ohjelmia.Tästä oli paljon
hyötyä Fuengirolassa kun ei tv:stä tullut suomi-kanavia.

Kivasti onnistuin pykäämään makefilen melkein vanhasta muistista ja
as-assemblerilla kääntyi ohjelmat.
ARM:sta löytyi mielenkiintoinen ominaisuus, funktiokutsu ilman
paluuosoitteen laittamista pinoon ! (termi Link Register)
Sehän on kätevää, pienentää ja nopeuttaa ohjelmia.Semmoiset
funktio-kutsut, jotka eivät kutsu muita funktioita voidaan tuolla
tavalla laittaa toimiviksi.

Tietääkö kukaan onko Intelin/AMD:n käskykantaan laitettu tuota ?
Ei varmaankaan ?
Kun Intel Architecturissa joudutaan inline:amaan kamaa, niin sehän vie
muistitilaa ja ennen kaikke prossun cachesta, joka hidastaa konetta.
Entäs itse pino ? sehän sijaitsee eri muistialueella kuin ohjelma ja
saatta aiheuttaa prossun cacheen täyttöongelmia.

Jos tuollaiseen Raspberry Pi 4:seen ostaa nopean USB3-kiintolevyn ,niin
onnistuuko Androidin kääntäminen sorsista ? (ilman että hitaus vituttaa)

Pystynkö laittamaan Androidin ja Raspbianin multiboottaamaan ? Jotta
voisin pelata Androidilla nettipokeria ?

(kannattaa huomata että tuollainen mainio pikkutietokone maksaa yhtä
paljon kuin koko Windows 10 -käyttöjärjestelmä)

Matti
Matti Lehtiniemi
2020-03-24 11:59:33 UTC
Permalink
No ei teidän tarvitse tähän vastata.Laiskoja kun olette, ja pystyn aivan
hyvin katsomaan ja googlaamaan videoita.
Post by Matti Lehtiniemi
Jos tuollaiseen Raspberry Pi 4:seen ostaa nopean USB3-kiintolevyn ,niin
onnistuuko Androidin kääntäminen sorsista ? (ilman että hitaus vituttaa)
Aika mainio video tohonkin löytyy:


Siinä pikku Raspberry muistikortissa on siis DOS FAT osio ja linux osio.
FAT osiolla vaan laitetaan sopivaan tiedostoon root=/dev/sda tms.

rsync taisi olla komento mitä toi heebo käytti siirtämään linuxin
ulkoiselle USB3 -SDA:lle.
Aika nopeaa ja kätevää.

10-kertainen nopeutus odotettavissa kiintolevyllä, kuulostaa mahtavalta.
Voisi hyvin kuvitella että Linuxin kerneli ja Androidin kääntäminen
onnistuu jossain järkevässä ajassa.

Jos vaikka laittaisi 128 gigan kiintolevylle 64 gigaa Linuxille ja 64
gigaa Androidille.
Nettipankit ja nettipokerit appseina Androidille ja kaikki muu käyttö
Linuxilla.

5 wattia energiankulutus, melkein ilmaista netin käyttöä.
Voisi vitsin vuoksi kokeilla Microsoft Windowsista luopumista vaikka
viikoksi.

Vanha kunnon DOS:sin FDISK -komento on hyvin minullakin vielä muistissa
ja näköjään Linuxissakin vielä.

Matti
Ari Saastamoinen
2020-03-24 12:25:54 UTC
Permalink
Oikein kiva pikku laite.Aluksi en tosin saanut kuvaa näyttöön ,
piti väännellä asennustiedostoja Raspbianiin.Vähän
ärsyttävää, luulisi että noista olisi päästy jo
eroon.Nimittäin Linux-nörtteilyistä, eihän tavalliset käyttäjät
osaa noita asennustiedostoja coffata.
Toi koko Raspi on nörtteilyhärpäke, jolla ei-nörtit ei edes tee
mitään, niin onpa yllättävää, että sen käyttöönlaittaminen tarttee
nörtteilyä.

Asenna joku Fedora tai Ubuntu ihan tavalliseen desktoppiin, niin ei
välttämättä tartte koskea ainoaankaan konffaustiedostoon.
Kun Intel Architecturissa joudutaan inline:amaan kamaa, niin sehän
vie muistitilaa ja ennen kaikke prossun cachesta, joka hidastaa
konetta.
Ei inline-juttu välttämättä käytä pinoa - riippuu ihan siitä,
millaisen koodinpätkät yrittää inlinettää. Pienimmillään tollainen
inlinetetty juttu lisää lopputulokseen yhden ainoan
assemblerikomennon.
Entäs itse pino ? sehän sijaitsee eri muistialueella kuin ohjelma ja
saatta aiheuttaa prossun cacheen täyttöongelmia.
Kyllä voit halutessasi vaikka ajaa ohjelmia suoraan stakistakin (Ellei
erikseen ole laitettu non-executable stakkia päälle. Vai onko se
nykyään jo oletuksena?)
(kannattaa huomata että tuollainen mainio pikkutietokone maksaa yhtä
paljon kuin koko Windows 10 -käyttöjärjestelmä)
Vähemmän
--
Arzka oh3mqu+***@hyper.fi - En halua follareita mailina
1. Valitse sopiva paikka, ei ihmisten tai rakennusten lahella, jossa
paukku voi aiheuttaa hairiota. - Iso-Kiinalaisen kayttoohje
Matti Lehtiniemi
2020-03-24 14:59:22 UTC
Permalink
Post by Ari Saastamoinen
Toi koko Raspi on nörtteilyhärpäke, jolla ei-nörtit ei edes tee
mitään, niin onpa yllättävää, että sen käyttöönlaittaminen tarttee
nörtteilyä.
Häh, miksi ei ihminen kaipaisi halpaa pientä tietokonetta, joka ei
kuluta juuri lainkaan sähköä ja jonka käyttö on yhtä helppoa kun Windowsin.

En minä tiedä nyky-linuxeista, miksi ne olisivat vaativampia ?
Jos sinä saat tehokkaan 4 gigatavun muistilla varustetun tietokoneen
samalla hinnalla mitä koko Windows-maksaa, miksi et ostaisi sellaista ?
Miksi sitä pitäisi käytää nörtteilyyn, esim ledien tai
kiihtyvyysanturien testaamiseen.Ei kukaan ole käskenyt niin tehdä.

Joskushan UNIXissa oli päänsärkyä vaativia ohjelmia ,kuten vi tai
Emacs.Tässä Raspbianissa on Mousepad, joka on täsmälleen yhtä helppo
kuin Windowsin Notepad.

Siinä on heti aloitusnäytössä nettiselain, voi klikata suoraan.Sitten
voi mennä youtubeen katsomaan videoita.Onko se jotenkin helpompaa
Windowsissa ?
Post by Ari Saastamoinen
Asenna joku Fedora tai Ubuntu ihan tavalliseen desktoppiin, niin ei
välttämättä tartte koskea ainoaankaan konffaustiedostoon.
Ei siis ole tilaa kämpässä toiselle koneelle.
Post by Ari Saastamoinen
Ei inline-juttu välttämättä käytä pinoa - riippuu ihan siitä,
millaisen koodinpätkät yrittää inlinettää. Pienimmillään tollainen
inlinetetty juttu lisää lopputulokseen yhden ainoan
assemblerikomennon.
Siis inlineä joudutaan käyttämään kun ei ole huippunopeaa Link
Registeriä.Kääntäjä optimoi ne inlinetetyt funktiorivit koodiin.
ARM:ssa niitä ei _tarvitse_ laittaa monessa tapauksessa.Vie vähemmän
muistia.
Sitten ARM:ss on muistin säästämiseksi joku THUMB -systeemi, johon en
ole kunnolla vielä perehtynyt.32 -bittisen koodin sijaan käytetään
16-bittistä,mikä säästää sekin muistia ja tekee prossun cachen
toiminnasta optimoidumpaa.
Post by Ari Saastamoinen
Kyllä voit halutessasi vaikka ajaa ohjelmia suoraan stakistakin (Ellei
erikseen ole laitettu non-executable stakkia päälle. Vai onko se
nykyään jo oletuksena?)
Siis pino. Minne työnnetään kamaa PUSH:lla ja otetaan POP:lla.Onhan se
eri paikassa kuin koodi.En nyt tiedä modernien prossujen toiminnasta, en
tiedä onko tällä oleellista merkitystä.

sudo apt-get install moria
sudo apt-get install glhack

Pikku hiljaa tässä palautellaan UNIX -ja Linux -taitoja.
Kyllä mä väitän että näillä asioilla on merkitystä.Ihan
persetuntumaltakin oma Samsung Androidini toimii yllättävänkin nopeasti
nettiselaus-käytössä.


Matti
Mikko Tuumanen
2020-03-24 16:29:18 UTC
Permalink
Post by Matti Lehtiniemi
Häh, miksi ei ihminen kaipaisi halpaa pientä tietokonetta, joka ei
kuluta juuri lainkaan sähköä ja jonka käyttö on yhtä helppoa kun Windowsin.
Yllättävän moni ei nykyään halua edes sitä windowsia, vaan hoitaa
kaikki tietotekniset asiansa kännykällä.

Nörtteilyn lisäksi raspberrypitä käytetään jonkin verran pienissä
yrityksissä, joilla ei ole varaa tehdä/teettää sopivampaa rautaa
itse. Raspin kaltaisia pikkukoneita löytyy markkinoilta runsaasti,
mutta hyvin monen kohdalla on epäilys siitä, saako niitä enää
ensi viikolla vai loppuuko tuotanto, vaihtuuko näytönohjain yllättäen,
tuplaantuuko hinta jne.
Matti Lehtiniemi
2020-03-24 18:07:40 UTC
Permalink
Post by Mikko Tuumanen
Yllättävän moni ei nykyään halua edes sitä windowsia, vaan hoitaa
kaikki tietotekniset asiansa kännykällä.
Näkö voisi olla hyvä syy käyttää Raspbia kännykän sijaan.
Iso ruutu, iso fontti.Se on ainakin minun strategia näkökyvyn säästämiseksi.
Post by Mikko Tuumanen
ensi viikolla vai loppuuko tuotanto, vaihtuuko näytönohjain yllättäen,
tuplaantuuko hinta jne.
Yllättävän kalliita nuo Raspin kaltaiset ovat kiinasta ostettuina.
Käyttääkö aurinkopaneeli-porukka noita tietokoneinaan Kiinassa ?
Pikku-tietokone 5 Wattia ja näyttö ehkä 10 Wattia ?
Ei tarvitse kummallista aurinkopaneelia.

Matti
Ari Saastamoinen
2020-03-25 08:01:13 UTC
Permalink
Post by Matti Lehtiniemi
Näkö voisi olla hyvä syy käyttää Raspbia kännykän sijaan.
Iso ruutu, iso fontti.Se on ainakin minun strategia näkökyvyn säästämiseksi.
Jos kerran toi on kriteeri, niin mikset sä sitten siihen kännykkään
laita isoa näyttöä? On se silti näppärämpi käyttää kännykkää isolla
näytöllä (ja näppiksellä) kuin jotain erillistä härpäkettä. Toi
kännykkä on sitten jotain raspia näppärämpi ottaa mukaan lähtiessä, ja
samat softat pysyvät edelleen käynnissä yms.
--
Arzka oh3mqu+***@hyper.fi - En halua follareita mailina
1. Valitse sopiva paikka, ei ihmisten tai rakennusten lahella, jossa
paukku voi aiheuttaa hairiota. - Iso-Kiinalaisen kayttoohje
Ari Saastamoinen
2020-03-25 07:57:04 UTC
Permalink
Post by Matti Lehtiniemi
Häh, miksi ei ihminen kaipaisi halpaa pientä tietokonetta, joka ei
kuluta juuri lainkaan sähköä ja jonka käyttö on yhtä helppoa kun Windowsin.
Justiinhan sä purnasit nimenomaan siitä, että se ei ollut yhtä
helppokäyttöinen.
Post by Matti Lehtiniemi
Joskushan UNIXissa oli päänsärkyä vaativia ohjelmia ,kuten vi tai
Emacs.Tässä Raspbianissa on Mousepad, joka on täsmälleen yhtä
helppo kuin Windowsin Notepad.
Sekä vi(m) että emacs on molemmat paljon parempia ja monipuolisempia
softia kuin notepad.
Post by Matti Lehtiniemi
Siis inlineä joudutaan käyttämään kun ei ole huippunopeaa Link
Registeriä.Kääntäjä optimoi ne inlinetetyt funktiorivit koodiin.
Niinhän toi kääntäjä tekee. Noi kääntäjät on yllättävän fiksuja (Ja
olen lähes varma, että ainakaan et osaa nykyprosessoreille käsin
optimoida koodista parempaa kuin mitä kääntäjä tuottaa jos se koodi on
yhtään monimutkaisempi) Tosin inlineassembleria kääntäjä EI SAA
optimoida, mutta kyllä ne sinne koodin sekaan menee ilman, että niitä
varten tarttee tehdä funktiokutsu.
Post by Matti Lehtiniemi
Sitten ARM:ss on muistin säästämiseksi joku THUMB -systeemi, johon
en ole kunnolla vielä perehtynyt.32 -bittisen koodin sijaan
käytetään 16-bittistä,mikä säästää sekin muistia ja tekee
prossun cachen toiminnasta optimoidumpaa.
Toi on vähän vastaava kuin x86-lutikoissa on se vanha DOS-moodi (en
muista, mikä sen oikea nimi on) ja sitten toi i386-moodi mitä noi
kaikki modernit käyttikset käyttää.
Post by Matti Lehtiniemi
Siis pino. Minne työnnetään kamaa PUSH:lla ja otetaan POP:lla.Onhan
se eri paikassa kuin koodi.En nyt tiedä modernien prossujen
toiminnasta, en tiedä onko tällä oleellista merkitystä.
Kyllä sama paikka, vaikka ei taideta nykylutikoissa enää käyttää
push/pop:ia, vaan käytetään epäsuoraa movea stackpointterin avulla.
--
Arzka oh3mqu+***@hyper.fi - En halua follareita mailina
1. Valitse sopiva paikka, ei ihmisten tai rakennusten lahella, jossa
paukku voi aiheuttaa hairiota. - Iso-Kiinalaisen kayttoohje
Matti Lehtiniemi
2020-03-25 09:00:53 UTC
Permalink
Post by Ari Saastamoinen
Niinhän toi kääntäjä tekee. Noi kääntäjät on yllättävän fiksuja (Ja
olen lähes varma, että ainakaan et osaa nykyprosessoreille käsin
optimoida koodista parempaa kuin mitä kääntäjä tuottaa jos se koodi on
yhtään monimutkaisempi) Tosin inlineassembleria kääntäjä EI SAA
optimoida, mutta kyllä ne sinne koodin sekaan menee ilman, että niitä
varten tarttee tehdä funktiokutsu.
Mun mielestä se inlineaa ihan c++ -koodiakin.
Eli jos mulla on vaikka vektorien yhteenlaskua

vektori laske_yhteen(vektori a, vektori b)
{
return vektori(a.x+b.x, a.y+b.y, a.z+b.z);
}
niin se automaattisesti inilieaa tuon x86:sessa.
Jos tuon tekee ARM- kääntäjä, niin se ei laita mitään pinoon, vaan
kaikki tapahtuu rekistereissä ja funktiota kutsutaan.
Vektori a:n pointteri laitetaan rekisteriin R1, vektori b:n pointteri
R2:seen , ja paluuosoite LR:ään , eli Link Registeriin.

Tietysti inlinetetty versio on aavistuksen nopeampi, mutta toisaalta jos
noita vektorien yhteenlaskuja on algoritmissa paljon, niin silloin
ilnlinetys vie muistia paljon, mikä kuluttaa prossan välimuistia, eli
cachea.
Silloin inlinetetty x86 systeemi saattaa muuttuakin hitaammaksi
verrattuna ARM-versioon.
Post by Ari Saastamoinen
Toi on vähän vastaava kuin x86-lutikoissa on se vanha DOS-moodi (en
muista, mikä sen oikea nimi on) ja sitten toi i386-moodi mitä noi
kaikki modernit käyttikset käyttää.
Tossa ARM:ssa se pysyy siinä 32-bittisessä moodissa.Siinä on joku flag
joka ilmoittaa että se suorittaa seuraavaksi 16-bittisiä käskyjä.Eli se
systeemi ei ole rakennettu yhteensopivuutta varten, vaan kuluttamaan
vähemmän muistia.
Post by Ari Saastamoinen
Post by Matti Lehtiniemi
Siis pino. Minne työnnetään kamaa PUSH:lla ja otetaan POP:lla.Onhan
se eri paikassa kuin koodi.En nyt tiedä modernien prossujen
toiminnasta, en tiedä onko tällä oleellista merkitystä.
Kyllä sama paikka, vaikka ei taideta nykylutikoissa enää käyttää
push/pop:ia, vaan käytetään epäsuoraa movea stackpointterin avulla.
Niin ne funtioiden sisäiset muuttujat ja ulkoiset parametrit luettaan
Base pointerilla, x86:ssa EBP
Esim [EBP+4]

Base pointteri osoittaa siihen kohtaan pinoa, missä stack pointeri oli
silloin kun funktiota kutsuttiin.

Matti
Ari Saastamoinen
2020-03-25 09:14:11 UTC
Permalink
Post by Matti Lehtiniemi
Tossa ARM:ssa se pysyy siinä 32-bittisessä moodissa.Siinä on joku
flag joka ilmoittaa että se suorittaa seuraavaksi 16-bittisiä
käskyjä.Eli se systeemi ei ole rakennettu yhteensopivuutta varten,
vaan kuluttamaan vähemmän muistia.
Ei toi moodin vaihtaminen kauhean kevyt operaatio inteleissäkään oo.
Mä olen ymmärtänyt, että sen voisi vaihtaa ainoastaan toiseen
suuntaan.
--
Arzka oh3mqu+***@hyper.fi - En halua follareita mailina
1. Valitse sopiva paikka, ei ihmisten tai rakennusten lahella, jossa
paukku voi aiheuttaa hairiota. - Iso-Kiinalaisen kayttoohje
Matti Lehtiniemi
2020-03-25 17:36:25 UTC
Permalink
vektori laske_yhteen(vektori a, vektori b)
{
   return vektori(a.x+b.x, a.y+b.y, a.z+b.z);
}

Testasin mitä gnu-projekti c++ -kääntäjä, eli g++ tuottaa tuolle
assembleria.Käytin O3 -optimointivipua.

Tuotti tämmöisen:

Z12laske_yhteenR7vektoriS0_:
.fnstart
.LFB1534:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, r5, lr}
ldmib r2, {r4, lr}
ldr r3, [r1]
ldr ip, [r1, #4]
ldr r5, [r2]
ldr r1, [r1, #8]
add r2, r3, r5
add ip, ip, r4
add r1, r1, lr
stm r0, {r2, ip}
str r1, [r0, #8]
pop {r4, r5, pc}

On tuossa pushia ja pop:ia .Ei vaikuta kovin optimoidulta.
Ensimmäisellä rivillä oleva link register laitetaan pinoon joka sitten
pop:ataan viimeisellä rivillä suoraan pc:hen ,eli program counteriin.

Milläköhän c++ -kääntäjällä esim Samsungini Android on käännetty ?
Tossahan olisi melkoinen kilpailuetu sille firmalle, joka käyttää
tehokkainta mahdollista kääntäjää.

Jos jotakuta kiinnostaa saman testaus x86 -arkkitehtuurissa, niin laitan
tämä viestin loppuun vektori.cpp ohjelman ja vektori.s assemblerin mitä
ARM:lle generoitiin.
Tämä on oikeastaan pelkkää c:tä, c++ -spesifisiä juttuja en viitsinyt
laittaa selkeyden lisäämiseksi.

Olipa muuten kätevää siirtää tuo raspberry Pi:ltä PC:lle.
5 sekuntia siitä kun huomasin ettei mulla ole raspissa ftp:tä, niin
kirjoitin
sudo apt-get install ftp
Ja viiden sekunnin kulutta siitä mulla oli ftp :)

Matti

Aluksi vektori.cpp

#include <iostream>
using namespace std;

struct vektori
{
int x,y,z;
};

vektori laske_yhteen(vektori &a ,vektori &b)
{
vektori v;
v.x = a.x+b.x;
v.y = a.y+b.y;
v.z = a.z+b.z;
return v;
}

int main()
{
vektori a,b,u;
a = {14, 20 ,30};
b = {20, 30 ,40};
u = laske_yhteen(a,b);
cout << u.x <<" " << u.y << " " << u.z << endl;
return 1;
}

Sitten siitä generoitu assembler-ohjelma:


.arch armv6
.eabi_attribute 28, 1
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 2
.eabi_attribute 30, 2
.eabi_attribute 34, 1
.eabi_attribute 18, 4
.file "vektori.cpp"
.text
.align 2
.global _Z12laske_yhteenR7vektoriS0_
.arch armv6
.syntax unified
.arm
.fpu vfp
.type _Z12laske_yhteenR7vektoriS0_, %function
_Z12laske_yhteenR7vektoriS0_:
.fnstart
.LFB1534:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, r5, lr}
ldmib r2, {r4, lr}
ldr r3, [r1]
ldr ip, [r1, #4]
ldr r5, [r2]
ldr r1, [r1, #8]
add r2, r3, r5
add ip, ip, r4
add r1, r1, lr
stm r0, {r2, ip}
str r1, [r0, #8]
pop {r4, r5, pc}
.cantunwind
.fnend
.size _Z12laske_yhteenR7vektoriS0_, .-_Z12laske_yhteenR7vektoriS0_
.section .text.startup,"ax",%progbits
.align 2
.global main
.syntax unified
.arm
.fpu vfp
.type main, %function
main:
.fnstart
.LFB1535:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, r5, r6, lr}
.save {r4, r5, r6, lr}
mov r1, #34
ldr r0, .L6
bl _ZNSolsEi
ldr r4, .L6+4
mov r2, #1
mov r1, r4
mov r5, r0
bl
_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
mov r0, r5
mov r1, #50
bl _ZNSolsEi
mov r2, #1
mov r1, r4
mov r5, r0
bl
_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
mov r1, #70
mov r0, r5
bl _ZNSolsEi
bl _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
mov r0, #1
pop {r4, r5, r6, pc}
.L7:
.align 2
.L6:
.word _ZSt4cout
.word .LC2
.fnend
.size main, .-main
.align 2
.syntax unified
.arm
.fpu vfp
.type _GLOBAL__sub_I__Z12laske_yhteenR7vektoriS0_, %function
_GLOBAL__sub_I__Z12laske_yhteenR7vektoriS0_:
.fnstart
.LFB2024:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
push {r4, lr}
ldr r4, .L10
mov r0, r4
bl _ZNSt8ios_base4InitC1Ev
mov r0, r4
ldr r2, .L10+4
ldr r1, .L10+8
pop {r4, lr}
b __aeabi_atexit
.L11:
.align 2
.L10:
.word .LANCHOR0
.word __dso_handle
.word _ZNSt8ios_base4InitD1Ev
.cantunwind
.fnend
.size _GLOBAL__sub_I__Z12laske_yhteenR7vektoriS0_,
.-_GLOBAL__sub_I__Z12laske_yhteenR7vektoriS0_
.section .init_array,"aw"
.align 2
.word _GLOBAL__sub_I__Z12laske_yhteenR7vektoriS0_
.bss
.align 2
.set .LANCHOR0,. + 0
.type _ZStL8__ioinit, %object
.size _ZStL8__ioinit, 1
_ZStL8__ioinit:
.space 1
.section .rodata.str1.4,"aMS",%progbits,1
.align 2
.LC2:
.ascii " \000"
.hidden __dso_handle
.ident "GCC: (Raspbian 8.3.0-6+rpi1) 8.3.0"
.section .note.GNU-stack,"",%progbits
Tauno Voipio
2020-03-25 19:18:54 UTC
Permalink
Hei,

Lisääpä GNU-kääntäjän komentoriville -Os, ja yritä uudelleen.
--
-TV
 vektori laske_yhteen(vektori a, vektori b)
 {
     return vektori(a.x+b.x, a.y+b.y, a.z+b.z);
 }
Testasin mitä gnu-projekti c++ -kääntäjä, eli g++ tuottaa tuolle
assembleria.Käytin O3 -optimointivipua.
    .fnstart
    push    {r4, r5, lr}
    ldmib    r2, {r4, lr}
    ldr    r3, [r1]
    ldr    ip, [r1, #4]
    ldr    r5, [r2]
    ldr    r1, [r1, #8]
    add    r2, r3, r5
    add    ip, ip, r4
    add    r1, r1, lr
    stm    r0, {r2, ip}
    str    r1, [r0, #8]
    pop    {r4, r5, pc}
On tuossa pushia ja pop:ia .Ei vaikuta kovin optimoidulta.
Ensimmäisellä rivillä oleva link register laitetaan pinoon joka sitten
pop:ataan viimeisellä rivillä suoraan pc:hen ,eli program counteriin.
Milläköhän c++ -kääntäjällä esim Samsungini Android on käännetty ?
Tossahan olisi melkoinen kilpailuetu sille firmalle, joka käyttää
tehokkainta mahdollista kääntäjää.
Jos jotakuta kiinnostaa saman testaus x86 -arkkitehtuurissa, niin laitan
tämä viestin loppuun vektori.cpp ohjelman ja vektori.s assemblerin mitä
ARM:lle generoitiin.
Tämä on oikeastaan pelkkää c:tä, c++ -spesifisiä juttuja en viitsinyt
laittaa selkeyden lisäämiseksi.
Olipa muuten kätevää siirtää tuo raspberry Pi:ltä PC:lle.
5 sekuntia siitä kun huomasin ettei mulla ole raspissa ftp:tä, niin
kirjoitin
sudo apt-get install ftp
Ja viiden sekunnin kulutta siitä mulla oli ftp :)
Matti
Aluksi vektori.cpp
#include <iostream>
using namespace std;
struct vektori
{
   int x,y,z;
};
vektori laske_yhteen(vektori &a ,vektori &b)
{
   vektori v;
   v.x = a.x+b.x;
   v.y = a.y+b.y;
   v.z = a.z+b.z;
   return v;
}
int main()
{
   vektori a,b,u;
   a = {14, 20 ,30};
   b = {20, 30 ,40};
   u = laske_yhteen(a,b);
   cout << u.x <<" " << u.y << " " << u.z << endl;
   return 1;
}
    .arch armv6
    .eabi_attribute 28, 1
    .eabi_attribute 20, 1
    .eabi_attribute 21, 1
    .eabi_attribute 23, 3
    .eabi_attribute 24, 1
    .eabi_attribute 25, 1
    .eabi_attribute 26, 2
    .eabi_attribute 30, 2
    .eabi_attribute 34, 1
    .eabi_attribute 18, 4
    .file    "vektori.cpp"
    .text
    .align    2
    .global    _Z12laske_yhteenR7vektoriS0_
    .arch armv6
    .syntax unified
    .arm
    .fpu vfp
    .type    _Z12laske_yhteenR7vektoriS0_, %function
    .fnstart
    push    {r4, r5, lr}
    ldmib    r2, {r4, lr}
    ldr    r3, [r1]
    ldr    ip, [r1, #4]
    ldr    r5, [r2]
    ldr    r1, [r1, #8]
    add    r2, r3, r5
    add    ip, ip, r4
    add    r1, r1, lr
    stm    r0, {r2, ip}
    str    r1, [r0, #8]
    pop    {r4, r5, pc}
    .cantunwind
    .fnend
    .size    _Z12laske_yhteenR7vektoriS0_, .-_Z12laske_yhteenR7vektoriS0_
    .section    .text.startup,"ax",%progbits
    .align    2
    .global    main
    .syntax unified
    .arm
    .fpu vfp
    .type    main, %function
    .fnstart
    push    {r4, r5, r6, lr}
    .save {r4, r5, r6, lr}
    mov    r1, #34
    ldr    r0, .L6
    bl    _ZNSolsEi
    ldr    r4, .L6+4
    mov    r2, #1
    mov    r1, r4
    mov    r5, r0
    bl
_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
    mov    r0, r5
    mov    r1, #50
    bl    _ZNSolsEi
    mov    r2, #1
    mov    r1, r4
    mov    r5, r0
    bl
_ZSt16__ostream_insertIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_PKS3_i
    mov    r1, #70
    mov    r0, r5
    bl    _ZNSolsEi
    bl    _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
    mov    r0, #1
    pop    {r4, r5, r6, pc}
    .align    2
    .word    _ZSt4cout
    .word    .LC2
    .fnend
    .size    main, .-main
    .align    2
    .syntax unified
    .arm
    .fpu vfp
    .type    _GLOBAL__sub_I__Z12laske_yhteenR7vektoriS0_, %function
    .fnstart
    push    {r4, lr}
    ldr    r4, .L10
    mov    r0, r4
    bl    _ZNSt8ios_base4InitC1Ev
    mov    r0, r4
    ldr    r2, .L10+4
    ldr    r1, .L10+8
    pop    {r4, lr}
    b    __aeabi_atexit
    .align    2
    .word    .LANCHOR0
    .word    __dso_handle
    .word    _ZNSt8ios_base4InitD1Ev
    .cantunwind
    .fnend
    .size    _GLOBAL__sub_I__Z12laske_yhteenR7vektoriS0_,
.-_GLOBAL__sub_I__Z12laske_yhteenR7vektoriS0_
    .section    .init_array,"aw"
    .align    2
    .word    _GLOBAL__sub_I__Z12laske_yhteenR7vektoriS0_
    .bss
    .align    2
    .set    .LANCHOR0,. + 0
    .type    _ZStL8__ioinit, %object
    .size    _ZStL8__ioinit, 1
    .space    1
    .section    .rodata.str1.4,"aMS",%progbits,1
    .align    2
    .ascii    " \000"
    .hidden    __dso_handle
    .ident    "GCC: (Raspbian 8.3.0-6+rpi1) 8.3.0"
    .section    .note.GNU-stack,"",%progbits
Matti Lehtiniemi
2020-03-25 20:46:44 UTC
Permalink
Post by Tauno Voipio
Hei,
Lisääpä GNU-kääntäjän komentoriville -Os, ja yritä uudelleen.
Joo, tosiaan hävis push ja pop.Pitääkin olla tarkkana noiden
optimointien kassa.
Ajattelin että kun -O3 on iso luku että se on tehokkain optimointi
-Os tuottaa nopeampaa kamaa.

Toi on sellaista assembleria mitä minä haluaisin nähdä.Kaikki tapahtuu
rekistereissä.Eikös kun kaikki tapahtuu rekistereissä ,silloin voi
käyttää THUMBia tehokkaasti ?

No joo, olen tässä ARM:n tutkimisessa vasta hyvin alussa.En suoraan
sanottuna osaa tota assembleria edes kunnolla lukea vielä.
Varmaan kannattaisi hankkia se ulkoinenen nopea SSD ja kääntää kerneli
ja Android ennen kun lähtee ihmettelemään tarkemmin Assya.

Tuosta kuitenkin näkee ,että nuo lukuisat monikäyttöiset rekisterit ovat
hyvä valinta.Siinä on rakenteellinen etu x86:seen nähden, ja
mahdollistaa esim. nopean nettisurffaamisen 1.6 Ghz hyvin halvalla
ARM-prossulla.

_Z12laske_yhteenR7vektoriS0_:
.fnstart
.LFB1513:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
ldr ip, [r1]
str lr, [sp, #-4]!
ldr lr, [r2]
add ip, ip, lr
str ip, [r0]
ldr lr, [r2, #4]
ldr ip, [r1, #4]
ldr r2, [r2, #8]
ldr r1, [r1, #8]
add ip, ip, lr
add r1, r1, r2
str ip, [r0, #4]
str r1, [r0, #8]
ldr pc, [sp], #4
Tauno Voipio
2020-03-26 08:11:01 UTC
Permalink
Jos haluat nähdä Thumb-koodia, lisää komentoon
-mthumb, mutta tulos ei varmaan suostu toimimaan
Pi:ssä eikä linkity raspbianin kirjastoihin.

Vielä parempaa koodia saa, kun lisää prosessoriksi
jonkun Cortex-version ha Thumb -koodin.
--
-TV
Post by Matti Lehtiniemi
Post by Tauno Voipio
Hei,
Lisääpä GNU-kääntäjän komentoriville -Os, ja yritä uudelleen.
Joo, tosiaan hävis push ja pop.Pitääkin olla tarkkana noiden
optimointien kassa.
Ajattelin että kun -O3 on iso luku että se on tehokkain optimointi
-Os tuottaa nopeampaa kamaa.
Toi on sellaista assembleria mitä minä haluaisin nähdä.Kaikki tapahtuu
rekistereissä.Eikös kun kaikki tapahtuu rekistereissä ,silloin voi
käyttää THUMBia tehokkaasti ?
No joo, olen tässä ARM:n tutkimisessa vasta hyvin alussa.En suoraan
sanottuna osaa tota assembleria edes kunnolla lukea vielä.
Varmaan kannattaisi hankkia se ulkoinenen nopea SSD ja kääntää kerneli
ja Android ennen kun lähtee ihmettelemään tarkemmin Assya.
Tuosta kuitenkin näkee ,että nuo lukuisat monikäyttöiset rekisterit ovat
hyvä valinta.Siinä on rakenteellinen etu x86:seen nähden, ja
mahdollistaa esim. nopean nettisurffaamisen 1.6 Ghz hyvin halvalla
ARM-prossulla.
    .fnstart
    ldr    ip, [r1]
    str    lr, [sp, #-4]!
    ldr    lr, [r2]
    add    ip, ip, lr
    str    ip, [r0]
    ldr    lr, [r2, #4]
    ldr    ip, [r1, #4]
    ldr    r2, [r2, #8]
    ldr    r1, [r1, #8]
    add    ip, ip, lr
    add    r1, r1, r2
    str    ip, [r0, #4]
    str    r1, [r0, #8]
    ldr    pc, [sp], #4
Matti Lehtiniemi
2020-03-26 08:13:47 UTC
Permalink
Otetaan tuosta assemblerista rivit 2 ja viimeinen rivi
str lr, [sp, #-4]!
ldr pc, [sp], #4

Miksi ei ole laitettu :
push lr
pop pc

Onko noilla kahdella tavalla joku ero ?

ensimmäinen [sp, #-4]! on siis pre-indexed addressing.
toinen [sp], #4 on post indexed addressing.

https://azeria-labs.com/memory-instructions-load-and-store-part-4/

Pino siis kasvaa ARM:ssa alaspäin, niin kuin Commodore 64:ssa ?

Eli

    ldr    ip, [r1]
    str    lr, [sp, #-4]!
    ldr    lr, [r2]
    add    ip, ip, lr
    str    ip, [r0]
    ldr    lr, [r2, #4]
    ldr    ip, [r1, #4]
    ldr    r2, [r2, #8]
    ldr    r1, [r1, #8]
    add    ip, ip, lr
    add    r1, r1, r2
    str    ip, [r0, #4]
    str    r1, [r0, #8]
    ldr    pc, [sp], #4
Tauno Voipio
2020-03-26 12:17:50 UTC
Permalink
Post by Matti Lehtiniemi
Otetaan tuosta assemblerista rivit 2 ja viimeinen rivi
      str    lr, [sp, #-4]!
      ldr    pc, [sp], #4
push lr
pop pc
Onko noilla kahdella tavalla joku ero ?
ensimmäinen [sp, #-4]! on siis pre-indexed addressing.
toinen [sp], #4 on post indexed addressing.
https://azeria-labs.com/memory-instructions-load-and-store-part-4/
Pino siis kasvaa ARM:ssa alaspäin, niin kuin Commodore 64:ssa ?
Eli
      ldr    ip, [r1]
      str    lr, [sp, #-4]!
      ldr    lr, [r2]
      add    ip, ip, lr
      str    ip, [r0]
      ldr    lr, [r2, #4]
      ldr    ip, [r1, #4]
      ldr    r2, [r2, #8]
      ldr    r1, [r1, #8]
      add    ip, ip, lr
      add    r1, r1, r2
      str    ip, [r0, #4]
      str    r1, [r0, #8]
      ldr    pc, [sp], #4
Lisääpä sille GCC:lle -Wa,-ahlms=minun.lst ja tee koko käännös,
niin näet binäärikooditkin.

Ei-Thumb -koodissa assembleri kääntää push- ja pop -käskyt
samoiksi kuin näit, jos kohteena on vain yksi rekisteri.
Monen rekisterin kohdalla on ldmia ja stmia sp-rekisterin avulla.

Yhden rekisterin kohdalls ldr ja str ovat nopeampia.
--
-TV
Matti Lehtiniemi
2020-03-31 15:54:32 UTC
Permalink
Post by Matti Lehtiniemi
vektori laske_yhteen(vektori a, vektori b)
{
   return vektori(a.x+b.x, a.y+b.y, a.z+b.z);
}
Koodasin yhtä toista tärkeämpää projektia Visual C++:lla, ajattelin
testata huvin vuoksi että mitä Microsoftin Visual c++ kääntäjä vuodelta
2008 tuottaa tästä.
Tuotti hillittömän pitkän assy-listauksen, mutta onnistuin löytämään
tuon koodinpätkän kaiken tauhkan seasta.(löytyi riviltä 1040)

Kyllä tuo on mun mielestä selvästi hitaampaa kamaa kuin mitä gcc ARM:lle
tuotti.
Käytin tuossa O2 vipua (optimize for speed)
Hieman yllätti ettei tuossa käytetä EBP,base pointeria, mutta suoraan
SP:stä tietysti nopeampi.
Olisiko tuorein Visual C++ parempi optimoija ?
Näytti tuottavan defaulttina 32-bittistä koodia 64:n sijaan.

_TEXT SEGMENT
$T19708 = 8 ; size = 4
_a$ = 12 ; size = 4
_b$ = 16
?laske_yhteen@@YA?AUvektori@@***@0@Z PROC ; laske_yhteen, COMDAT
; File d:\ohjelmointi\omat\raspi\vektori.cpp
; Line 12
mov ecx, DWORD PTR _a$[esp-4]
mov edx, DWORD PTR _b$[esp-4]
mov eax, DWORD PTR $T19708[esp-4]
push esi
mov esi, DWORD PTR [ecx]
add esi, DWORD PTR [edx]
mov DWORD PTR [eax], esi
; Line 13
mov esi, DWORD PTR [ecx+4]
add esi, DWORD PTR [edx+4]
; Line 14
mov ecx, DWORD PTR [ecx+8]
add ecx, DWORD PTR [edx+8]
mov DWORD PTR [eax+4], esi
mov DWORD PTR [eax+8], ecx
pop esi
; Line 16
ret 0

Ketuttaa, toinen näyttö hyytyi.Projektini siirtää Raspbian ulkoiselle
nopealle kovalevylle hidastui(40 euroa) , kun pitää ensin ostaa uusi
näyttö ja etsiä jostain sille rahat.
Näyttö toimi 12 vuotta ja kerrran vaihdoin siihen konkat.

En kyllä suoraan sanottuna tiedä kuinka paljon tuo on Raspia
hitaampi,kun en tiedä miten nopeita/hitaita nuo muistihaut on .
Ehkäpä asia on pikemminkin niin ,että ARM pääsee samaan nopeuteen
halvemmalla prossun rakenteella.

Selittäisi myös miksi Intelin Atom on hävinnyt kilpailussa ARM:lle.

Matti

Mikko Tuumanen
2020-03-24 16:18:48 UTC
Permalink
Post by Matti Lehtiniemi
Oikein kiva pikku laite.Aluksi en tosin saanut kuvaa näyttöön , piti
väännellä asennustiedostoja Raspbianiin.Vähän ärsyttävää, luulisi että
Raspberrypin näyttöliitännän kansssa on tosiaan omituisuuksia, joita
ei ole pc:lle linuxia asennettaessa.

HDMI-johdon päässä olevan näytön tunnistus tehdään bootissa ja sen
jälkeen ei ole mitään ei ole helppoa tapaa selvittää onko johto
irronnut tai mahdollisesti toinen näyttö vaihdettu tilalle.

Löytyy näyttöjä, joiden kanssa raspberry ottaa käyttöön väärän
näyttötilan ja joutuu säätämään asetuksia.
Loading...