Цитата
( (void(*)())arg )( (char *)pvalue );
Если цель: вызвать функцию, располагающуюся по адресу arg с параметром pvalue, то я так делаю для MSP. А ARM-е новичек, вот попробовал в таком-же, как у Вас ИАРе, варнингов нет, ероров тоже
Код
режим __arm
22 // Вызов функции по mam_Init или адресу 0x40000000
23 ( (void(*)()) mam_Init )( (char *)23 );
\ 00000008 1700A0E3 MOV R0,#+0x17
\ 0000000C ........ _BLF mam_Init,mam_Init??rA
24 ( (void(*)()) mam_Init )( (char *)a );
\ 00000010 0000A0E3 MOV R0,#+0
\ 00000014 ........ _BLF mam_Init,mam_Init??rA
25
26 ( (void(*)()) 0x40000000 )( (char *)23 );
\ 00000018 1700A0E3 MOV R0,#+0x17
\ 0000001C 4014A0E3 MOV R1,#+0x40000000
\ 00000020 0FE0A0E1 MOV LR,PC
\ 00000024 11FF2FE1 BX R1
27 ( (void(*)()) 0x40000000 )( (char *)a );
\ 00000028 0400A0E1 MOV R0,R4
\ 0000002C 4014A0E3 MOV R1,#+0x40000000
\ 00000030 0FE0A0E1 MOV LR,PC
\ 00000034 11FF2FE1 BX R1
28
29 // Вызов функции по вектору содержащемуся вmam_Init или 0x40000000
30 ( *( void( ** )()) mam_Init )();
\ 00000038 ........ LDR R5,??DataTable1 ;; mam_Init
\ 0000003C 000095E5 LDR R0,[R5, #+0]
\ 00000040 0FE0A0E1 MOV LR,PC
\ 00000044 10FF2FE1 BX R0
31 ( *( void( ** )()) mam_Init )( (char *)a );
\ 00000048 0400A0E1 MOV R0,R4
\ 0000004C 001095E5 LDR R1,[R5, #+0]
\ 00000050 0FE0A0E1 MOV LR,PC
\ 00000054 11FF2FE1 BX R1
32
33 ( *( void( ** )()) 0x40000000 )();
\ 00000058 4004A0E3 MOV R0,#+0x40000000
\ 0000005C 000090E5 LDR R0,[R0, #+0]
\ 00000060 0FE0A0E1 MOV LR,PC
\ 00000064 10FF2FE1 BX R0
34 ( *( void( ** )()) 0x40000000 )( (char *)a );
\ 00000068 0400A0E1 MOV R0,R4
\ 0000006C 4014A0E3 MOV R1,#+0x40000000
\ 00000070 001091E5 LDR R1,[R1, #+0]
\ 00000074 0FE0A0E1 MOV LR,PC
\ 00000078 11FF2FE1 BX R1
35
36
thumb
22 // Вызов функции по mam_Init или адресу 0x40000000
23 ( (void(*)()) mam_Init )( (char *)23 );
\ 00000004 1720 MOV R0,#+0x17
\ 00000006 ........ _BLF mam_Init,mam_Init??rT
24 ( (void(*)()) mam_Init )( (char *)a );
\ 0000000A 0020 MOV R0,#+0
\ 0000000C ........ _BLF mam_Init,mam_Init??rT
25
26 ( (void(*)()) 0x40000000 )( (char *)23 );
\ 00000010 8026 MOV R6,#+0x80
\ 00000012 F605 LSL R6,R6,#+0x17 ;; #+0x40000000
\ 00000014 1720 MOV R0,#+0x17
\ 00000016 ........ BL ??rT_BX_R6
27 ( (void(*)()) 0x40000000 )( (char *)a );
\ 0000001A 281C MOV R0,R5
\ 0000001C ........ BL ??rT_BX_R6
28
29 // Вызов функции по вектору содержащемуся вmam_Init или 0x40000000
30 ( *( void( ** )()) mam_Init )();
\ 00000020 .... LDR R6,??DataTable1 ;; mam_Init
\ 00000022 3068 LDR R0,[R6, #+0]
\ 00000024 ........ BL ??rT_BX_R0
31 ( *( void( ** )()) mam_Init )( (char *)a );
\ 00000028 281C MOV R0,R5
\ 0000002A 3168 LDR R1,[R6, #+0]
\ 0000002C ........ BL ??rT_BX_R1
32
33 ( *( void( ** )()) 0x40000000 )();
\ 00000030 8026 MOV R6,#+0x80
\ 00000032 F605 LSL R6,R6,#+0x17 ;; #+0x40000000
\ 00000034 3068 LDR R0,[R6, #+0]
\ 00000036 ........ BL ??rT_BX_R0
34 ( *( void( ** )()) 0x40000000 )( (char *)a );
\ 0000003A 281C MOV R0,R5
\ 0000003C 3168 LDR R1,[R6, #+0]
\ 0000003E ........ BL ??rT_BX_R1
35