Code generation changes behavior from Matlab 2020b to 2023b

12 Ansichten (letzte 30 Tage)
Steffen
Steffen am 28 Mär. 2024
Kommentiert: Satwik am 20 Sep. 2024
"Not too long ago, I switched from Matlab version 2020b to 2023b, upgrading all Simulink files in the process. Now, I'm encountering an issue where the Simulink code generation structures the C files differently (see the code snippet below), causing the compiler to fail to compile them.
C-Code from Matlab-Version 2020b:
actuator_state = (uint8_T)!Process_U.alive;
if (Process_U.actuator_flag) {
actuator_state = (uint8_T)(int32_T)((int32_T)actuator_state | 2);
}
if (Process_U.state == 2) {
actuator_state = (uint8_T)(int32_T)((int32_T)actuator_state | 4);
}
if (Process_U.state == 3) {
actuator_state = (uint8_T)(int32_T)((int32_T)actuator_state | 8);
}
C-Code from Matlab-Version 2023b
if (Process_U.actuator_flag) {
b_a = (uint8_T)(int32_T)(!Process_U.alive | 2);
} else {
b_a = (uint8_T)!Process_U.alive;
}
if (Process_U.state == 2) {
b_a = (uint8_T)(int32_T)((int32_T)b_a | 4);
}
if (Process_U.state == 3) {
b_a = (uint8_T)(int32_T)((int32_T)b_a | 8);
}
I wanted to ask if you know which setting might be causing this change.
Thank you very much.
  3 Kommentare
Steffen
Steffen am 2 Apr. 2024
Thank you for the response. I will make these adjustments. Yes, we use Embedded Coder, Simulink Coder, and MATLAB Coder. The toolboxes operate in a pipeline that generates this C code.
During compilation, there is this error:
Process.c: In function 'Process_step':
Process.c:2896:30: error: suggest parentheses around operand of '!' or change '|' to '||' or '!' to '~' [-Werror=parentheses]
2896 | b_a = (uint8_T)(int32_T)(!Process_U.alive | 2);
|
Since compilation worked in the last MATLAB version, I thought that the generated C code in MATLAB 2023b might not be suitable for the compiler. Especially since we haven't modified the compiler.
Satwik
Satwik am 20 Sep. 2024
Hi Steffan,
The error message you are encountering suggests that the compiler is having trouble with the expression ‘!Process_U.alive | 2’. The issue arises from the mixing of logical (!) and bitwise (|) operators without clear separation, which can lead to ambiguous behavior.
1. If ‘Process_U.alive’ is a boolean or should be used in a logical context, consider using logical operators:
b_a = (uint8_T)(int32_T)(!Process_U.alive || 2);
2. If you intend to perform a bitwise operation, ensure the logic is correct and use the bitwise NOT operator (~):
b_a = (uint8_T)(int32_T)((~Process_U.alive) | 2);

Melden Sie sich an, um zu kommentieren.

Antworten (0)

Kategorien

Mehr zu Simulink Coder finden Sie in Help Center und File Exchange

Produkte


Version

R2023b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by