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.
Hello everybody!
If you please could help with this problem. I am writing a timer32 interrupt handler and try to use inline assembly.
I wrote the simplest code, which triggers a port pin high and then low at the minimal possible time interval. One instruction turns it on, the next one - off. The code is very simple.
The problem is when I used a debugger (msp432 launchpad), I saw that the compiler actually had changed my code!!! I saw that it stored the values to registers, different from what I wrote AND the worst thing was, the compiler thought that writing #1 to the port ( STRB r1, [r0] ) was totally redundant, since the next instruction writes a zero there, so the compiler simply dumped that instruction. So it changes my assembly code! Could please anyone tell me how to force the compiler to stop playing a smart ass and to implement my inline assembly code exactly the way it is written and do all the instructions I write? Thank you!!!
void T32_INT1_IRQHandler(void){ __asm{ MOV R0, #0x40004c03 //DIO port address MOV r1, #1 MOV r2, #0 STRB r1, [r0] //Port pin High STRB r2, [r0] //Port pin Low } }
I've not tried it in uvision, but it's common to need volatile blocks to tell the compiler to not fiddle with inline assembler. Without this it will go though the optimizer. Does this:__asm volatile { ... }
__asm volatile { ... }
... work any better?
HTH, Pete
Hello Pete! I have thought about it also, alas, to no avail. The instruction was still missing. But the funny thing was that when I finally wrote the code in pure asm and the instruction was finally implemented, there was no visible difference in pin jerking speed, whether the on and off instructions went in a row, or had a MOV in between! Perhaps the internal guts of the MSP432 are wired in such a way that it can move some number to a register while storing another number somewhere else? Or perhaps my oscilloscope bullsh*ts.