- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
AVR-GCC里定义的API
AVR-GCC里定义的API
嵌入式编程的代码可以简单地分为两部分,一是与硬件无关的算法部分,对其编程与普通C编程没有区别;二是与硬件相关的寄存器/端口操作部分。不同的MCU实现方法各有不同。在AVR-GCC里则通过一系列的API来解决。当然,用户也可以定义自己的API。在此简单地介绍目前AVR-GCC里定义的API,以及AVR-GCC的工作过程。
一.应用程序启动过程(Start Up)
标准库文件包含一个启动模块(Start Up Module),用于为真正执行用户程序做环境设置。
启动模块完成的任务如下:
1. 提供缺省向量表
2. 提供缺省中断程序入口
3. 初始化全局变量
4. 初始化看门狗
5. 初始化寄存器MCUCR
6. 初始化数据段
7. 将数据段.bss的内容清零
8. 跳转到main()。(不用调用方式,因为main()不用返回)
启动模块包含缺省中断向量表,其内容为预先定义好的函数名称。这些函数名称可以由程序员重载。中断向量表的第一个内容为复位向量,执行结果是将程序跳转到_init_。在启动模块里,_init_表示的地址与_real_init_指向的地址相同。如果要加入客户代码,则需要在程序里定义一个_init_函数。在此函数的末尾跳转到_real_init_。具体实现如下:
void _real_init_(void);
void _init_(void) __attribute__((naked));
void _init_(void)
{
// 用户代码
// 最后的代码必须为:
asm (rjmp _real_init_);
}
在_real_init_部分,系统将设置看门狗和MCUCR寄存器。启动模块并没有真正取用相应寄存器的设置数值(以符号_init_wdctr_,_init_mcucr_,_init_emcucr_表示),而是通过地址来取得其值。因而用户可以通过链接器的--defsym选项来设置这些符号的地址。如果用户没有定义,则启动模块将使用缺省值。
接下来系统将从程序存储器里把具有初值的全局变量加载到数据存储器SRAM。然后是将数据段.bbs清零。此数据段包含所有没有的初值的非AUTO变量。
最后,系统跳转到main()函数,用户代码开始执行。系统对此特殊函数加入一些特殊的处理。进入此函数后,堆栈指向SRAM的末尾。
二.存储器API
AVR具有三种存储器:FLASH,SRAM和EEPROM。AVR-GCC将程序代码放在FLASH,数据放在SRAM。
I.程序存储器
如果要将数据(如常量,字符串,等等)放在FLASH里,用户需要指明数据类型__attribute__((progmem))。为了方便使用,AVR-GCC定义了一些更直观的符号,如下表所示。
类型 定义
prog_void void __attribute__((progmem))
prog_char char __attribute__((progmem))
prog_int int __attribute__((progmem))
prog_long long __attribute__((progmem))
prog_long_long long long __attribute__((progmem))
PGM_P prog_char const*
PGM_VOID_P prog_void const*
提供的库函数有:
1.__elpm_inline
用法:uint8_t __elpm_inline(uint32_t addr);
说明:执行ELPM指令从FLASH里取数。参数为32位地址,返回一个8位数据。
2.__lpm_inline
用法:uint8_t __elpm_inline(uint16_t addr);
说明:执行LPM指令从FLASH里取数。参数为16位地址,返回一个8位数据。
3.memcpy_P
用法:void* memcpy_P(void* dst, PGM_VOID_P src, size_t n);
说明:memcpy的特殊版本。完成从FLASH取n个字节的任务。
4.PRG_RDB
用法:uint8_t PGR_RDB(uint16_t addr);
说明:此函数简单地调用__lpm_inline
5.PSTR
用法:PSTR(s);
说明:参数为字符串。功能是将其放在FLASH里并返回地址。
6.strcmp_P
用法:int strcmp(char const*, PGM_P);
说明:功能与strcmp()类似。第二个参数指向程序存储器内的字符串。
7.strcpy_P
用法:char* strcpy_P(char
文档评论(0)