avr的应用程序启动我都做了啥(head.S)

由于我们的firmware不希望用到C库,所以链接器脚本和c-runtime都需要自己写,其实也没写,无非就是把C库的拿来改了几行。这没什么好说的,就把avr c-runtime主要做了写啥记录记录:

 

1. 设置中断向量表(vector),这在datasheet中是有定义的,每款芯片不同,向量个数亦不同,为了做到通用,这里定义了100+的向量,实际上,单独芯片通过定义_VECTORS_SIZE来控制最终有多少个向量;

 

2. 默认中断处理函数,在用户没有注册中断处理函数时,则指向默认的处理函数,这里默认的处理就是RESET;

 

3. 初始化一些寄存器,如清零;

 

4. 初始化.data段,从FLASH拷贝数据到RAM;

  4.1 堆的初始化,我们程序没用到,不做;

  4.2 栈地址设置(可以由外部传入);

 

5. 初始化.bss段,清零;这是libgcc的功能,直接把一个用avr-libc编译的程序反汇编,抄了__do_clear_bss等几个调用,完成后跳转到main();

 

6. 跳转到main(),实际上5完成就跳了,这里就不需要了。

 

avr刚接触几天,细节没有看过,很多东西没有理解,能脱离C库,编译、运行算是第一步成功了,记录着。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值