我完全没有关于硬件寄存器以及如何通过代码与它们交互的经验或知识。然而,我目前的C#项目需要我从SMBus上的芯片上读取温度,我想我必须亲自动手。如果你想知道,温度传感器是永邦W83793G。
我还有很长的路要走,但我已经从第5页上的文档开始: smbus.org/specs/smbb10.pdf
完成任务的第一步似乎是写入以下硬件寄存器: AX、BH、BL、CH、CL,并从以下寄存器读取返回值:进位、AH、AL、BL、CH、CL、DX。使用它我可以确定'SMBus基本输入输出系统接口‘是否可用。更重要的是,如果我可以在C#中处理这些内容,我就可以按照文档的其余部分进行操作,最终从Winbond W83793G中读取数据,并从温度传感器中提取我想要的值。不,OpenHardwareMonitor目前不支持SMBus,所以我不能在代码中引用它。
总之,我的基本问题是:使用C#读取和写入硬件寄存器的一种简单、有效的方法是什么?
另外,如果你能就我从芯片上读取的具体问题提供任何反馈,这对我来说是一个额外的奖励,我将非常感激!
发布于 2011-08-11 03:37:24
C#是在虚拟机中运行的托管语言。它可以在各种平台上运行。它没有内置硬件寄存器的概念。
您需要使用低级编程语言来编写访问硬件寄存器的代码。
如果这段代码被编译成windows,那么您可以通过使用PInvoke访问非托管dll来将这段代码包装在C#中。
发布于 2011-08-11 04:00:12
不受支持,可能是危险的,也可能是不明智的,但它是可能的:
您可以(或者在某些时候可以)将内联x86汇编代码嵌入到c#中。Example of one way of doing it
using System;
using System.Reflection;
class Program
{
public delegate uint Ret1ArgDelegate(uint arg1);
static uint PlaceHolder1(uint arg1) { return 0; }
public static byte[] asmBytes = new byte[]
{
0x89,0xD0, // MOV EAX,EDX
0xD1,0xC8, // ROR EAX,1
0xC3 // RET
};
unsafe static void Main(string[] args)
{
fixed(byte* startAddress = &asmBytes[0]) // Take the address of our x86 code
{
// Get the FieldInfo for "_methodPtr"
Type delType = typeof(Delegate);
FieldInfo _methodPtr = delType.GetField("_methodPtr", BindingFlags.NonPublic | BindingFlags.Instance);
// Set our delegate to our x86 code
Ret1ArgDelegate del = new Ret1ArgDelegate(PlaceHolder1);
_methodPtr.SetValue(del, (IntPtr)startAddress);
// Enjoy
uint n = (uint)0xFFFFFFFC;
n = del(n);
Console.WriteLine("{0:x}", n);
}
}
}Also, another question about x86 in .NET asked a while back。
发布于 2011-08-11 03:35:20
你不能用像C#这样的托管语言写硬件寄存器。您可能需要使用C或汇编程序。芯片可能会附带一个开发工具包和如何对其编程的说明。
https://stackoverflow.com/questions/7016674
复制相似问题