We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
Hi experts!
I want to use ldr/str or ldm/stm to copy memory not aligned 4bytes.
I know their input address should be aligned by 4 bytes.
but is there any solution to use ldr/str or ldm/stm though src or dst isn't aliged 4byte by modifing following code?
void wordcopy(unsigned char *dst, unsigned char *src, int num) {loop: LDR r3,[r1]; STR r3,[r0]; SUBS r2,r2,#1; BNE loop; BX lr;}
LDM/STM only support aligned addresses.
LDR/STR can be used with unaligned addresses, as long as the target addresses are marked as Normal and that alignment checking isn't enabled.
You didn't mention which processor/architecture you are targeting. For A class, the translation tables that define whether an address is Normal or Device. For R and M class, it's the MPU (if present).
The other option is to test in the passed in pointers. Do a number of byte load/stores until you get an aligned address, then do LDM/STM, and finish with more byte load/stores if needed.
EDIT: Typo
Hello,
I hope the __rt_memcpy function of the following link will help you.
http://research.microsoft.com/en-us/um/redmond/projects/invisible/src/crt/md/arm/_memfunc.s.htm
Best Regards,
Yasuhiko Koumoto.
To enhance Martin's reply slightly:
In the very beginning of your routine, make a check on the lowest 2 bits on both source and destination.
If the bits match on both source and destination, use a 32-bit copy with a ramp-up.
If bit 0 on source differs from bit 0 on destination, you may benefit from byte-copy; you also have the option to use shifts, but the code will be large.
If bit 1 on source differs from bit 1 on destination, you may benefit from halfword-copy, but the penalty for copying misaligned halfwords is not so bad, so you may want to do a full 32-bit copy there.
Hint: Use the EOR instruction followed by a LSLS#30 to check if the low two bits match.
Thanks Martin, jensbauer, yasuhikokoumoto for your kind response!
It's very helpful!