单片机学习小组
直播中

李林

7年用户 1207经验值
私信 关注

D语言编写单片机应用需要用到的技巧是什么?

D语言编写单片机应用需要用到的技巧是什么?

回帖(1)

李造吉

2022-1-25 11:10:21
入口函数
单片机一定会需要一个主入口函数,至于是那个主要看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中标记的特定位置
举报

更多回帖

发帖
×
20
完善资料,
赚取积分