Keil Logo

NOINDIRECTCALL Linker Directive

Abbreviation

NOIC

Arguments

None.

Default

Inter-bank call table entries are created for each indirectly called function.

µVision

Options — BL51 Misc — Misc Controls.

Description

The NOINDIRECTCALL directive causes the linker to exclude entries in the inter-bank call table for indirect function calls. This directive is useful if your application uses tables of function pointers that are accessed from and within the same code bank (in a manner that requires no bankswitching).

In code banking applications, the linker creates an entry in the inter-bank call table for each function that is called indirectly (via a function pointer). This is done to ensure that functions which are invoked indirectly are available to all code banks.

The NOINDIRECTCALL directive works only for function tables and not for function pointer references within a function. For example:

Common Area Module

extern void id_call (void (* f) ());
extern void funca (void);
extern void funcb (void);
extern void funcc (void);

void (*f[])(void) = { func2a, func2b };

void test (void)  {
  id_call (f[0]);
  id_call (f[1]);

  id_call (func2c);  // This always generates an inter-bank table entry.
}

Code Bank Module

void funca ()  {
  ;
}

void funcb ()  {
  ;
}

void funcc ()  {
  ;
}

void id_call (void (* f) ())  {
  f ();
}

Use the NOINDIRECTCALL directive to avoid inter-bank table entries for funca and funcb.

See Also

IBANKING, NOJMPTAB

Example
BL51 MYPROG.OBJ NOINDIRECTCALL

Related Knowledgebase Articles

  Arm logo
Important information

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies.

Change Settings

Privacy Policy Update

Arm’s Privacy Policy has been updated. By continuing to use our site, you consent to Arm’s Privacy Policy. Please review our Privacy Policy to learn more about our collection, use and transfers
of your data.