在ARM板上安装操作系统?调用端口地址会映射到真实地址还是虚拟地址?

时间:2016-04-29 11:46:57

标签: c linux arm kernel embedded

我打算将操作系统放在ARM主板上,以获得内存管理,文件系统等额外设施 例如,如果我想要写一个值到端口x闪烁led我可以写(int *)0x00458 = 1没有操作系统。但如果使用OS,如果我写相同(int *)0x00458 = 1 内存将是用户空间虚拟内存或实际内存地址 对不起,我不知道如何表达我的问题,原谅我 我的目标是将OS放在我的ARM板上并使用驱动程序库编写LED闪烁程序。

2 个答案:

答案 0 :(得分:0)

这取决于操作系统,使用linux,您可以使用mmap来请求操作系统为您绘制一个带有权限的漏洞,从应用层到该物理地址。

Windows有I / O的赠品,可能是一种编写内核驱动程序以通过内存映射I / O进行打孔的方法。

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

答案 1 :(得分:0)

因为你想把1写入内存这个(int *)0x00458 = 1是不正确的。

你必须使用

*(volatile int*)0x00458=1 

写入记忆:
使用volatile来防止编译器优化你的代码。

用于在端口地址0x65上对LED进行blibk,例如:

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

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