Arm IAR工作台向量表臂CortexM4
我正在使用IAR IDE(v7.71)在ARM CORTEX M4处理器上开发固件 在IAR workbench中创建项目时,启动代码和向量表位于程序集文件中。但我想把向量表从.S文件改为.C文件 在现有项目中,.s文件中的矢量表如下:Arm IAR工作台向量表臂CortexM4,arm,iar,cortex-m,Arm,Iar,Cortex M,我正在使用IAR IDE(v7.71)在ARM CORTEX M4处理器上开发固件 在IAR workbench中创建项目时,启动代码和向量表位于程序集文件中。但我想把向量表从.S文件改为.C文件 在现有项目中,.s文件中的矢量表如下: SECTION CSTACK:DATA:NOROOT(3) SECTION .intvec:CODE:NOROOT(2) EXTERN __iar_program_start PUBLIC
SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:NOROOT(2)
EXTERN __iar_program_start
PUBLIC __vector_table
DATA
__iar_init$$done: ; The vector table is not needed
; until after copy initialization is done
__vector_table
DCD sfe(CSTACK)
DCD __iar_program_start
DCD NMI_Handler
DCD HardFault_Handler
DCD MemManage_Handler
DCD BusFault_Handler
DCD UsageFault_Handler
DCD 0
DCD 0
DCD 0
DCD 0
DCD SVC_Handler
DCD DebugMon_Handler
DCD 0
DCD PendSV_Handler
DCD SysTick_Handler
; External Interrupts
DCD user_interrupt_Handler
此字段替换为带有向量表的cfile,如下所示:
typedef void (* exc_ptr_t)(void);
#pragma section = "CSTACK"
#pragma location = ".intvec"
__root exc_ptr_t user_vect_table[25] =
{
(exc_ptr_t)__sfe("CSTACK"),
__iar_program_start,
NMI_Handler,
HardFault_Handler,
MemManage_Handler,
BusFault_Handler,
UsageFault_Handler,
(exc_ptr_t)0xFFFFFFFF,
(exc_ptr_t)0xFFFFFFFF,
(exc_ptr_t)0xFFFFFFFF,
(exc_ptr_t)0xFFFFFFFF,
SVC_Handler,
DebugMon_Handler,
(exc_ptr_t)0xFFFFFFFF,
PendSV_Handler,
SysTick_Handler,
user_interrupt_Handler
};
在c文件中,下面的语句给出了编译错误,即表达式必须是常量值
(exc_ptr_t)__sfe(“CSTACK”)
如何在向量表中分配CSTACK?这样做的正确方法是什么?
在.icf文件中,CSTACK块声明为对齐8,大小为0x1000。查看我自己的启动文件(对于v5.50),主要区别在于我在文件顶部有
#pragma language=extended
,数组元素实际上是函数指针和void指针的并集:并集{void(*fun)(void);void*ptr;}
和CSTACK被分配给void指针:{.ptr=\u sfe(“CSTACK”)},
。我不确定这是否有什么区别(应该没有)。谁是您的Cortex-M4的供应商?人们可能会想知道,为什么您要尝试在C中实现一个向量表,并确保它构建正确,并链接到正确的位置,而这在汇编中是如此微不足道。CSTACK从何而来?链接器脚本?你能不能把它设为这个设备的最高内存?0x2000000或您拥有的任何数量的ram?使用gnu工具,您可以只拉入在链接器脚本中创建的变量,您不能在IAR中这样做吗?