完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
入口函数
单片机一定会需要一个主入口函数,至于是那个主要看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中标记的特定位置 |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1176浏览 3评论
604浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
597浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2334浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1895浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 18:04 , Processed in 1.163274 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号