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 all, I need some help about assigning two structures.
The simple Function
void CopyStruct(struct A *sSrc, struct A *sDst) { *sDst = *sSrc; }
is translated to
; Variable 'sDst' assigned to Register 'R10/R11' ; Variable 'sSrc' assigned to Register 'R8/R9' 0010 F06A MOV R6,R10 0012 F048 MOV R4,R8 0014 F07B MOV R7,R11 0016 F059 MOV R5,R9 0018 E6F23600 MOV R2,#036H 001C DA000000 E CALLS SEG (?C_WCPYFF),?C_WCPYFF
How is the data copied? Where can I find the implementation of the library Function "C_WCPYFF"? (Keil C166 6.04a)
Thanks for your Help.
Regards, Marcus
My primary Intention is a better understandig.
What about Data Integrity of larger Objects in Multitasking Environments? I.e. do I have to protect against Interrupts (Struct consisting of 16Bit Objects @ 16Bit operations = No, @ 8Bit operations = yes)
What about Performance in time-critical projects?
Of course I could write my own Function, but the simple assignment is quite charming.
"What about Data Integrity of larger Objects in Multitasking Environments?"
Even a simple assignment is not guaranteed to be atomic - so nothing special here.
"What about Performance in time-critical projects?"
If you have a time-critical project, why are you copying big structures around anyhow?
"Of course I could write my own Function, but the simple assignment is quite charming."
That's the trade-off: either write it yourself, and know what's going on, or go for convenience and delegate the control to the compiler. You can't have it both ways, I'm afraid.
I don't think Keil give out their source code. But you don't need it: the copy subroutine is small and you can easily figure out how it works by looking at its disassembly. I suspect in some memory models and/or optimization settings the compiler could inline the copy subroutine. If you need atomicity for thread-safe operation, you should take care of it yourself. The compiler should not disable interrupts silently as this would increase interrupt latency and create a risk of side effects. As for performance, if you think that the standard copy subroutine is suboptimal, right one yourself. That's what I would have done, anyway.
Regards, - mike
Even a simple assignment is not guaranteed to be atomic - so nothing special here
What do you mean by that? In which cases can a 8 or 16 Bit assignment on a 16 Bit Platform like the XC be unsafe? Can you give me an example?
Thanks
"In which cases can a 8 or 16 Bit assignment on a 16 Bit Platform like the XC be unsafe"
I didn't say that!
All I said was, Even a simple assignment is not guaranteed to be atomic"
In fact, as you say, it probably will be safe for 8 or 16 bit assignments on a 16 Bit Platform like the XC - but that is a feature of the target environment, not a guarantee of the language. And what happens if the 16-bit value is not word-aligned...?