D语言编写单片(STM32F401cc)机应用需要用到的技巧 - 主入口函数

D语言编写单片机应用需要用到的技巧 - 主入口函数

入口函数

单片机一定会需要一个主入口函数,至于是那个主要看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中标记的特定位置.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值