XC32 a pole v RAM vetsi velikosti
Jan Waclawek
konfera na efton.sk
Neděle Březen 15 02:40:23 CET 2020
> Linker souboru nemam
Linker script? Zrejme ld pouzije nejaky defaultny, pravdepodobne na zaklade
specs.
Uz ste skusili ten __attribute__((section(".bss"))) ako som doporucil?
> Me jako programatora nemusi zajimat, jak je pamet alokovana.
No jasne ze nie, ale potom Vam tiez nesmie vadit, ze to nefunguje... :-)
> Microchip vymyslí
> nìjaké divoké mapování, které je fakticky jen klacek pod nohy
> uivatelùm
Ak tomu dobre rozumiem, nema to s MCHP nic spolocneho, to je ciste
MIPSovska zalezitost.
Klasicky problem "ciste" 32-bitovych procesorov (t.j. tych co maju adresnu
aj datovu zbernicu pre instrukcie aj pre data 32 bitov siroku) je, ze do
32-bitovej instrukcie sa neda schovat 32-bitova konstanta; coho
najdramatickejsim nasledkom je, ze dostat do procesora adresu nejakej
premennej je pomerne zdlhavy proces ktory zabera aj pomerne dost pamati -
a to este potom treba citat hodnotu tej premennej (situaciu vyhorsuje
fakt, ze u mcu sa obvykle pouziva nie cisty 32-bitovy procesor, ale
okresana verzia, ktora ma 16-bitovu datovu zbernicu pre instrukcie). Takze
u toho MIPSu je finta, ktorou sa toto urychluje: vyhradeny register, voci
ktoremu sa na pristup k premennym pouziva 16-bitovy ofset - ten sa uz do
32-bitovej instrukcie zmesti. Znamena to, ze v danom programe moze byt
64kByte premennych, ku ktorym sa da pristupovat rychlo. Toto nie je
trivialne rozoznat, ze na ktore premenne sa to ma vztahovat, a nasledne
upravit vsetky pristupy k takejto premennej, teda nie bez zasadnejsieho
zasahu do prekladaca; a tak sa pre jednoduchost (tato "jednoduchost" este
stale nie je trivialna) v tom upravenom gcc tym prepinacom -G zadava
velkost (individualnej) premennej, pod ktoru sa premenna umiestni do
"maleho rychle pristupneho" segmentu - ak je premenna vacsia, tak sa
umiestni do "vseobecneho pomaly pristupovaneho" segmentu.
Toto zafunguje dobre, ak sucet velkosti premennych, ktore su pod velkostou
specifikovanou nejakou defaultnou hodnotou pre to -G, vojde do toho 64kB
segmentu; ak nie, tak vypadne prave uvadzana chyba z linkera (lebo len
linker zhrnie vsetky tie premenne).
Inaksie povedane, ak vas ako programatora tieto veci nezaujimaju, zadajte
jednoducho -G0 (neviem ci treba dat medzeru medzi to -G a parameter alebo
nie). Tym padom vsetky premenne spadnu mimo "rychlo pristupovaneho maleho
segmentu", a uvedena chyba nemoze nastat. No ano, program bude vacsi a
pomalsi, ale to je cena ktoru platite za Vas nezaujem.
wek
----- Original Message ---------------
Subject: Re: XC32 a pole v RAM vetsi velikosti
From: Libor Koneèný <support at mikrovlny.cz>
Date: Sat, 14 Mar 2020 15:22:59 +0100
To: HW-news <hw-list at list.hw.cz>
Linker souboru nemam, musim jej napsat, zatim patram jak.
Pracuji nyni na PIC32MK1024, kde k MK rade je toho velmi malo k
hotovemu pouziti, navic spusta veci neni kompatibilni, ale je reseno
jinymi registry a jako speciality jsou i takove veci, ze se cely
interface napr UART musi zastavit, prenastavit a pak zase spustit.
Byl jsem zvykly na MIKROC, kde proste definuji pole temer az na doraz a
o vse se postara kompilator, od toho snad je.
Me jako programatora nemusi zajimat, jak je pamet alokovana.
Ale stejne me to ceka pri bootloaderu.
LK
Dne 14.3.2020 v 15:16 Miroslav Mraz napsal(a):
> Já jsem do toho jen tak zbìnì nakoukl a usoudil jsem, e to bude
> fungovat podobnì jako na AVR, ARM a jiných. To, e Microchip vymyslí
> nìjaké divoké mapování, které je fakticky jen klacek pod nohy
> uivatelùm bych docela oèekával. Proto se taky PICùm vyhýbám jak èert
> køíi. On staèí jen ten velký indián. Pro síové protokoly je celkem
> dobrý, ale skoro celý okolní svìt ije na malém indiánu a funguje to...
>
> Mrazík
>
> Dne 14. 03. 20 v 10:12 Jan Waclawek napsal(a):
>>> Sice o PIC vím celkem prd
>>
>> +1 (a prd viem aj o MIPSe) a na nasledujuci post som venoval studium v
>> rozsahu asi 10 minut.
>> ...
>> JW
>>
Další informace o konferenci Hw-list