我计划在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相位重新映射地址,你必须找到新的地址,这个指令将再次是正确的。有关操作系统的详细信息,您可以阅读操作系统文档。希望这能有所帮助。