IAR ARM 5.30, ядро Cortex M3. При компиляции с оптимизацией уровня medium перестает правильно выполняться функция InitPump. Вот исходник.
CODE
#define Uref ((uint32_t)3300)
#define ADCwidth ((uint32_t)4095)
#define SensitivityXGain ((float)25.2)
#define setbit(a,

(a |= (1<<b))
#pragma location="FLASH"
__root const float SetPressure[2] = {0.0, 1.0};
struct Pump_struct{
uint8_t channel;
uint16_t sourceid;
uint16_t status;
uint16_t rpm;
uint16_t set_pressure;
uint16_t measure;
float pressure;
float thresoldpressure;
uint16_t lowthresoldrpm;
uint16_t highthresoldrpm;
uint16_t tx_pressure;
uint16_t tx_rpm;
uint16_t lastmessagepressure;
uint16_t lastmessagerpm;
uint32_t timer;
uint32_t timer_message;
uint32_t timer_send;
uint32_t compare_time;
uint16_t pressure_data[PRESSURE_SIZE];
uint8_t pressure_cnt;
uint32_t pressure_sum;
uint32_t rpm_sum;
uint16_t rpm_data[RPM_SIZE];
uint8_t rpm_cnt;
};
struct Pump_struct Pump[2];
void InitPump(uint8_t num)
{
struct Pump_struct *ptrPump;
uint32_t i;
ptrPump = &Pump[num];
ptrPump->status = 0;
ptrPump->sourceid = 0;
ptrPump->rpm = 0;
ptrPump->measure = 0;
ptrPump->pressure = 0;
ptrPump->thresoldpressure = HysteresisPressure[num];
ptrPump->lowthresoldrpm = ThresoldRpm[num][0];
ptrPump->highthresoldrpm = ThresoldRpm[num][1];
ptrPump->tx_pressure = TxPressure[num];
ptrPump->tx_rpm = TxRpm[num];
ptrPump->lastmessagepressure = 0;
ptrPump->lastmessagerpm = 3;
ptrPump->timer = SetTimeOut();
ptrPump->timer_message = SetTimeOut();
ptrPump->timer_send = SetTimeOut();
ptrPump->compare_time = 100;
ptrPump->rpm_cnt = 0;
ptrPump->rpm_sum = 0;
ptrPump->pressure_cnt = 0;
ptrPump->pressure_sum = 0;
for(i=0; i<PRESSURE_SIZE;i++) {
ptrPump->pressure_data[i] = 0;
}
for(i=0; i<RPM_SIZE;i++) {
ptrPump->rpm_data[i] = 0;
}
if(num == 0) {
if(SetPressure[num] != 0)
setbit(ptrPump->status,bit_enable);
ptrPump->set_pressure = (uint16_t)(Offset[num] - (SensitivityXGain*SetPressure[num]*ADCwidth)/Uref);
} else {
ptrPump->set_pressure = (uint16_t)(Offset[num] + (SensitivityXGain*SetPressure[num]*ADCwidth)/Uref);
}
pid_Init(PID_Coeff[num][0],PID_Coeff[num][1],PID_Coeff[num][2],&PID[num]);
ptrPump->channel = num;
}
Привожу также содержание *.icf файла
Код
define symbol __ICFEDIT_intvec_start__ = 0x08000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x080053FF; // Max 0x0801FFFF
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20004FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x500;
define symbol __ICFEDIT_size_heap__ = 0x300;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define region Flash_region = mem:[from 0x08005400 to 0x080057FF];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite };
do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK, block HEAP };
place at start of RAM_region { readwrite section TARGET };
place at end of ROM_region { readonly section .checksum };
place in Flash_region { readonly section FLASH };
place at start of Flash_region { readonly section FLASH2 };
Итак, при уровне оптимизации low, все работает:
CODE
\ In section .text, align 4, keep-with-next
434 void InitPump(uint8_t num)
435 {
\ InitPump:
\ 00000000 70B5 PUSH {R4-R6,LR}
\ 00000002 0400 MOVS R4,R0
436 struct Pump_struct *ptrPump;
437 uint32_t i;
438 ptrPump = &Pump[num];
\ 00000004 E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 00000006 C020 MOVS R0,#+192
\ 00000008 .... LDR.N R1,??DataTable8 ;; Pump
\ 0000000A 04FB0015 MLA R5,R4,R0,R1
439 ptrPump->status = 0;
\ 0000000E 0020 MOVS R0,#+0
\ 00000010 A880 STRH R0,[R5, #+4]
440 ptrPump->sourceid = 0;
\ 00000012 0020 MOVS R0,#+0
\ 00000014 6880 STRH R0,[R5, #+2]
441 ptrPump->rpm = 0;
\ 00000016 0020 MOVS R0,#+0
\ 00000018 E880 STRH R0,[R5, #+6]
450 ptrPump->measure = 0;
\ 0000001A 0020 MOVS R0,#+0
\ 0000001C 6881 STRH R0,[R5, #+10]
451 ptrPump->pressure = 0;
\ 0000001E 0020 MOVS R0,#+0
\ 00000020 E860 STR R0,[R5, #+12]
452 ptrPump->thresoldpressure = HysteresisPressure[num];
\ 00000022 E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 00000024 .... LDR.N R0,??DataTable9 ;; HysteresisPressure
\ 00000026 50F82400 LDR R0,[R0, R4, LSL #+2]
\ 0000002A 2861 STR R0,[R5, #+16]
453 ptrPump->lowthresoldrpm = ThresoldRpm[num][0];
\ 0000002C E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 0000002E 5048 LDR.N R0,??InitPump_0 ;; ThresoldRpm
\ 00000030 50F83400 LDR R0,[R0, R4, LSL #+3]
\ 00000034 A882 STRH R0,[R5, #+20]
454 ptrPump->highthresoldrpm = ThresoldRpm[num][1];
\ 00000036 E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 00000038 4D48 LDR.N R0,??InitPump_0 ;; ThresoldRpm
\ 0000003A 10EBC400 ADDS R0,R0,R4, LSL #+3
\ 0000003E 4068 LDR R0,[R0, #+4]
\ 00000040 E882 STRH R0,[R5, #+22]
455 ptrPump->tx_pressure = TxPressure[num];
\ 00000042 E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 00000044 .... LDR.N R0,??DataTable10 ;; TxPressure
\ 00000046 50F82400 LDR R0,[R0, R4, LSL #+2]
\ 0000004A 2883 STRH R0,[R5, #+24]
456 ptrPump->tx_rpm = TxRpm[num];
\ 0000004C E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 0000004E .... LDR.N R0,??DataTable11 ;; TxRpm
\ 00000050 50F82400 LDR R0,[R0, R4, LSL #+2]
\ 00000054 6883 STRH R0,[R5, #+26]
457 ptrPump->lastmessagepressure = 0;
\ 00000056 0020 MOVS R0,#+0
\ 00000058 A883 STRH R0,[R5, #+28]
458 ptrPump->lastmessagerpm = 3;
\ 0000005A 0320 MOVS R0,#+3
\ 0000005C E883 STRH R0,[R5, #+30]
459 ptrPump->timer = SetTimeOut();
\ 0000005E ........ BL SetTimeOut
\ 00000062 2862 STR R0,[R5, #+32]
460 ptrPump->timer_message = SetTimeOut();
\ 00000064 ........ BL SetTimeOut
\ 00000068 6862 STR R0,[R5, #+36]
461 ptrPump->timer_send = SetTimeOut();
\ 0000006A ........ BL SetTimeOut
\ 0000006E A862 STR R0,[R5, #+40]
462 ptrPump->compare_time = 100;
\ 00000070 6420 MOVS R0,#+100
\ 00000072 E862 STR R0,[R5, #+44]
463 ptrPump->rpm_cnt = 0;
\ 00000074 0020 MOVS R0,#+0
\ 00000076 85F8BC00 STRB R0,[R5, #+188]
464 ptrPump->rpm_sum = 0;
\ 0000007A 0020 MOVS R0,#+0
\ 0000007C A867 STR R0,[R5, #+120]
465 ptrPump->pressure_cnt = 0;
\ 0000007E 0020 MOVS R0,#+0
\ 00000080 85F87000 STRB R0,[R5, #+112]
466 ptrPump->pressure_sum = 0;
\ 00000084 0020 MOVS R0,#+0
\ 00000086 6867 STR R0,[R5, #+116]
467 for(i=0; i<PRESSURE_SIZE;i++) {
\ 00000088 0020 MOVS R0,#+0
\ 0000008A 04E0 B.N ??InitPump_1
468 ptrPump->pressure_data[i] = 0;
\ ??InitPump_2:
\ 0000008C 15EB4001 ADDS R1,R5,R0, LSL #+1
\ 00000090 0022 MOVS R2,#+0
\ 00000092 0A86 STRH R2,[R1, #+48]
469 }
\ 00000094 401C ADDS R0,R0,#+1
\ ??InitPump_1:
\ 00000096 2028 CMP R0,#+32
\ 00000098 F8D3 BCC.N ??InitPump_2
470 for(i=0; i<RPM_SIZE;i++) {
\ 0000009A 0020 MOVS R0,#+0
\ 0000009C 05E0 B.N ??InitPump_3
471 ptrPump->rpm_data[i] = 0;
\ ??InitPump_4:
\ 0000009E 15EB4001 ADDS R1,R5,R0, LSL #+1
\ 000000A2 0022 MOVS R2,#+0
\ 000000A4 A1F87C20 STRH R2,[R1, #+124]
472 }
\ 000000A8 401C ADDS R0,R0,#+1
\ ??InitPump_3:
\ 000000AA 2028 CMP R0,#+32
\ 000000AC F7D3 BCC.N ??InitPump_4
473 if(num == 0) {
\ 000000AE E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 000000B0 002C CMP R4,#+0
\ 000000B2 27D1 BNE.N ??InitPump_5
474 if(SetPressure[num] != 0)
\ 000000B4 E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 000000B6 .... LDR.N R0,??DataTable19 ;; SetPressure
\ 000000B8 50F82400 LDR R0,[R0, R4, LSL #+2]
\ 000000BC 0021 MOVS R1,#+0
\ 000000BE ........ BL __aeabi_cfcmpeq
\ 000000C2 03D0 BEQ.N ??InitPump_6
475 setbit(ptrPump->status,bit_enable);
\ 000000C4 A888 LDRH R0,[R5, #+4]
\ 000000C6 50F00200 ORRS R0,R0,#0x2
\ 000000CA A880 STRH R0,[R5, #+4]
476 ptrPump->set_pressure = (uint16_t)(Offset[num] - (SensitivityXGain*SetPressure[num]*ADCwidth)/Uref);
\ ??InitPump_6:
\ 000000CC E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 000000CE .... LDR.N R0,??DataTable18 ;; Offset
\ 000000D0 50F82400 LDR R0,[R0, R4, LSL #+2]
\ 000000D4 ........ BL __aeabi_ui2f
\ 000000D8 0600 MOVS R6,R0
\ 000000DA E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 000000DC .... LDR.N R0,??DataTable19 ;; SetPressure
\ 000000DE 50F82410 LDR R1,[R0, R4, LSL #+2]
\ 000000E2 .... LDR.N R0,??DataTable20 ;; 0x41c9999a
\ 000000E4 ........ BL __aeabi_fmul
\ 000000E8 .... LDR.N R1,??DataTable21 ;; 0x457ff000
\ 000000EA ........ BL __aeabi_fmul
\ 000000EE .... LDR.N R1,??DataTable22 ;; 0x454e4000
\ 000000F0 ........ BL __aeabi_fdiv
\ 000000F4 0100 MOVS R1,R0
\ 000000F6 3000 MOVS R0,R6
\ 000000F8 ........ BL __aeabi_fsub
\ 000000FC ........ BL __aeabi_f2iz
\ 00000100 2881 STRH R0,[R5, #+8]
\ 00000102 19E0 B.N ??InitPump_7
477 } else {
478 ptrPump->set_pressure = (uint16_t)(Offset[num] + (SensitivityXGain*SetPressure[num]*ADCwidth)/Uref);
\ ??InitPump_5:
\ 00000104 E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 00000106 .... LDR.N R0,??DataTable18 ;; Offset
\ 00000108 50F82400 LDR R0,[R0, R4, LSL #+2]
\ 0000010C ........ BL __aeabi_ui2f
\ 00000110 0600 MOVS R6,R0
\ 00000112 E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 00000114 .... LDR.N R0,??DataTable19 ;; SetPressure
\ 00000116 50F82410 LDR R1,[R0, R4, LSL #+2]
\ 0000011A .... LDR.N R0,??DataTable20 ;; 0x41c9999a
\ 0000011C ........ BL __aeabi_fmul
\ 00000120 .... LDR.N R1,??DataTable21 ;; 0x457ff000
\ 00000122 ........ BL __aeabi_fmul
\ 00000126 .... LDR.N R1,??DataTable22 ;; 0x454e4000
\ 00000128 ........ BL __aeabi_fdiv
\ 0000012C 3100 MOVS R1,R6
\ 0000012E ........ BL __aeabi_fadd
\ 00000132 ........ BL __aeabi_f2iz
\ 00000136 2881 STRH R0,[R5, #+8]
479 }
480 pid_Init(PID_Coeff[num][0],PID_Coeff[num][1],PID_Coeff[num][2],&PID[num]);
\ ??InitPump_7:
\ 00000138 E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 0000013A 1C20 MOVS R0,#+28
\ 0000013C .... LDR.N R1,??DataTable23 ;; PID
\ 0000013E 04FB0013 MLA R3,R4,R0,R1
\ 00000142 E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 00000144 0C20 MOVS R0,#+12
\ 00000146 .... LDR.N R1,??DataTable26 ;; PID_Coeff
\ 00000148 04FB0010 MLA R0,R4,R0,R1
\ 0000014C 8268 LDR R2,[R0, #+8]
\ 0000014E E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 00000150 0C20 MOVS R0,#+12
\ 00000152 .... LDR.N R1,??DataTable26 ;; PID_Coeff
\ 00000154 04FB0010 MLA R0,R4,R0,R1
\ 00000158 4168 LDR R1,[R0, #+4]
\ 0000015A E4B2 UXTB R4,R4 ;; ZeroExt R4,R4,#+24,#+24
\ 0000015C 0C20 MOVS R0,#+12
\ 0000015E .... LDR.N R6,??DataTable26 ;; PID_Coeff
\ 00000160 04FB0060 MLA R0,R4,R0,R6
\ 00000164 0068 LDR R0,[R0, #+0]
\ 00000166 ........ BL pid_Init
481 ptrPump->channel = num;
\ 0000016A 2C70 STRB R4,[R5, #+0]
482
483 }
\ 0000016C 70BD POP {R4-R6,PC} ;; return
\ 0000016E 00BF Nop
\ ??InitPump_0:
\ 00000170 ........ DC32 ThresoldRpm
484
При уровне medium "исчезла" проверка условия
Код
if(SetPressure[num] != 0)
setbit(ptrPump->status,bit_enable);
В листинге не вижу, чтобы проверялось это условие.
CODE
\ In section .text, align 2, keep-with-next
435 void InitPump(uint8_t num)
436 {
\ InitPump:
\ 00000000 2DE9F843 PUSH {R3-R9,LR}
\ 00000004 8046 MOV R8,R0
437 struct Pump_struct *ptrPump;
438 uint32_t i;
439 ptrPump = &Pump[num];
\ 00000006 4746 MOV R7,R8
\ 00000008 C020 MOVS R0,#+192
\ 0000000A .... LDR.N R1,??DataTable7 ;; Filter
\ 0000000C 07FB0010 MLA R0,R7,R0,R1
\ 00000010 00F58864 ADD R4,R0,#+1088
440 ptrPump->status = 0;
\ 00000014 0020 MOVS R0,#+0
\ 00000016 A080 STRH R0,[R4, #+4]
441 ptrPump->sourceid = 0;
\ 00000018 6080 STRH R0,[R4, #+2]
442 ptrPump->rpm = 0;
\ 0000001A E080 STRH R0,[R4, #+6]
443 // set_pressure = ((Uoff + Gain*S*P)*4095)/Uref;
444 // set_pressure - значение установленного давления в единицах АЦП;
445 // Uoff - напряжение смещения в мВ.
446 // Gain - коэффициент усиления дифф. усилителя 21.
447 // S - чувствительность датчика, мB/кПа;
448 // P - значение давление в кПа;
449 // Uref - напряжение смещения на АЦП, мВ.
450 // ptrPump->set_pressure = (uint16_t)(((Offset[num]+(float)1.2*fabs(SetPressure[num]))*4095)/3300);
451 ptrPump->measure = 0;
\ 0000001C 6081 STRH R0,[R4, #+10]
452 ptrPump->pressure = 0;
\ 0000001E E060 STR R0,[R4, #+12]
453 ptrPump->thresoldpressure = HysteresisPressure[num];
\ 00000020 .... LDR.N R5,??DataTable8 ;; PID_Coeff
\ 00000022 05EB8706 ADD R6,R5,R7, LSL #+2
\ 00000026 306E LDR R0,[R6, #+96]
\ 00000028 2061 STR R0,[R4, #+16]
454 ptrPump->lowthresoldrpm = ThresoldRpm[num][0];
\ 0000002A 05EBC700 ADD R0,R5,R7, LSL #+3
\ 0000002E 8169 LDR R1,[R0, #+24]
\ 00000030 A182 STRH R1,[R4, #+20]
455 ptrPump->highthresoldrpm = ThresoldRpm[num][1];
\ 00000032 C069 LDR R0,[R0, #+28]
\ 00000034 E082 STRH R0,[R4, #+22]
456 ptrPump->tx_pressure = TxPressure[num];
\ 00000036 306F LDR R0,[R6, #+112]
\ 00000038 2083 STRH R0,[R4, #+24]
457 ptrPump->tx_rpm = TxRpm[num];
\ 0000003A B06E LDR R0,[R6, #+104]
\ 0000003C 6083 STRH R0,[R4, #+26]
458 ptrPump->lastmessagepressure = 0;
\ 0000003E 0020 MOVS R0,#+0
\ 00000040 A083 STRH R0,[R4, #+28]
459 ptrPump->lastmessagerpm = 3;
\ 00000042 0320 MOVS R0,#+3
\ 00000044 E083 STRH R0,[R4, #+30]
460 ptrPump->timer = SetTimeOut();
\ 00000046 ........ BL SetTimeOut
\ 0000004A 2062 STR R0,[R4, #+32]
461 ptrPump->timer_message = SetTimeOut();
\ 0000004C ........ BL SetTimeOut
\ 00000050 6062 STR R0,[R4, #+36]
462 ptrPump->timer_send = SetTimeOut();
\ 00000052 ........ BL SetTimeOut
\ 00000056 A062 STR R0,[R4, #+40]
463 ptrPump->compare_time = 100;
\ 00000058 6420 MOVS R0,#+100
\ 0000005A E062 STR R0,[R4, #+44]
464 ptrPump->rpm_cnt = 0;
\ 0000005C 0020 MOVS R0,#+0
\ 0000005E 84F8BC00 STRB R0,[R4, #+188]
465 ptrPump->rpm_sum = 0;
\ 00000062 04F17000 ADD R0,R4,#+112
\ 00000066 0021 MOVS R1,#+0
\ 00000068 8160 STR R1,[R0, #+8]
466 ptrPump->pressure_cnt = 0;
\ 0000006A 84F87010 STRB R1,[R4, #+112]
467 ptrPump->pressure_sum = 0;
\ 0000006E 4160 STR R1,[R0, #+4]
468 for(i=0; i<PRESSURE_SIZE;i++) {
\ 00000070 0846 MOV R0,R1
\ 00000072 0246 MOV R2,R0
\ 00000074 03E0 B.N ??InitPump_0
469 ptrPump->pressure_data[i] = 0;
\ ??InitPump_1:
\ 00000076 04EB4001 ADD R1,R4,R0, LSL #+1
\ 0000007A 0A86 STRH R2,[R1, #+48]
470 }
\ 0000007C 401C ADDS R0,R0,#+1
\ ??InitPump_0:
\ 0000007E 2028 CMP R0,#+32
\ 00000080 F9D3 BCC.N ??InitPump_1
471 for(i=0; i<RPM_SIZE;i++) {
\ 00000082 1046 MOV R0,R2
\ 00000084 04E0 B.N ??InitPump_2
472 ptrPump->rpm_data[i] = 0;
\ ??InitPump_3:
\ 00000086 04EB4001 ADD R1,R4,R0, LSL #+1
\ 0000008A A1F87C20 STRH R2,[R1, #+124]
473 }
\ 0000008E 401C ADDS R0,R0,#+1
\ ??InitPump_2:
\ 00000090 2028 CMP R0,#+32
\ 00000092 F8D3 BCC.N ??InitPump_3
474 if(num == 0) {
\ 00000094 B8F1000F CMP R8,#+0
\ 00000098 03D1 BNE.N ??InitPump_4
475 if(SetPressure[num] != 0) // ??? Нет проверки!
476 setbit(ptrPump->status,bit_enable);
477 ptrPump->set_pressure = (uint16_t)(Offset[num] - (SensitivityXGain*SetPressure[num]*ADCwidth)/Uref);
\ 0000009A 40F26F30 MOVW R0,#+879
\ 0000009E 2081 STRH R0,[R4, #+8]
\ 000000A0 13E0 B.N ??InitPump_5
478 } else {
479 ptrPump->set_pressure = (uint16_t)(Offset[num] + (SensitivityXGain*SetPressure[num]*ADCwidth)/Uref);
\ ??InitPump_4:
\ 000000A2 B06D LDR R0,[R6, #+88]
\ 000000A4 ........ BL __aeabi_ui2f
\ 000000A8 8146 MOV R9,R0
\ 000000AA 316D LDR R1,[R6, #+80]
\ 000000AC .... LDR.N R0,??DataTable9 ;; 0x41c9999a
\ 000000AE ........ BL __aeabi_fmul
\ 000000B2 .... LDR.N R1,??DataTable10 ;; 0x457ff000
\ 000000B4 ........ BL __aeabi_fmul
\ 000000B8 .... LDR.N R1,??DataTable11 ;; 0x454e4000
\ 000000BA ........ BL __aeabi_fdiv
\ 000000BE 4946 MOV R1,R9
\ 000000C0 ........ BL __aeabi_fadd
\ 000000C4 ........ BL __aeabi_f2iz
\ 000000C8 2081 STRH R0,[R4, #+8]
480 }
481 pid_Init(PID_Coeff[num][0],PID_Coeff[num][1],PID_Coeff[num][2],&PID[num]);
\ ??InitPump_5:
\ 000000CA 0C20 MOVS R0,#+12
\ 000000CC 7843 MULS R0,R7,R0
\ 000000CE 4119 ADDS R1,R0,R5
\ 000000D0 1C22 MOVS R2,#+28
\ 000000D2 .... LDR.N R3,??DataTable12 ;; Can_Tx
\ 000000D4 07FB0232 MLA R2,R7,R2,R3
\ 000000D8 02F17C03 ADD R3,R2,#+124
\ 000000DC 8A68 LDR R2,[R1, #+8]
\ 000000DE 4968 LDR R1,[R1, #+4]
\ 000000E0 4059 LDR R0,[R0, R5]
\ 000000E2 ........ BL pid_Init
482 ptrPump->channel = num;
\ 000000E6 84F80080 STRB R8,[R4, #+0]
483
484 }
\ 000000EA BDE8F183 POP {R0,R4-R9,PC} ;; return
485
Возможно, что я некорректно написал код, но найти не могу, что именно неправильно.