Hejka. Mam mały problem. Dotyczy on kodu w języku C.
Kod:
#include <linux/module.h>
#include <linux/kfifo.h>
#define NUMBER_OF_ELEMENTS 16
static struct kfifo kolejka;
int i;
u32 wartosc;
unsigned int rozmiar, dl;
static int __init fifoinit(void)
{
int w1;
pr_notice("_________________________________________________________");
w1=kfifo_alloc(&kolejka,NUMBER_OF_ELEMENTS*sizeof(wartosc),GFP_KERNEL);
if(w1) {
pr_alert("Blad alokowania!\n");
return -ENOMEM;
}
while(!kfifo_is_full(&kolejka)){
for(i=1; i<=5; i++){
wartosc=i;
kfifo_in(&kolejka,&wartosc,sizeof(wartosc));
}
}
rozmiar=kfifo_size(&kolejka);
dl=kfifo_len(&kolejka);
pr_notice("rozmiar kolejki: %u, zajete miejsce: %u\n",rozmiar,dl);
pr_notice("wartosc: %u", wartosc);
kfifo_out(&kolejka,&wartosc,sizeof(wartosc));
while(!kfifo_is_full(&kolejka))
{
for(i=6; i<=16; i++) {
wartosc=i;
kfifo_in(&kolejka,&wartosc,sizeof(wartosc));
}
}
return 0;
}
static void __exit fifoexit(void)
{
rozmiar=kfifo_size(&kolejka);
dl=kfifo_len(&kolejka);
pr_notice("rozmiar kolejki: %u, zajete miejsce: %u\n",rozmiar,dl);
for(i=1;i<=16;i++){
pr_notice("element %i: %u",i,wartosc);
kfifo_out(&kolejka,&wartosc,sizeof(wartosc));
}
kfifo_free(&kolejka);
}
module_init(fifoinit);
module_exit(fifoexit);
Włączając program na maszynie wirtualnej, błędów w kodzie nie ma, ale wyświetla się niepoprawnie. To znaczy... że wyświetla się wszystko w kolejce w taki sposób, jak poniżej. Jednakże, nie wiem, jak zmienić pierwszy element, żeby nie wyświetlało "16", tylko "1"? To pewnie jakaś drobnostka, której niestety nie widzę... To są wyniki
- element 1: 16
- element 2: 3
- element 3: 4
- element 4: 5
- element 5: 6
- element 6: 1
- element 7: 2
- element 8: 3
- element 9: 4
- element 10: 5
- element 11: 6
- element 12: 1
- element 13: 2
- element 14: 3
- element 15: 4
- element 16: 5
- Rozmiar kolejki: 64, zajęta pamięć 64
Polecenie do tego kodu brzmi:
Napisać moduł, który tworzy kolejkę FIFO dla liczb 32 bitowych bez znaku. Maksymalny rozmiar kolejki to 16 elementów. W szczególności należy:
- Podczas inicjowania modułu dodać do kolejki 5 elementów (każdy ma otrzymać kolejny numer porządkowy od 1 do 5), następnie wyświetlić rozmiar kolejki (całkowity) i ilość zajętego miejsca, usunąć jeden element (przed usunięciem wydrukować go) i dodać 15 kolejnych (kontynuując numerację - czyli zacząć od 6).
- W funkcji usuwającej moduł: wyświetlić rozmiar kolejki (całkowity) i ilość zajętego miejsca. Usunąć wszystkie elementy wyświetlając podczas usuwania ich wartości. Usunąć kolejkę.
- Przeanalizować logi systemowe. Zinterpretować wyniki szczególnie dotyczące rozmiaru kolejki (całkowitego) i ilości zajętego miejsca.
Będę bardzo wdzięczna za wskazanie błędu w moim kodzie. :)