入口函数
单片机一定会需要一个主入口函数,至于是那个主要看linker script中的定义,并不一定是你看到的main函数(多数情况下也不会是它),cortex-m框架基本会从FLASH:0x08000000位置读取一个向量表Vectors (可参考的一份文章),mcu会从Reset_Handler开始执行代码,具体实现需要参考linker script中的定义,我的做法是在linker script增加定义
MEMORY
{
FLASH (RX) : ORIGIN = 0x08000000, LENGTH = 256K
SRAM (WXAR) : ORIGIN = 0x20000000, LENGTH = 64K
}
SECTIONS
{
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector))
. = ALIGN(4);
} > FLASH
...
...
...
}
D代码
alias VectorFunc = immutable(void *);
static import ldc.attributes;
static import ldc.llvmasm;
enum isr_vector = ldc.attributes.section(".isr_vector");
enum naked = ldc.attributes.naked
extern(C) extern __gshared void* _estack;
immutable VectorFunc[0x65] CortexM_IVT = [
cast(VectorFunc)&_estack,
&Reset_Handler,
];
extern(C) void Reset_Handler() @naked
{
// 初始化SP
ldc.llvmasm.__asm("ldr sp,=_estack","");
/*
这里缺少一些必要的初始化,分别是
TLS初始化
bss初始化
data初始化
静态构造函数
*/
// 主循环体
mloop();
/*
因异常状态跳出后应清理现场
执行静态析构函数
*/
//维持错误状态下循环,不在引发意外操作
while(1){
}
}
__gshared bool active = true;
void mloop()
{
// 程序主线位置
while(active)
{
}
}
程序中的向量定义由CortexM_IVT 定义,主入口是由Reset_Handler实现,
其中isr_vector 指定了section(".isr_vector"),他会存储在linker script中标记的特定位置
入口函数
单片机一定会需要一个主入口函数,至于是那个主要看linker script中的定义,并不一定是你看到的main函数(多数情况下也不会是它),cortex-m框架基本会从FLASH:0x08000000位置读取一个向量表Vectors (可参考的一份文章),mcu会从Reset_Handler开始执行代码,具体实现需要参考linker script中的定义,我的做法是在linker script增加定义
MEMORY
{
FLASH (RX) : ORIGIN = 0x08000000, LENGTH = 256K
SRAM (WXAR) : ORIGIN = 0x20000000, LENGTH = 64K
}
SECTIONS
{
.isr_vector :
{
. = ALIGN(4);
KEEP(*(.isr_vector))
. = ALIGN(4);
} > FLASH
...
...
...
}
D代码
alias VectorFunc = immutable(void *);
static import ldc.attributes;
static import ldc.llvmasm;
enum isr_vector = ldc.attributes.section(".isr_vector");
enum naked = ldc.attributes.naked
extern(C) extern __gshared void* _estack;
immutable VectorFunc[0x65] CortexM_IVT = [
cast(VectorFunc)&_estack,
&Reset_Handler,
];
extern(C) void Reset_Handler() @naked
{
// 初始化SP
ldc.llvmasm.__asm("ldr sp,=_estack","");
/*
这里缺少一些必要的初始化,分别是
TLS初始化
bss初始化
data初始化
静态构造函数
*/
// 主循环体
mloop();
/*
因异常状态跳出后应清理现场
执行静态析构函数
*/
//维持错误状态下循环,不在引发意外操作
while(1){
}
}
__gshared bool active = true;
void mloop()
{
// 程序主线位置
while(active)
{
}
}
程序中的向量定义由CortexM_IVT 定义,主入口是由Reset_Handler实现,
其中isr_vector 指定了section(".isr_vector"),他会存储在linker script中标记的特定位置
举报