ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
19 апреля
1096856 Топик полностью
LightElf (30.04.2021 15:10, просмотров: 332) ответил VVB на -1. Не обобщайте. Невозможно обойтись для ARM7/9/11, Cortex-R, Cortex-A.
При наличии некоторых интринсиков - вполне можно сделать как-то так: 
#pragma language=extended 
#include <intrinsics.h>
#ifndef STACK_SIZE
# define STACK_SIZE 4096
#endif
#ifndef EXCPT_STACK_SIZE
# define EXCPT_STACK_SIZE 64
#endif
static void default_rst(void) @ ".intvec";
static void default_und(void) @ ".intvec";
static void default_svc(void) @ ".intvec";
static void default_prf(void) @ ".intvec";
static void default_abt(void) @ ".intvec";
static void default_rsvd(void) @ ".intvec";
static void default_isr(void) @ ".intvec";
static void default_fiq(void) @ ".intvec";
void __iar_program_start(void);
static unsigned long stack[STACK_SIZE] @ ".noinit";

__root const uint32_t __vector_table[] @ ".intvec" = {
// exception entries
0xe59ff018,
0xe59ff018,
0xe59ff018,
0xe59ff018,
0xe59ff018,
0xe59ff018,
0xe59ff018,
0xe59ff018,
// handlers
(uint32_t)default_rst,
(uint32_t)default_und,
(uint32_t)default_svc,
(uint32_t)default_prf,
(uint32_t)default_abt,
(uint32_t)default_rsvd,
(uint32_t)default_isr,
(uint32_t)default_fiq
};

static void default_rsvd(void) @ ".intvec" { while(1) { } }
static void default_und(void) @ ".intvec" { while(1) { } }
static void default_svc(void) @ ".intvec" { while(1) { } }
static void default_prf(void) @ ".intvec" { while(1) { } }
static void default_abt(void) @ ".intvec" { while(1) { } }
static void default_isr(void) @ ".intvec" { while(1) { } }
static void default_fiq(void) @ ".intvec" { while(1) { } }
// --------------------
// Mode, correspords to bits 0-5 in CPSR
#define MODE_MSK 0x1F // Bit mask for mode bits in CPSR
#define USR_MODE 0x10 // User mode
#define FIQ_MODE 0x11 // Fast Interrupt Request mode
#define IRQ_MODE 0x12 // Interrupt Request mode
#define SVC_MODE 0x13 // Supervisor mode
#define ABT_MODE 0x17 // Abort mode
#define UND_MODE 0x1B // Undefined Instruction mode
#define SYS_MODE 0x1F // System mode

static void default_rst(void) @ ".intvec"
{
__disable_interrupt();
// set FIQ stack
__set_CPSR( (__get_CPSR() & ~MODE_MSK) | FIQ_MODE);
__set_SP(0xFFFFFFF8 & (uint32_t)(stack + EXCPT_STACK_SIZE));
// set IRQ stack
__set_CPSR( (__get_CPSR() & ~MODE_MSK) | IRQ_MODE);
__set_SP(0xFFFFFFF8 & (uint32_t)(stack + EXCPT_STACK_SIZE));
// set SVC stack
__set_CPSR( (__get_CPSR() & ~MODE_MSK) | SVC_MODE);
__set_SP(0xFFFFFFF8 & (uint32_t)(stack + EXCPT_STACK_SIZE));
// set ABT stack
__set_CPSR( (__get_CPSR() & ~MODE_MSK) | ABT_MODE);
__set_SP(0xFFFFFFF8 & (uint32_t)(stack + EXCPT_STACK_SIZE));
// set UND stack
__set_CPSR( (__get_CPSR() & ~MODE_MSK) | UND_MODE);
__set_SP(0xFFFFFFF8 & (uint32_t)(stack + EXCPT_STACK_SIZE));
// set SYS stack
__set_CPSR( (__get_CPSR() & ~MODE_MSK) | SYS_MODE);
__set_SP(0xFFFFFFF8 & (uint32_t)(stack + STACK_SIZE));
__iar_program_start();
}
Не надо делать мне как лучше, оставьте просто хорошо