Odd Calling Convention

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Odd Calling Convention

Jump to solution
538 Views
jimfell
Contributor III

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.

 

 

Labels (1)
0 Kudos
1 Solution
404 Views
BlackNight
NXP Employee
NXP Employee

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

View solution in original post

0 Kudos
2 Replies
405 Views
BlackNight
NXP Employee
NXP Employee

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

0 Kudos
404 Views
jimfell
Contributor III

Thanks!

0 Kudos