在里面嵌入式C,预定义库在编译程序时起着非常重要的作用,并大大减少了程序的代码大小。但是,优化和输出文件大小在很大程度上取决于编译器。在AVR工作室预定义库非常大,而且非常复杂。为了提供可移植性,在其内部已经做了大量的工作头文件. 有趣的是,AVR的家伙们已经成功地将其嵌入式C(用于AVR控制器)的规则保持在更接近于ANSI C.他们通过定义对于相应的寄存器。这提供了一个将它们用作变量的机会。现在用户可以更好地专注于代码,而不是微控制器的内部硬件配置。现在让我们看看一些重要的头文件。

Avr gcc库

avr/io.h

即使是一行代码也需要这个特定的头文件。它解决了处理寄存器的问题,并提供了将寄存器作为变量处理的方便方法。这使得为它们分配值变得简单。例如,要将数据写入端口B数据方向寄存器,可以使用变量的解甲还乡“。在代码中,可以编写如下表达式:

DDRB=0xff;//0x前缀表示在C中以十六进制格式表示的整数

您可以以类似的方式处理所有其他寄存器。在某些情况下存在一些例外和复杂性。但这些事情超出了本章的范围。我们以后再讨论。

util/delay.h

在许多微控制器程序中,延迟环是必不可少的。此头文件定义2.延迟循环。

_延迟时间(延迟时间)

这是一个基本功能,用于创建'延迟时间微秒。它们通过基本停止和等待延迟循环实现。不允许将变量用作参数,而可以使用预定义的常量。要使用此循环,需要指定CPU工作频率(使用:#定义F#U CPU)。让我向您展示一个示例:

int main()

{#定义F#u CPU 1000000

int延迟=0;

延迟=29;

_延迟(延迟);

//…

}

------–或------

int main()

{#定义F#u CPU 1000000

int延迟=0;

对于(延迟=35;延迟>=0;延迟–)

{u delay_us(延迟);

//…

}

}

这两个准则都将无法得到遵守。但以下代码是有效的:

int main()

{#定义F#u CPU 1000000

_延期支付(29);

//…

}

int main()

{#定义F#u CPU 1000000

#定义延迟35

_延迟(延迟);

//…

}

_延迟时间(延迟时间)

此循环与前面的循环相同。只有一个区别,它以毫秒为单位产生延迟。适用于以下情况的其他事实:_延迟()“,适用于”_延迟_ms()“我也是。

#包括

#包括

int main()

{#定义F#u CPU 1000000

DDRB=0x0f;

端口B=0x05;

而(1)

{u delay_ms(1000);

PORTB~=PORTB;

//…

}

}

avr/interrupt.h

微控制器有几个功能中断源. 他们每个人都有各自的特点中断子程序. 在里面ANSI C,没有中断处理方案。但是对于微控制器来说,中断是一个特别重要的问题!许多程序都非常依赖它!因此,为了帮助用户更容易地实现子程序代码,有一个头文件avr/interrupt.h它定义了下面描述的一些函数和宏。

sei()

此功能通过设置全局中断掩码启用全局中断。

cli()

此功能通过重置全局中断掩码来禁用全局中断。

reti()

通过设置全局中断掩码启用中断。此函数编译为一行汇编代码。

ISR(中断向量)

ISR代表中断子程序。使用此宏,用户可以编写与中断“中断”相关的中断子程序。在宏参数的位置,提供了一些符号。这里,符号以它们所表示的中断向量命名。对于特定的微控制器,某些特定符号是有效的。对于他们,请看AVR GCC参考手册这是AVR工作室提供的。让我们看一个例子:

#包括

#包括

情报、监视和侦察(国际矢量)

{PORTB~=PORTB;}

无效中断(void)

{cli();

GICR=0x40;

MCUCR=0x03;

sei();

}

int main()

{initInterrupt();

DDRB=0xff;

端口B=0x55;

}

stdio.h

这个词是斯特迪奥“代表”标准输入输出“。此库确实减少了代码大小。但是十六进制该文件占用大量空间。它定义了许多与ANSI C具有相同命名法的函数。这些函数与ANSI C版本的函数具有相似的目标。

我将AVR GCC参考手册中的介绍放在原处:

“此文件声明在中实现的标准IO设施avr libc。由于底层硬件的性质,仅实现了标准IO的有限子集。没有实际的文件实现,因此只能执行设备IO。由于没有操作系统,应用程序需要提供有关其设备的足够详细信息,以便使其可由标准IO设施使用s、 由于空间限制,一些功能根本没有实现(如printf已忽略的转换)。然而,应该警告此实现的潜在用户:printf斯坎夫函数族虽然通常与著名的“Hello,world!”程序之类的简单程序相关联,但实际上相当复杂,这导致它们的包含占用了相当多的代码空间。此外,由于在运行时解释格式字符串的性质,它们的速度不快。只要可能,请使用avr libc提供的(有时是非标准的)预定转换设施通常在速度和代码大小方面的成本要低得多。”

字符串.h

头文件的字符串.h'定义一些函数来对字符串进行操作。例如比较、连接两个字符串、复制两个字符串、将一个字符串移动到其他位置等。这些函数使处理字符串更容易。在许多高级编程任务中,这些预定义函数使工作更容易。

数学

如果您选择使用一些数学函数,此头文件将减少所需的工作量sin(),cos(),谭(),exp()还有更多。

stlib.h

它包括一些标准库函数,如出口(),calloc(),malloc(),qsort(){qsort代表快速排序},realloc()和一些不常见的函数()。这些函数应该不会经常使用。但在特殊情况下,它们可能会有所帮助。

评论已关闭。

Baidu