# C programming problem

Status
Not open for further replies.

#### SimonB

##### New Member
I am looking through some Atmel ARM code and cannot decipher the following:

I am trying to configure an interrupt and the example code to configure it is as follows:

Code:
void IRQ_ConfigureIT(unsigned int source,
unsigned int mode,
void( *handler )( void ))
{
// Disable the interrupt first
AT91C_BASE_AIC->AIC_IDCR = 1 << source;

// Configure mode and handler
AT91C_BASE_AIC->AIC_SMR[source] = mode;
AT91C_BASE_AIC->AIC_SVR[source] = (unsigned int) handler;

// Clear interrupt
AT91C_BASE_AIC->AIC_ICCR = 1 << source;
}

Here you are calling a function with variables 'source', 'mode' and a general pointer 'handler'

All good so far..

Elsewhere in the text, the interrupt service routine is specified:

Code:
void TC0_IrqHandler(void)
{
volatile unsigned int dummy;
// Clear status bit to acknowledge interrupt
dummy = AT91C_BASE_TC0->TC_SR;

// Toggle LED state
LED_Toggle(1);
printf("2 ");
}

The bit I am having trouble with is when IRQ_ConfigureIT is called. The line used is:

Code:
IRQ_ConfigureIT(AT91C_ID_TC0, 0, TC0_IrqHandler);

Here it looks like they are using the function name (TC0_IrqHandler) as a variable in the function call.

Does C allow you to do this, or am I misinterpreting this? I thought function calls can only use variables, not function names.

Any thoughts would be most welcome.

Thanks

Simon

#### Pommie

##### Well-Known Member
It's passing the address of the function. The called function expects a void pointer which is the address of the function to call.

Mike.

#### SimonB

##### New Member
Hi Pommie

Thanks for this.

So just to get this perfectly straight, the compiler sees the 'variable':

Code:
TC0_IrqHandler

and substitutes the address of the ISR (TC0_IrqHandler) into the function call.

Is this the standard way of calling an interrupt (using a void pointer)? In the PIC world, you specify 'ISR' in the name of the interrupt service routine and the compiler jumps to that routine.

Thanks

Simon

#### Pommie

##### Well-Known Member
The thing that is passed to the function is a pointer, the compiler knows this because the parameters name is preceded by a *. A pointer can hold the address of a variable or, as in this case, the address of a function. The parameter in this case is written void (*FunctionName)(void) which tells the compiler it's a function.

Pointers are a little tricky to get your head around at first. It may be a good idea to read up on them.

On Pics I assume you could handle interrupts in the same way but I can't see a need for it. There is also an added complication with Pics as there are 4 different pointer types.

Edit, I think what the above code is doing is the equivalent of putting goto handler at location 4 on a Pic but, as I don't know the ARM chip, I'm probably wrong.

Mike.

Last edited:

#### SimonB

##### New Member
Hi Mike

Thanks for your quick reply. If I consider the code from the viewpoint that a pointer can hold a memory address, it seems a lot clearer. This is the first time I have come across a void pointer, but it is really no different from a normal pointer (if you can ever call pointers normal).

Yes I need to read up on pointers. I have Kernighan and Ritchie on order....

Thanks

Simon
(I used to live in Frankston, just outside Melbourne, back in 1972)

Status
Not open for further replies.

Replies
5
Views
2K
Replies
14
Views
1K
Replies
2
Views
1K
Replies
40
Views
6K
Replies
4
Views
1K