[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
всё дело как я понял в наличии логического и физическоко адресов памяти в интелах. соотв. тебе нужно сопоставить логическому адресу (который используется процессором) физический.
я пробовал 2 пути:
1.builder c + numega driver studio - далает драйвер который в конечном счёте и отдаёт тебе указатель на память.
но винды для меня громоздко (я железом в основном), а посему
2.djgpp gnu c (www.djgpp.org) - на вид как borland c 3.1 но gnuтый +++
(спасибо ИгорьК в своё время)
буквально сегодня ваял - вот пример (под djgpp):
#include "dpmi.h"
#include "go32.h"
const unsigned long total_interface_size_in_bytes = (16l*1024l);//0x00ffffff;
const unsigned long board_base_addr = 0xe7000000;
int selector;
unsigned long data = 0;
unsigned long i;
main()
{
__dpmi_meminfo MABuffer; //Buffer with all your info...
MABuffer.size = total_interface_size_in_bytes;
MABuffer.address = board_base_addr; //That's what you want, right?
//Replace MABuffer.address with an equivalent linear address.
__dpmi_physical_address_mapping(&MABuffer);
//Set up your selector to point to this buffer
/*The physical region 0xF0000000 is now mapped into linear, protected
memory and now you've got a selector to access it*/
selector = __dpmi_allocate_ldt_descriptors(1);
__dpmi_set_segment_base_address(selector, MABuffer.address);
__dpmi_set_segment_limit(selector, MABuffer.size-1);
//Here's your code that uses the selector to access your PCI card (use
data=0xffffffff;
_farpokel (selector, 0, data); // пишем данные в устройство
i=_farpeekl(selector, 0); // читаем данные из устройства
printf("\nTest reg's read %08lX test",i);
__dpmi_free_ldt_descriptor(selector);
//Free the selector at the end.
}
E-mail: info@telesys.ru