Echelon Neuron C User Manual

Page 73

Advertising
background image

Neuron C Programmer’s Guide

61

Example:

network output SNVT_temp nvoTemp;

when (timer_expires(heartbeat))
{
propagate(nvoTemp);
}

The propagate( ) function can also be useful where pointers are used to update
output network variables. For example, assume that some function, f( ),

calculates a complicated set of values and places them in a network variable

structure. Assume the function is designed to operate on several similar such
variables within a device, thus the function is passed a pointer to each variable.
For efficiency, it might be best to code this function to operate on the variables

through a pointer reference. However, the Neuron C compiler cannot distinguish
between a pointer to a regular application variable, and a pointer to a network

variable. Thus, updates to a network variable through a pointer do not trigger an

implicit propagation, and an explicit propagation is required.

Furthermore, because of the inability to distinguish pointers to network

variables, Neuron C treats pointers to network variables as pointers to const

data, thus avoiding the problem of a modification to the variable through the
pointer. In Neuron C, removal of the const attribute is not normally permitted.

However, the #pragma relaxed_casting_on directive directs the compiler to
permit this cast. Casting can either be explicit, or implicit by variable

assignment or function parameter passing.
Example:

network output SNVT_temp_f nvoTemp;

//
// the hypothetical function f() could be supplied with a
// binary (pre-compiled) function library for easy re-use,
// of for protection of intellectual property (function
// f’s algorithm).
//
extern void f(SNVT_temp_f* pNv);

when (some-event)
{
#pragma relaxed_casting_on

// Without pragma above, this would result in

// an error, because the address of a network

// variable is treated as 'const <type> *'.

// Passing such a type as the function parameter

// results in an implicit cast, since the function

// prototype defines the variable as '<type> *'.


f((SNVT_temp_f*)&nvoTemp);

propagate(nvoTemp); // Explicit propagation needed

// because f() modified nvoTemp by pointer.

}

Advertising