为什么vxWorks中没有main()函数?

发布于 2024-07-04 16:14:23 字数 74 浏览 3 评论 0原文

当使用vxWorks作为开发平台时,我们无法使用标准的main()函数来编写我们的应用程序。 为什么我们不能有一个 main 函数?

When using vxWorks as a development platform, we can't write our application with the standard main() function. Why can't we have a main function?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

初熏 2024-07-11 16:14:23

6.0版本之前仅限VxWorks
支持任务的内核执行环境,不支持
进程,这是传统的应用程序执行环境
在 Unix 或 Windows 等操作系统上。 任务有一个入口点,即
作为任务执行的代码的地址。 该地址对应于
C 或汇编函数。 它可以是一个名为“main”的符号,但有
关于 main() 函数的 C/C++ 语言假设不是
内核环境支持(特别是传统的
argc 和 argv 参数的处理)。 此外,在此之前
VxWorks 6.0,所有任务都执行内核代码。 你可以想象内核
作为所有链接在一起的公共代码存储库,然后您会看到
你不能有多个同名的符号(“main”),因为
这会造成名称冲突。

现在,只有当您将应用程序代码链接到
内核映像。 如果您要下载应用程序代码,那么
模块加载器将接受加载多个模块,每个模块都有一个 main()
常规。 然而,系统中注册的最后一个“主要”符号
符号表是唯一可以通过目标 shell 访问的表。 如果
您想要启动执行第一个加载的任务之一的代码的任务
您必须使用先前 main() 的地址的模块
功能。 这是可能的,但不方便。 还远不止于此
为任务的入口点赋予不同的名称是可行的(可能是
就像“xxxStart”,其中“xxx”是对任务有意义的名称
应该做的)。

从VxWorks 6.0开始,操作系统支持进程环境。 这
意味着,除其他外,您可以拥有传统的 main()
例程及其 argc 和 argv 参数得到正确处理,
并且应用程序代码在上下文(用户上下文)中执行
这与内核上下文不同,从而确保
应用程序代码(可能很不稳定)和内核之间的隔离
代码(不应该是片状的)。
软垫

Before the 6.0 version VxWorks only
supported kernel execution environment for tasks and did not support
processes, which is the traditional application execution environment
on OS like Unix or Windows. Tasks have an entry point which is the
address of the code to execute as a task. This address corresponds to
a C or assembly function. It can be a symbol named "main" but there
are C/C++ language assumptions about the main() function that are not
supported in the kernel environment (in particular the traditional
handling of the argc and argv parameters). Furthermore, prior to
VxWorks 6.0, all tasks execute kernel code. You can picture the kernel
as a common repository of code all linked together and then you'll see
that you cannot have several symbols of the same name ("main") since
this would create name collisions.

Now this is accurate only if you link your application code to the
kernel image. If you were to download your application code then the
module loader will accept to load several modules each with a main()
routine. However the last "main" symbol registered in the system
symbol table is the only one you can access via the target shell. If
you want to start tasks executing the code of one of the first loaded
modules you'd have to use the addresses of the previous main()
function. This is possible but not convenient. It is far more
practical to give different names to the entry points of tasks (may be
like "xxxStart" where "xxx" is a name meaningful for what the task is
supposed to do).

Starting with VxWorks 6.0 the OS supports a process environment. This
means, among many other things, that you can have a traditional main()
routine and that its argc and argv parameters are properly handled,
and that the application code is executing in a context (user context)
which is different from the kernel context, thus ensuring the
isolation between application code (which can be flaky) and kernel
code (which is not supposed to be flaky).
PAD

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文