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

来源:互联网 发布:数据类型 js 编辑:程序博客网 时间:2024/04/30 09:50

由于我们的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库,编译、运行算是第一步成功了,记录着。

原创粉丝点击