[elektro] Nuvoton Cortex-M0 - endian
Info
info at kiralyelektronika.hu
Sun Nov 20 19:23:07 CET 2011
> Van rá gyári makro. Ha ezt használod írhatsz gépfüggetlen kódot.
> <http://www.gnu.org/s/hello/manual/libc/Byte-Order.html>
Máshol meg azt írják, hogy óvatosan, nem minden compiler eszi.
> Azért belenéztem a proci utasításkészletébe, hát nem tartana semmiből a
> fordítónak beszúrni egy REV, vagy REV16 -ot a kódba, ha odabiggyesztem a
Ha a __REV16-odat úgy definiálod, hogy mindíg inline legyen akkor
lehet így is fog kinézni a kódban. Persze forrásban télleg ronda :)
Nekem azért nem ugrott be ez a problémád, mert bár túl kellett lépnem
anno ezen nekem is, de már az elején megoldottam:
void _revTCP(t_TCP_hdr * tcp)
{
asm(" push {r1-r2} ");
asm(" ldrh r1, [r0] "); // srcPort
asm(" rev16 r1, r1 ");
asm(" strh r1, [r0] ");
asm(" ldrh r1, [r0, #2] "); // destPort
asm(" rev16 r1, r1 ");
asm(" strh r1, [r0, #2] ");
asm(" ldrh r1, [r0, #4] "); // seqnoL
asm(" ldrh r2, [r0, #6] "); // seqnoH
asm(" rev16 r1, r1 ");
asm(" rev16 r2, r2 ");
asm(" strh r2, [r0, #4] ");
asm(" strh r1, [r0, #6] ");
asm(" ldrh r1, [r0, #8] "); // acknoL
asm(" ldrh r2, [r0, #10] "); // acknoH
asm(" rev16 r1, r1 ");
asm(" rev16 r2, r2 ");
asm(" strh r2, [r0, #8] ");
asm(" strh r1, [r0, #10] ");
asm(" ldrh r1, [r0, #14] "); // wndSize
asm(" rev16 r1, r1 ");
asm(" strh r1, [r0, #14] ");
asm(" ldrh r1, [r0, #16] "); // tcpChksum
asm(" rev16 r1, r1 ");
asm(" strh r1, [r0, #16] ");
asm(" ldrh r1, [r0, #18] "); // urgPtr
asm(" rev16 r1, r1 ");
asm(" strh r1, [r0, #18] ");
asm(" pop {r1-r2} ");
}
Aztán ahogy beesik csere, így az egész progban nem kellett foglalkozni
vele, ki is ment a fejemből. Most, hogy belenéztem a kódba, a
visszafele cserlélést a checksum számítással egyberaktam, az is így
volt egyszerűbb.
More information about the Elektro
mailing list