%% Optimize Memory Usage for Time Counters 

%%
% This example shows how to optimize the amount of memory that the 
% code generator allocates for time counters. The example optimizes the memory 
% that stores elapsed time, the interval of time between two events. 
% 
% The code generator represents time counters as unsigned integers. The word 
% size of time counters is based on the setting of the model configuration 
% parameter *Application lifespan (days)*, which specifies the expected maximum  
% duration of time the application runs. You can use this parameter to prevent 
% time counter overflows. The default size is 64 bits. 
% 
% The number of bits that a time counter uses depends on the setting of the 
% *Application lifespan (days)* parameter. For example, if a time counter 
% increments at a rate of 1 kHz, to avoid an overflow, the counter has the 
% following number of bits:
%
% * Lifespan < 0.25 sec:   8 bits
% * Lifespan < 1 min:      16 bits
% * Lifespan < 49 days:    32 bits
% * Lifespan > 50 days:    64 bits
%
% A 64-bit time counter does not overflow for 590 million years.
%
%% Open Example Model
% Open the example model |rtwdemo_abstime|.
%
model='rtwdemo_abstime';
open_system(model); 
%%
% The model consists of three subsystems |SS1|, |SS2|, and |SS3|. On the 
% *Math and Data Types* pane, the *Application lifespan (days)* parameter is 
% set to the default, which is |inf|.
%
% The three subsystems contain a discrete-time integrator that requires elapsed 
% time as input to compute its output value. The subsystems vary as 
% follows:
% 
% * SS1 - Clocked at 1 kHz. Does not require a time counter. *Sample time
% type* parameter for trigger port is set to |periodic|. Elapsed time is 
% inlined as 0.001. 
% * SS2 - Clocked at 100 Hz. Requires a time counter. Based on a lifespan of
% 1 day, a 32-bit counter stores the elapsed time.
% * SS3 - Clocked at 0.5 Hz. Requires a time counter. Based on a lifespan of
% 1 day, a 16-bit counter stores the elapsed time. 
%
%% Simulate the Model
%
% Simulate the model. By default, the model is configured to show sample times 
% in different colors.  Discrete sample times for the three subsystems appear 
% red, green, and blue. Triggered subsystems are blue-green.
%
%% Generate Code and Report
% 
% 1. Create a temporary folder for the build and inspection process.
currentDir = pwd;
[~,cgDir] = rtwdemodir();
%%
% 2. Configure the model for the code generator to use the GRT system
% target file and a lifespan of |inf| days.
%
% 3. Build the model.
rtwbuild(model)
%% Review Generated Code
%
% Open the generated source file |rtwdemo_abstime.c|. 
%
cfile = fullfile(cgDir, 'rtwdemo_abstime_grt_rtw', 'rtwdemo_abstime.h');
rtwdemodbtype(cfile,'/* Real-time Model Data Structure */', '/* Block states (auto storage) */', 0, 1);
%%
% Four 32-bit unsigned integers, |clockTick1| , |clockTickH1| , |clockTick2| , 
% and |clockTickH2| are counters for storing the elapsed time of subsystems 
% |SS2| and |SS3|.
%% Enable Optimization and Regenerate Code 
% 
% 1. Reconfigure the model to set the lifespan to 1 day. 
%
set_param(model, 'LifeSpan', '1');
%%
% 2. Build the model.
rtwbuild(model)
%% Review the Regenerated Code
cfile = fullfile(cgDir, 'rtwdemo_abstime_grt_rtw', 'rtwdemo_abstime.h');
rtwdemodbtype(cfile,'/* Real-time Model Data Structure */', '/* Block states (auto storage) */', 0, 1);
%%
% The new setting for the *Application lifespan (days)* parameter instructs the
% code generator to set aside less memory for the time counters.  The 
% regenerated code includes:
%
% * 32-bit unsigned integer, |clockTick1|, for storing the elapsed time of 
% the task for |SS2|
% * 16-bit unsigned integer, |clockTick2|, for storing the elapsed time of
% the task for |SS3|
%
%% Related Information
% * <docid:rtw_ref.bq7cqu2-1 Optimization Pane>
% * <docid:rtw_ug.f29370 Timers in Asynchronous Tasks>
% * <docid:rtw_ug.f997321 Time-Based Scheduling and Code Generation>
%%
bdclose(model)
rtwdemoclean;
cd(currentDir)

%% 
% Copyright 2012 The MathWorks, Inc.