Как читать и записывать в аппаратные регистры с использованием C #? - PullRequest
4 голосов
/ 10 августа 2011

У меня нет абсолютно никакого опыта или знаний относительно аппаратных регистров и как взаимодействовать с ними через код. Однако мой текущий проект на C # требует, чтобы я считывал температуру с микросхемы на SMBus, и я думаю, что мне придется испачкать руки. Если вы хотите знать, датчик температуры Winbond W83793G.

Мне предстоит пройти долгий путь, но я начал с просмотра этого документа на странице 5: smbus.org/specs/smbb10.pdf

Кажется, первым шагом к выполнению моей задачи является запись в следующие аппаратные регистры: AX, BH, BL, CH, CL и чтение возвращаемых значений из следующих: Carry, AH, AL, BL, CH, CL, DX. Используя это, я могу определить, доступен ли «SMBus BIOS Interface». Что еще более важно, если мне удастся справиться с этим в C #, я смогу проследить остальную часть документации, чтобы в конечном итоге прочитать ее с Winbond W83793G и извлечь нужные мне значения из датчиков температуры. И нет, OpenHardwareMonitor в настоящее время не поддерживает SMBus, поэтому я не могу обратиться к нему за кодом.

Итак, мой основной вопрос: каков простой и эффективный способ чтения и записи в аппаратные регистры с использованием C #?

И, кроме того, если бы вы могли оставить отзыв о моей конкретной проблеме чтения с чипа, это было бы бонусом для меня, и я был бы очень признателен!

Ответы [ 3 ]

7 голосов
/ 10 августа 2011

C # - это управляемый язык, работающий на виртуальной машине. Он работает на различных платформах. У него нет встроенной концепции аппаратных регистров.

Вам потребуется использовать языки программирования низкого уровня для написания кода для доступа к аппаратным регистрам.

Если этот код скомпилирован в DLL-файлы Windows, вы можете обернуть этот код в C # путем доступа к неуправляемым DLL-файлам с помощью PInvoke.

4 голосов
/ 11 августа 2011

Не поддерживается, возможно, опасно и потенциально неразумно, но возможно:

Вы можете (или в какой-то момент могли) встроить встроенный код сборки x86 в c #. Пример одного способа сделать это :

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);
    }
    }
}

Также еще один вопрос о x86 в .NET задал некоторое время назад .

3 голосов
/ 10 августа 2011

Вы не можете записывать в аппаратные регистры на управляемом языке, таком как C #. Возможно, вам придется использовать C или ассемблер. Чип, вероятно, будет поставляться с devkit и инструкциями по его программированию.

...