0% found this document useful (0 votes)
15 views

Unit II - Loops and Function Pointers, Queues

The document discusses using infinite loops in embedded system programming by polling for events and messages. It provides examples of using functions and function queues by making multiple function calls in a cyclic order and using function pointers to call functions.

Uploaded by

Nandhini P
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
15 views

Unit II - Loops and Function Pointers, Queues

The document discusses using infinite loops in embedded system programming by polling for events and messages. It provides examples of using functions and function queues by making multiple function calls in a cyclic order and using function pointers to call functions.

Uploaded by

Nandhini P
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 34

Use of Infinite Loops

• Infinite loops- Never desired in usual


programming. Why? The program will never
end and never exit or proceed further to the
codes after the loop.
• Infinite loop is a feature in embedded system
programming!
Programming using Events and
Messages Polling
Function main with a waiting loop
• main ( ) passes the control to an RTOS
• Each task controlled by RTOS and
• Each task will also have the codes in an infinite
loop
• A waiting task is passed a signal by the RTOS
to start
# define false 0
# define true 1
void main (void) {
/* Call RTOS run here */
rtos.run ( );
/* Infinite while loops follows in each task.
So never there is return from the RTOS. */
}
void task1 (....) {
/* Declarations */
while (true) {
/* Run Codes that repeatedly execute */
/* Run Codes that execute on an event*/
if (flag1) {....;};
flag1 =0;
/* Codes that execute for message to the kernel */
message1 ( );
}
}
• void task2 (....) {
/* Declarations */
while (true) {
/* Codes that repeatedly execute */
/* Codes that execute on an event */
if (flag2) {....;};
flag2 =0;
/* Codes that execute for message to the kernel
*/
message2 ( ); } }
Polling for events and messages
Example – Mobile Phone
Polling for a menu selection from
screen state
void poll_menuK {
/* Code for polling for choice from menu m for
screen state K*/ }
}
Polling for an event like mice click or
menu select
One of the following functions (s,m)
gets executed
Use of functions
(i) Passing the Values (elements):
The values are copied into the arguments of the
functions.
When the function is executed in this way, it
does not change a variable's value at the
function, which calls new function.
(ii) Passing the References –
When an argument value to a function passes
through a pointer, the called function can
change this value.
On returning from this function, the new value
may be available in the calling program or
another function called by this function.
Use of Reentrant Function
• Reentrant function-
A function usable by the several tasks and
routines synchronously (at the same time). This
is because all the values of its argument are
retrievable from the stack.
Three conditions for a function called
as reentrant function
1. All the arguments pass the values and none of the
argument is a pointer (address) whenever a calling
function calls that function.
2. When an operation is not atomic, that function
should not operate on any variable, which is declared
outside the function or which an interrupt service
routine uses or which is a global variable but passed
by reference and not passed by value as an argument
into the function. [The value of such a variable or
variables, which is not local, does not save on the
stack when there is call to another program.]
3. That function does not call any other function
that is not itself Reentrant.
Programming using functions
and function queues
Programming using functions and
function queues
• Use of multiple function calls in the main ( )
• Use of multiple function calls in cyclic order
• use of pointer to a function
• Use of function queues
Multiple function calls in cyclic order
• One of the most common methods is the use
of multiple function-calls in a cyclic order in an
infinite loop of the main ( ).
Use of Function Pointers
• ‘*’ sign when placed before the function name then it
refers to all the compiled form of the statements in the
memory that are specified within the curly braces
when declaring the function.
• A returning data type specification (for example, void)
followed by
'(*functionName) (functionArguments)' calls the
statements of the functionName using the
functionArguments, and on a return, it returns the
specified data object.
We can thus use the function pointer for invoking a call
to the function.
Consider a declaration in the example,
1. void inPortA (unsigned char *);
inPortA means a pointer to the statements of
the function. Inside the parenthesis there is a
character pointed by some pointer.
2. *inPortA will refer to all the compiled
statements of inPortA.

3. (*inPortA) will refer to calling of statements of


inPortA.
4. Void create(void (*inPortA) (unsigned char *
portAdata), unsigned char *portAStack,
unsigned char portApriority);
Priority Function Queue of Multiple
ISRs
• When there are multiple ISRs, a high priority
interrupt service routine is executed first and
the lowest priority.
• The ISRs insert the function pointers into a
priority queue of function pointers.

You might also like