I working with an existing code base, and I came across this function that is called durning normal program execution to modify the Interrupt Priority Level (IPL) bits of the Status Register (SR):
__declspec (register_abi) asm unsigned int asm_set_ipl(unsigned int mask)
I'm unfamiliar with this. What is this convention suppose to be doing? (Yes, all the code in this function is assembly.) As nearly as I can tell, this is just stating that this is an assembly function. Is that all this convention is doing? I am using CodeWarrior 10. Thanks.
已解决! 转到解答。
Yes, I have seen that in several places used. It is not CodeWarrior specific. I think 'ipl' stands for 'Interrupt Priority Level': using that (assembly) function you pass the new interrupt mask and on return you get the previously set interrupt level back. So you could use it like
oldLevel = asm_set_ipl(MASK_ALL_INTERRPTS); /* disable interrupts */
critical section here;
(void) asm_set_ipl(oldLevel); /* restore previous interrupt level */
If the question is about what the __declspec(register) is about: this tells the compiler to use 'register' calling convention (instead of passing the parameters on the stack).
Hope this helps,
Erich
Yes, I have seen that in several places used. It is not CodeWarrior specific. I think 'ipl' stands for 'Interrupt Priority Level': using that (assembly) function you pass the new interrupt mask and on return you get the previously set interrupt level back. So you could use it like
oldLevel = asm_set_ipl(MASK_ALL_INTERRPTS); /* disable interrupts */
critical section here;
(void) asm_set_ipl(oldLevel); /* restore previous interrupt level */
If the question is about what the __declspec(register) is about: this tells the compiler to use 'register' calling convention (instead of passing the parameters on the stack).
Hope this helps,
Erich