c-操作系统何时安装在ARM板上?调用端口的地址将映射到真实地址或虚拟地址



我计划在ARM板上安装操作系统,以获得额外的功能,如内存管理、文件系统等。
例如,如果我想将一个值写入端口x以闪烁led,我可以在没有OS的情况下写入(int*)0x00458=1。但是如果用OS如果我写相同的(int*)0x00458=1
存储器将是用户空间虚拟存储器或实际存储器地址
对不起,我不知道该怎么表达我的问题,对不起
我的目标是将操作系统放在我的ARM板上,并使用驱动程序库编写LED闪烁程序。

这取决于操作系统,在linux中,您可以使用mmap要求操作系统为您映射一个具有权限的洞,以便从应用层穿透到该物理地址。

Windows提供了I/O,很可能是编写内核驱动程序的一种方式,用于通过内存映射I/O进行打孔。

它严重依赖于操作系统,因此您必须查看您的操作系统。您标记了linux,所以从mmap开始,应该已经有一些关于如何在stackoverflow答案中做到这一点的例子了。和其他地方一样,只需要几行代码就可以获得指针(注意,要求0x10000000字节这样的较大空间比0x1000字节更有可能获得指针)。

由于要将1写入内存,因此(int*)0x00458=1不正确。

您必须使用

*(volatile int*)0x00458=1 

在内存中写入:
使用volatile来防止编译器优化您的代码。

这用于闪烁端口地址0x65上的LED,例如:

#include <stdint.h>
while (1)
{
    //PORTG^=1;
    *(volatile uint32_t*)0x65 ^= 1;
    //delay
}

无论是否有操作系统,此指令都将编译为正确的汇编代码。os的唯一注意事项是:如果你的ARM CPU相位重新映射地址,你必须找到新的地址,这个指令将再次是正确的。有关操作系统的详细信息,您可以阅读操作系统文档。希望这能有所帮助。

最新更新