I3MPS_Opgave12

=Implementering af GPIO Driver= I denne opgave skal vi implementere en driver i user space, og mappe den sammen med hardwaren ved hjælp af mmap. Driveren bliver implementeret så en række GPIO porte bliver sat høj, vente et sekund, og så sat lav igen. Driveren er implementeret som nedenfor. code format="cpp"
 * 1) include 
 * 2) include 
 * 3) include 
 * 4) include 
 * 5) include 
 * 6) include 
 * 7) include 


 * 1) define MAP_SIZE 4096UL
 * 2) define MAP_MASK (MAP_SIZE - 1)

int main(void) {   int fd; int GPIO_OE = 0x49056034; int GPIO_DOUT = 0x4905603C; void *map_base, *virtual_addr;

if((fd = open("/dev/mem", O_RDWR)) == -1) {       printf("Unable to open /dev/mem\n"); exit(1); }

map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_OE & ~MAP_MASK);

if(map_base == (void*) -1) {       printf("Unable mapping map_base failed\n"); exit(1); }

virtual_addr = map_base + (GPIO_OE & MAP_MASK); *(unsigned long *) virtual_addr = 0xFFFFFF0F;

printf("Setting GPIO High\n"); *(unsigned long *) virtual_addr = 0x000000F0;

sleep(1);

printf("Setting GPIO Low\n"); *(unsigned long *) virtual_addr = 0x00000000;

munmap(map_base, MAP_SIZE); close(fd);

return 0; } code Ved test med voltmeter, kan det ses at porten først bliver høj, og derefter går lav.

=Scheduler= I Linux er det muligt at bruge en scheduler til at prioritere hvilke processer der skal have lov til at køre. Her tester vi de forskellige indstillinger vi har mulighed for og ser hvilke resultater disse giver. Programmet giver efter endt afvikling værdien worst, som beskriver hvor hurtigt indskiftningen virker.

VI kan her se at SCHED_FIFO er den langsomste og SCHED_RR er den hurtigste.
 * || Beskrivelse || Worst Latency ||
 * SCHED_OTHER || The standard round-robin time-sharing policy. || 5325719 ||
 * SCHED_FIFO || A first-in, first-out policy. || 11323177 ||
 * SCHED_RR || A round-robin policy. || 462669 ||