C-Code generation from Simulink issues
Show older comments
I am working with C-code generated scripts from Simulink blocks that were created using a relatively old version of Matlab. My employer is trying to move away from older Matlab versions and wants us generating the c-code in R2012B (32 bit). I have noticed that the c-code function used for interpolation writes the entire function into the main file (this same function was only called in earlier version). This creates a few issues for the team I hand this off to for implementation. Is there a parameter or configuration flag that I can change to prevent this in Simulink. We are doing this in bulk so simply deleting and moving to an eternal function is not practical.
I have copied in the c-code interpolation function
{real_T look1_pbinlcpw(real_T u0, const real_T bp0[], const real_T table[], uint32_T prevIndex[], uint32_T maxIndex) { real_T frac; uint32_T startIndex; uint32_T iRght; uint32_T iLeft; uint32_T found;
/* Lookup 1-D
Search method: 'binary'
Use previous index: 'on'
Interpolation method: 'Linear'
Extrapolation method: 'Clip'
Use last breakpoint for index at or above upper limit: 'off'
Remove protection against out-of-range input in generated code: 'off'
*/
/* Prelookup - Index and Fraction
Index Search method: 'binary'
Extrapolation method: 'Clip'
Use previous index: 'on'
Use last breakpoint for index at or above upper limit: 'off'
Remove protection against out-of-range input in generated code: 'off'
*/
if (u0 <= bp0[0U]) {
startIndex = 0U;
frac = 0.0;
} else if (u0 < bp0[maxIndex]) {
startIndex = prevIndex[0U];
/* Binary Search using Previous Index */
iLeft = 0U;
iRght = maxIndex;
found = 0U;
while (found == 0U) {
if (u0 < bp0[startIndex]) {
iRght = startIndex - 1U;
startIndex = (iRght + iLeft) >> 1U;
} else if (u0 < bp0[startIndex + 1U]) {
found = 1U;
} else {
iLeft = startIndex + 1U;
startIndex = (iRght + iLeft) >> 1U;
}
}
frac = (u0 - bp0[startIndex]) / (bp0[startIndex + 1U] - bp0[startIndex]);
} else {
startIndex = maxIndex - 1U;
frac = 1.0;
}
prevIndex[0U] = startIndex;
/* Interpolation 1-D
Interpolation method: 'Linear'
Use last breakpoint for index at or above upper limit: 'off'
Overflow mode: 'portable wrapping'
*/
return (table[startIndex + 1U] - table[startIndex]) * frac + table[startIndex];
}
}
1 Comment
Cameron Kingsley
on 21 Sep 2015
Accepted Answer
More Answers (0)
Categories
Find more on Get Started with DSP System Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!