|
|
Elektronika.lt portalo forumas
Jūs esate neprisijungęs lankytojas. Norint dalyvauti diskusijose, būtina užsiregistruoti ir prisijungti prie forumo.
Prisijungę galėsite kurti naujas temas, atsakyti į kitų užduotus klausimus, balsuoti forumo apklausose.
Administracija pasilieka teisę pašalinti pasisakymus bei dalyvius,
kurie nesilaiko forumo taisyklių.
Pastebėjus nusižengimus, prašome pranešti.
Dabar yra 2025 01 14, 16:48. Visos datos yra GMT + 2 valandos.
|
|
|
|
Forumas » Mikrovaldikliai » Lentelės adreso perdavimas funkcijai naudojant AVR-GCC
|
Jūs negalite rašyti naujų pranešimų į šį forumą Jūs negalite atsakinėti į pranešimus šiame forume Jūs negalite redaguoti savo pranešimų šiame forume Jūs negalite ištrinti savo pranešimų šiame forume Jūs negalite dalyvauti apklausose šiame forume
|
|
|
|
|
|
Lentelės adreso perdavimas funkcijai naudojant AVR-GCC |
Parašytas: 2006 06 30, 09:27 |
|
|
|
Na turiu tokį specifinį klausimą AVR GCC žinovams.
Saugau duomenų lentelę flach atmintyje:
Kodas: |
const uint8_t sinewave[] PROGMEM= //256 values
{
0x80,0x83,0x86,0x89,0x8c,0x8f,..... |
Po to talentelę nuskaitau su funkcija:.
Kodas: |
void signalOUT1(const uint8_t *signal)
{
uint8_t i=0;
do{
PORTD=pgm_read_byte(&signal[i++]);
}while(1);
} |
Sukompiliuoju programą ir žiūriu į listingą. Pasirodo lentelės adreso rodyklė funkcijai yraperduodama per registrus r24 ir r25:
Kodas: |
2738 05b6 80E0 ldi r24,lo8(sinewave)
2739 05b8 90E0 ldi r25,hi8(sinewave)
2740 .L150:
2741 05ba 99DD rcall signalOUT |
Tada pačioj funkcijoj singnalOUT r24 ir r25 reikšmės yra persiunčiamos adresų rodyklei Z su komanda movw r30,r24.
Klausimas. Kodėl funkcijai programa neperduoda rodyklės adreso per Z registrų porą, nes savo programoje noriu naudoti inline ASM, kur parametrus pasiima prie kintamojo pririštas Z registras. Pagal Avrlibc bibliotekos tutorialus e(signal) priskyrimas turėtų perduoti signal rodyklę registrų porai r30 ir r31 bet kazkodel taip near. Todel mano sekanti funkcija neveikia kaip as noriu:
Kodas: |
void signalOUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0)
{
asm volatile("eor r28, r28 ;r28<-0" "\n\t"
"eor r29, r29 ;r29<-0" "\n\t"
"1:" "\n\t"
"add r28, %0 ;1 cycle" "\n\t"
"adc r29, %1 ;1 cycle" "\n\t"
"adc %A3, %2 ;1 cycle" "\n\t"
"lpm __tmp_reg__, %a3+ ;3 cycles" "\n\t"
"out %4, __tmp_reg__ ;1 cycle" "\n\t"
"rjmp 1b ;2 cycles. Total 9 cycles" "\n\t"
:
:"r" (ad0),"r" (ad1),"r" (ad2),"e" (signal),"I" (_SFR_IO_ADDR(PORTD))
:"r28", "r29"
);
}
|
Tai vat sakau gal kas susidūrė su kažuo panašaus. Ar čia bugas koks ar ka nors pražiūrėjau
Dekui |
|
|
|
|
|
|
Lentelės adreso perdavimas funkcijai naudojant AVR-GCC |
Parašytas: 2006 06 30, 15:05 |
|
|
|
kaip sakant gal kitiems pravers kada....
Nu ka susitvarkiau. Pasirodo naudojant Static Inline funkcija privercia kompiliatoriu optimizuoti koda, tada rodyklės adresas perduodams tiesiai R30 ir R31 (Z) registru porai.
Kitaip tariant:
Kodas: |
void static inline signalOUT(const uint8_t *signal, uint8_t ad2, uint8_t ad1, uint8_t ad0); |
generuoja ASM:
Kodas: |
2652 0568 E0E0 ldi r30,lo8(sinewave)
2653 056a F0E0 ldi r31,hi8(sinewave) |
toliau jau mano inline ASM kodas jau zino ka daryti |
|
|
|
|
|
|
Google paieška forume |
|
|
Naujos temos forume |
|
|
FS25 Tractors
Farming Simulator 25 Mods,
FS25 Maps,
FS25 Trucks |
|
ETS2 Mods
ETS2 Trucks,
ETS2 Bus,
Euro Truck Simulator 2 Mods
|
|
FS22 Tractors
Farming Simulator 22 Mods,
FS22 Maps,
FS25 Mods |
|
VAT calculator
VAT number check,
What is VAT,
How much is VAT |
|
LEGO
Mänguköök,
mudelautod,
nukuvanker |
|
Thermal monocular
Thermal vision camera,
Night vision ar scope,
Night vision spotting scope |
|
FS25 Mods
FS25 Harvesters,
FS25 Tractors Mods,
FS25 Maps Mods |
|
Dantų protezavimas
All on 4 implantai,
Endodontija mikroskopu,
Dantų implantacija |
|
FS25 Mods
FS25 Maps,
FS25 Cheats,
FS25 Install Mods |
|
GTA 6 Weapons
GTA 6 Characters,
GTA 6 Map,
GTA 6 Vehicles |
|
FS25 Mods
Farming Simulator 25 Mods,
FS25 Maps |
|
ATS Trailers
American Truck Simulator Mods,
ATS Trucks,
ATS Maps |
|
|
|