文章目錄
前言
一、Simulink實現(xiàn)循環(huán)結構
二、自動生成C代碼
三、變式1
四、變式2
五、變式3
六、變式4
總結
前言
????????《深入拆解Simulink自動生成代碼(一)——數(shù)據流處理》
????????《深入拆解Simulink自動生成代碼(二)——選擇結構》
一、Simulink實現(xiàn)循環(huán)結構
???????? 用Simulink實現(xiàn)循環(huán)結構的一個最簡單編程舉例如下:
?
二、自動生成C代碼
???????? 上述循環(huán)結構的Simulink自動生成的對應C代碼如下:
int32_T s3_iter;
/* Outputs for Iterator SubSystem: '<S2>/For Iterator Subsystem' incorporates:
* ForIterator: '<S3>/For Iterator'
*/
for (s3_iter = 0; s3_iter < 5; s3_iter++) {
/* Outputs for Iterator SubSystem: '<S2>/For Iterator Subsystem' incorporates:
* ForIterator: '<S3>/For Iterator'
*/
CodeGenerate_Y.y2 = s3_iter + 1;
}
/* End of Outputs for SubSystem: '<S2>/For Iterator Subsystem' */
三、變式1
???????? 基于上述舉例,把for循環(huán)改成while循環(huán),生成的對應代碼如下所示:
int32_T s3_iter;
/* Outputs for Iterator SubSystem: '<S2>/While Iterator Subsystem' incorporates:
* WhileIterator: '<S3>/While Iterator'
*/
s3_iter = 1;
/* End of Outputs for SubSystem: '<S2>/While Iterator Subsystem' */
do {
CodeGenerate_Y.y2 = s3_iter;
s3_iter++;
} while (s3_iter <= 5);
四、變式2
???????? 基于上述舉例,再增加一個while的退出條件,當Counter>3時退出循環(huán),生成的對應代碼如下所示:
int32_T s3_iter;
boolean_T rtb_Compare;
/* Outputs for Iterator SubSystem: '<S2>/While Iterator Subsystem1' incorporates:
* WhileIterator: '<S3>/While Iterator'
*/
s3_iter = 1;
/* End of Outputs for SubSystem: '<S2>/While Iterator Subsystem1' */
do {
CodeGenerate_Y.y2 = s3_iter;
rtb_Compare = (CodeGenerate_DW.Output_DSTATE <= 3);
if ((uint8_T)(CodeGenerate_DW.Output_DSTATE + 1U) > 7) {
CodeGenerate_DW.Output_DSTATE = 0U;
} else {
CodeGenerate_DW.Output_DSTATE++;
}
s3_iter++;
} while (rtb_Compare && (s3_iter <= 5));
五、變式3
???????? 基于上述舉例,把while的循環(huán)類型從do while改成while do,生成的對應代碼如下所示:
int32_T s3_iter;
boolean_T loopCond;
/* Outputs for Iterator SubSystem: '<S2>/While Iterator Subsystem2' incorporates:
* WhileIterator: '<S3>/While Iterator'
*/
s3_iter = 1;
/* Constant: '<S2>/Constant' */
loopCond = true;
while (loopCond && (s3_iter <= 5)) {
/* Outputs for Iterator SubSystem: '<S2>/While Iterator Subsystem2' incorporates:
* WhileIterator: '<S3>/While Iterator'
*/
CodeGenerate_B.WhileIterator = s3_iter;
/* RelationalOperator: '<S4>/Compare' incorporates:
* Constant: '<S4>/Constant'
* UnitDelay: '<S5>/Output'
*/
loopCond = (CodeGenerate_DW.Output_DSTATE <= 3);
/* Switch: '<S7>/FixPt Switch' incorporates:
* Constant: '<S6>/FixPt Constant'
* Constant: '<S7>/Constant'
* Sum: '<S6>/FixPt Sum1'
* UnitDelay: '<S5>/Output'
*/
if ((uint8_T)(CodeGenerate_DW.Output_DSTATE + 1U) > 7) {
CodeGenerate_DW.Output_DSTATE = 0U;
} else {
CodeGenerate_DW.Output_DSTATE++;
}
/* End of Switch: '<S7>/FixPt Switch' */
s3_iter++;
}
/* End of Outputs for SubSystem: '<S2>/While Iterator Subsystem2' */
/* Outport: '<Root>/y2' incorporates:
* MATLAB Function: '<Root>/MATLAB Function3'
*/
CodeGenerate_Y.y2 = CodeGenerate_B.WhileIterator;
六、變式4
???????? 基于上述舉例,把while循環(huán)體的執(zhí)行內容,從每次退出循環(huán)再進入時保持前一次的狀態(tài),變成每次退出循環(huán)再進入時置初始狀態(tài),也即Start狀態(tài)從Held改成Reset,生成的對應代碼如下所示:
int32_T s3_iter;
uint8_T Output_DSTATE;
boolean_T loopCond;
/* Outputs for Iterator SubSystem: '<S2>/While Iterator Subsystem3' incorporates:
* WhileIterator: '<S3>/While Iterator'
*/
s3_iter = 1;
/* InitializeConditions for UnitDelay: '<S5>/Output' */
Output_DSTATE = 0U;
/* Constant: '<S2>/Constant1' */
loopCond = true;
while (loopCond && (s3_iter <= 5)) {
/* Outputs for Iterator SubSystem: '<S2>/While Iterator Subsystem3' incorporates:
* WhileIterator: '<S3>/While Iterator'
*/
CodeGenerate_B.WhileIterator = s3_iter;
/* RelationalOperator: '<S4>/Compare' incorporates:
* Constant: '<S4>/Constant'
* UnitDelay: '<S5>/Output'
*/
loopCond = (Output_DSTATE <= 3);
/* Switch: '<S7>/FixPt Switch' incorporates:
* Constant: '<S6>/FixPt Constant'
* Constant: '<S7>/Constant'
* Sum: '<S6>/FixPt Sum1'
* UnitDelay: '<S5>/Output'
*/
if ((uint8_T)(Output_DSTATE + 1U) > 7) {
Output_DSTATE = 0U;
} else {
Output_DSTATE++;
}
/* End of Switch: '<S7>/FixPt Switch' */
s3_iter++;
}
/* End of Outputs for SubSystem: '<S2>/While Iterator Subsystem3' */
/* Outport: '<Root>/y2' incorporates:
* MATLAB Function: '<Root>/MATLAB Function3'
*/
CodeGenerate_Y.y2 = CodeGenerate_B.WhileIterator;
總結
???????? 以上就是本人拆解Simulink模塊自動生成代碼時,講解的第三部分。主要針對Simulink的循環(huán)模塊,展示了這類模塊的使用方法,并對比了相應的C代碼。
???????? 后續(xù)還會更新Simulink其他的幾種模塊,歡迎評論區(qū)留言、點贊、收藏和關注,這些鼓勵和支持都將成為筆者持續(xù)分享的動力。
???????? 另外,上述例程使用的Demo工程可以到筆者的主頁查找和下載。文章來源:http://www.zghlxwxcb.cn/news/detail-529704.html
???????? 版權聲明:原創(chuàng)文章,轉載和引用請注明出處和鏈接,侵權必究!文章來源地址http://www.zghlxwxcb.cn/news/detail-529704.html
到了這里,關于深入拆解Simulink自動生成代碼(三)——循環(huán)結構的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!