微控制器是否有C标准?

微控制器是否有C标准?,c,embedded,standards,microcontroller,C,Embedded,Standards,Microcontroller,微控制器是否有特殊的C标准 我这样问是因为到目前为止,当我在Windows操作系统下编程时,我使用的编译器并不重要。如果我有一个编译器,我知道我能用它做什么 但最近我开始用C语言为微控制器编程,我很震惊,即使它的基础仍然是C语言,比如循环、变量创建等等,我在桌面计算机的C语言中从未见过一些语法类型。而且,语法在版本之间不断变化。我使用AVR-GCC编译器,在以前的版本中,您对端口I/O使用了函数,现在您可以像在新版本中处理变量一样处理端口 什么定义了什么函数,以及如何将它们实现到编译器中,并且仍

微控制器是否有特殊的C标准

我这样问是因为到目前为止,当我在Windows操作系统下编程时,我使用的编译器并不重要。如果我有一个编译器,我知道我能用它做什么

但最近我开始用C语言为微控制器编程,我很震惊,即使它的基础仍然是C语言,比如循环、变量创建等等,我在桌面计算机的C语言中从未见过一些语法类型。而且,语法在版本之间不断变化。我使用AVR-GCC编译器,在以前的版本中,您对端口I/O使用了函数,现在您可以像在新版本中处理变量一样处理端口


什么定义了什么函数,以及如何将它们实现到编译器中,并且仍然将其称为C?

嵌入式系统很奇怪,有时会出现“标准”C的例外情况

从一个系统到另一个系统,您将有不同的方法来执行诸如声明中断、定义内存不同段中的变量、运行“intrinsic”(直接映射到汇编代码的伪函数)或执行内联汇编代码等操作

但是控制流(for/if/while/switch/case)以及变量和函数声明的基础应该是完全相同的

在以前的版本中,您将函数用于端口I/O,现在您可以在新版本中处理类似端口的变量


这不是C语言的一部分;这是设备支持库的一部分。这是每个制造商都必须记录的。

绝大多数标准C语言都是微控制器通用的。中断确实倾向于有稍微不同的约定,尽管并不总是如此


将端口视为变量是由于寄存器映射到大多数微控制器内存中的位置,因此通过写入适当的内存位置(定义为内存中具有预设位置的变量),可以在该端口上设置值。

正如前面的撰稿人所说,没有这样的标准,主要是由于不同的架构

话虽如此,(卖方)被描述为“具有实时扩展的C”。据我所知,编译器只针对Rabbit处理器,但还有一些有用的附加关键字(例如,costate、cofunc和waitfor)、一些真正的特性(例如,
#使用mylib.lib而不是
#include mylib.h
,并且没有链接器),以及ANSI C中的一些遗漏(例如,没有文件作用域静态变量)


但它仍然被描述为“C”。

我从未见过微控制器的C编译器没有一些特定于控制器的扩展。有些编译器比其他编译器更接近于符合ANSI标准,但对于许多微控制器来说,在性能和ANSI合规性之间存在权衡

在许多8位微控制器上,甚至在一些16位微控制器上,访问堆栈帧上的变量速度很慢。一些编译器总是在运行时堆栈上分配自动变量,尽管这样做需要额外的代码,但有些编译器会在编译时分配自动变量(允许从不同时活动的变量重叠),有些允许使用命令行选项或
#pragma
指令控制行为。在为此类机器编码时,我有时喜欢
#定义一个名为“auto”的宏,如果它有助于加快工作速度,它将被重新定义为“static”

有些编译器有各种各样的内存存储类。您可以通过声明内容为合适的存储类来大大提高性能。例如,基于的系统可能有96字节的“数据”内存、224字节的“idata”内存(与前96字节重叠)和4K的“扩展数据”内存

  • “数据”存储器中的变量可以直接访问

  • “idata”内存中的变量只能通过将它们的地址加载到一个单字节指针寄存器中来访问。在需要访问它们的情况下,访问它们不会产生额外的开销,因此idata内存对于数组来说是非常好的。如果数组
    q
    存储在idata内存中,则引用
    q[i]
    的速度将与数据内存中的速度一样快,但对
    q[0]
    的引用速度会较慢(在数据内存中,编译器可以预计算地址并在没有指针寄存器的情况下访问地址;在idata内存中这是不可能的)

  • 扩展数据内存中的变量访问速度比其他类型中的变量慢得多,但可用的扩展数据内存要多得多

如果一个人告诉8051编译器在默认情况下将所有内容都放在“数据”中,那么如果一个人的变量总数超过96字节,并且没有指示编译器将任何内容放在其他位置,那么他将“耗尽内存”。如果一个人将所有内容都放在“扩展数据”中默认情况下,可以使用更多的内存而不受限制,但一切都会运行得更慢。最好是将直接访问的常用变量放在“数据”中,将间接访问的常用变量和数组放在“idata”中,将不常用的变量和数组放在“扩展数据”中.

有一种基于C的语言语法。也许你想看看是什么使它如此。

C语言假设一种体系结构(所有代码和数据都有一个地址空间),并非所有体系结构都有这种结构,但大多数桌面/服务器类计算机都有(或至少在操作系统的帮助下存在)。为了避免编写糟糕的程序,C编译器(在链接器的帮助下)通常支持一些扩展,帮助有效地利用多个地址空间。所有这些都可以对程序员隐藏,但它通常会减慢速度并使程序和数据膨胀

至于如何访问设备寄存器——在不同的桌面/服务器类机器上,这也是非常不同的,但由于程序
*(DEVICE_REG_ADDR) |= 1; // Set BIT0 of control register REG
temp_reg = *DEVICE_REG_ADDR;
temp_reg |= 1;
*DEVICE_REG_ADDR = temp_reg;
#define PORTA (*((volatile char*)0x0100))
PORTA = 0xFF;