首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么不提供一个托管环境?

为什么不提供一个托管环境?
EN

Stack Overflow用户
提问于 2015-10-21 16:45:19
回答 3查看 121关注 0票数 3

C11标准说:

§5.1.2.2 宿主环境 不需要提供托管环境,但如果存在,则必须符合下列规范。

我对此感到困惑,在没有执行环境的情况下,我如何执行程序?这是否意味着托管环境是不必要的,而独立环境则是必要的呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-21 18:21:00

托管环境和独立环境与实现的区别在于C标准库的存在。语言特性本身对这两种功能都是可用的(除了少数可选特性)。

但是iff环境称为“宿主”,它必须按照标准的要求提供完整的(库)特性。没有半途而废。

为宿主环境编写的C程序可能会出现所有强制性的特性,因此可以使用malloc等。一旦缺少这样的特性,例如动态内存分配,它就不是托管环境,而是独立的环境。这并不意味着后者不能提供一些标准库(或它的一些功能)。实际上,即使是在独立的环境中,也可能存在转换函数。

因此,如果没有可用的标准库,程序如何操作?简单地说:它不使用这些功能。相反,它必须使用自己的功能来访问底层硬件或专门的非标准库。如果你没有车,你必须步行,骑自行车或者自己造一辆车。您不必使用基本规则,例如printf,但也可以直接将字符发送到串行接口,也可以调用OS函数将字符发送到stdout

典型的场景是裸金属(即没有成熟的操作系统)嵌入式系统。他们通常不需要打印字符,而是用脚踏LED,控制电机,通过监控数字输入来检测按钮等等。

正如其他人已经提到的,操作系统是另一个例子。显然,您不能期望操作系统可以用于操作系统--没有海龟一直往下走

票数 2
EN

Stack Overflow用户

发布于 2015-10-21 17:18:48

我对此感到困惑,在没有执行环境的情况下,我如何执行程序?

“宿主”基本上意味着有一个操作系统作为基础。然而,鉴于目标C的目的,要求一个目标可能非常有限。考虑许多微控制器或实时系统:唯一运行的程序是您编写的程序,因此没有任何限制;这就是为什么据说它是独立的。

就像N1124自己说的(强调我的)

在一个独立的环境中(在这个环境中,C程序可以在没有操作系统的任何benefit的情况下执行)

这是否意味着托管环境是不必要的,而独立环境则是必要的呢?

该标准定义了C代码将在其上运行的两种环境类型以及它们的需求。独立环境的要求低于宿主环境:这可能意味着某些特性可能不可用,而在托管环境中则相反,这意味着有一个特性是“必要的”。

票数 2
EN

Stack Overflow用户

发布于 2015-11-01 02:42:42

独立环境用于运行程序,这些程序通常与许多程序遇到的情况完全不同。下面是一个很小但有效的C程序的例子,如果编译用于许多PIC处理器,例如PIC 16C84,它可以执行一个有用的功能,它提供了独立的环境。

代码语言:javascript
复制
// Example of a program for a free-standing environment
int main(void)
{
  unsigned char a;
  ((unsigned char volatile*)0x86) = 3; // Set port B0 and B1 to output
  a=0;
  while(1)
  {
    ((unsigned char volatile*)0x6) |= 1; // Output high on B0
    ((unsigned char volatile*)0x6) &= ~1; // Output low on B0
    a&=127;
    b=++a;
    do
    {
      ((unsigned char volatile*)0x6) |= 2; // Output high on B1
      ((unsigned char volatile*)0x6) &= ~2; // Output low on B1
    } while(--b);
  }
}

如果要编译这个程序并将结果文件输入设备程序员,这将导致设备在任何时候打开电源,在pin B0上输出一个脉冲,然后在B1上输出一个脉冲,然后在B0上输出一个脉冲,在B1上输出一个脉冲,在B0上输出一个脉冲,在B1上输出三个脉冲,在B1上最多输出128个脉冲,然后这个模式就会重复。

上面的程序不会被任何类型的操作系统启动--有1024条指令和36字节RAM的存储空间,没有足够的空间。相反,处理器将将控制转移到一个小型编译器生成的初始化例程中,该程序清除RAM,然后跳转到main,后者必须从此不再返回。但是,缺少操作系统并不是问题,因为程序所需要做的就是摆动几个I/O引脚,它可以通过写入与这些引脚相关的地址来做到这一点。

实际上,我不会使用端口地址编写代码,而是使用编译器提供的头文件来定义所有I/O寄存器的名称,但是没有它们,代码是有效的。有趣的是,上面的代码不会为其I/O调用任何库函数(或为此调用任何函数),因为硬件将通过更改某些输出引脚的条件来响应写入地址0x86和0x06的尝试,这就是所有这些应用程序所需要的。除了编译器生成的启动代码的不到十几条指令之外,整个系统中唯一的代码将是从上面的C生成的机器代码(大约16条指令)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33264887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档